D. Matrix Cascade

纯粹的發表於2024-06-14

原題連結

題解

對某一片區域+1-1等操作,二維差分,注意每一維的含義和往下一維轉移的細節就行了

code

#include<bits/stdc++.h>
using namespace std;

int wave1[3005]={0},wave2[3005]={0};
int sum[3005]={0};
string s[3005];

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>s[i];
            s[i]=' '+s[i];
        }

        int ans=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                sum[j]=sum[j-1]+wave1[j]-wave2[j];
            }
            for(int j=1;j<=n;j++)
            {
                if(sum[j]%2!=s[i][j]-'0')
                {
                    ans++;
                    wave1[j]++;
                    wave2[j+1]++;
                }
            }

            wave1[1]+=wave1[2];
            for(int j=2;j<n;j++) wave1[j]=wave1[j+1];
            wave1[n]=0;

            for(int j=n;j>1;j--) wave2[j]=wave2[j-1];
            wave2[1]=0;
        }
        cout<<ans<<"\n";
        for(int i=1;i<=n+1;i++)//n+1主要是為了清空wave2
        {
            wave1[i]=0;
            wave2[i]=0;
        }
    }
    return 0;
}