• D. Matrix Cascade(结构体记录前面对后面的影响)


    Problem - D - Codeforces

    有一个大小为n×n的矩阵,由0和1组成。行从上到下编号为1到n,列从左到右编号为1到n。交点(x,y)表示第x行和第y列的单元格。

    AquaMoon想将矩阵的所有元素都变为0。在一步操作中,她可以执行以下操作:

     
    

    Plain Text

     
    
    选择一个任意的单元格,假设为(i,j),然后翻转(i,j)中的元素,并翻转(x,y)中的所有元素,其中x>i且x−i≥|y−j|。翻转一个值意味着将其改变为相反值:0变为11变为0

    帮助AquaMoon确定她需要执行的最少步骤数,以将矩阵的所有元素变为0。我们可以证明答案总是存在。 输入

    每个测试包含多个测试用例。第一行包含测试用例的数量t(1≤t≤105)。接下来是测试用例的描述。

    每个测试用例的第一行包含一个整数n(2≤n≤3000)。

    接下来的n行中的第i行包含一个二进制字符串,只包含字符0和1,长度为n。

    保证所有测试用例中n2的总和不超过9000000。 输出

    对于每个测试用例,打印最少的步骤数。 示例 输入 复制

    3
    5
    00100
    01110
    11111
    11111
    11111
    3
    100
    110
    110
    6
    010101
    111101
    011110
    000000
    111010
    001110

    输出 复制

    1

    2

    15

    注意

    在第一个测试用例中,我们可以使用以下方案:

     
    

    Plain Text

     
    
    在单元格(1,3)上执行操作。
    

    显然,初始矩阵的元素并非全部为0,因此至少需要一次操作。因此,答案为1。

    在第二个测试用例中,我们使用以下方案:

     
    

    Plain Text

     
    
    1. 在单元格(3,3)上执行操作;
    2. 在单元格(1,1)上执行操作。

    可以证明,在0或1步内无法将所有元素转换为0,因此答案正好为2。

    题解:

    很有意思的一道题,题意也很容易理解,如果操作一个点,向下一个扇形波范围内都会取反,最优肯定是从上往下,如果是1就操作,但是可能会操作很多次,点又有很多,所以很难去确定当前的状态,

    我们用结构体来记录一个点的状态

    val代表初始的0或1

    u代表此时这个点处于多少波的影响下,如果此时这点处于一些波的影响,那么正下方的点也处于那些波的影响

    l,r代表每个波除了向下传播之外,还会向左下和右下传播。所以记录每个点会替几个波向左下传播,替几个波向右下传播,然后把这两个属性赋给该点左下/右下的点,同时更新被传播的点的u:既然这些点被一些额外的波影响了,那么影响该点的波的数量自然会增加上这些波的数量。

    每个点val +=此时这个点的u,如果%2 == 1要进行操作

    1. #include<iostream>
    2. #include<bits/stdc++.h>
    3. using namespace std;
    4. #define int long long
    5. typedef pair<int,int> PII;
    6. const int N = 5e5 + 10;
    7. struct node
    8. {
    9. int val;
    10. int u;
    11. int l,r;
    12. }a[3004][3004];
    13. void solve()
    14. {
    15. int n;
    16. cin >> n;
    17. for(int i = 1;i <= n;i++)
    18. {
    19. for(int j = 1;j <= n;j++)
    20. {
    21. char c;
    22. cin >> c;
    23. a[i][j] = {0};
    24. a[i][j].val = c - '0';
    25. }
    26. }
    27. int ans = 0;
    28. for(int i = 1;i <= n;i++)
    29. {
    30. for(int j = 1;j <= n;j++)
    31. {
    32. a[i][j].val += a[i][j].u;
    33. if(a[i][j].val%2 == 1)
    34. {
    35. ans++;
    36. a[i][j].u ++;
    37. a[i][j].l++;
    38. a[i][j].r++;
    39. }
    40. a[i + 1][j].u += a[i][j].u;
    41. a[i + 1][j - 1].l += a[i][j].l;
    42. a[i + 1][j - 1].u += a[i][j].l;
    43. a[i + 1][j + 1].r += a[i][j].r;
    44. a[i + 1][j + 1].u += a[i][j].r;
    45. }
    46. }
    47. cout << ans <<"\n";
    48. }
    49. //111011
    50. signed main()
    51. {
    52. int t = 1;
    53. ios::sync_with_stdio(0);
    54. cin.tie(0);
    55. cout.tie(0);
    56. cin >> t ;
    57. while(t--)
    58. {
    59. solve();
    60. }
    61. }
    62. //

  • 相关阅读:
    (附源码)ssm小米购物网站 毕业设计 261624
    小红书保姆级教程 | 2023达人投放怎么做?
    3.5 Makefile的重建
    小白常用几个命令记录
    全向移动机器人运动参数校准
    DAMO-YOLO训练自己的数据集,使用onnxruntime推理部署
    JAVA毕业设计客户关系智能管理系统计算机源码+lw文档+系统+调试部署+数据库
    JAVA大学生兼职管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
    k8s加固 hardening
    Java 框架、库和软件的精选列表(awesome java)
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/132844612