题意:
解法:
打表找规律,
发现当i和j都>4时,a[i][j]=a[i-1][j-1].
那么我们只需要计算出i和j其中至少有一个<=4的格子,
即前4行和前4列,其他地方可以O(1)计算.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=5e5+5;
unordered_map<int,int>a[maxm];
int n;
int mex(int x,int y){
if(x>y)swap(x,y);
if(x!=0)return 0;
else{
if(y==0)return 1;
else if(y==1)return 2;
else return 1;
}
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[1][i];
}
for(int i=2;i<=n;i++){
cin>>a[i][1];
}
for(int i=2;i<=4&&i<=n;i++){
for(int j=2;j<=n;j++){
a[i][j]=mex(a[i-1][j],a[i][j-1]);
}
}
for(int i=4;i<=n;i++){
for(int j=2;j<=4&&j<=n;j++){
a[i][j]=mex(a[i-1][j],a[i][j-1]);
}
}
int ans[3]={
0};
for(int i=1;i<=4&&i<=n;i++){
for(int j=1;j<=n;j++){
ans[a[i][j]]++;
}
}
for(int i=5;i<=n;i++){
for(int j=1;j<=4&&j<=n;j++){
ans[a[i][j]]++;
}
}
for(int i=5;i<=n;i++){
ans[a[i][4]]+=min(n-4,n-i);
ans[a[4][i]]+=min(n-4,n-i);
}
if(n>=4){
ans[a[4][4]]+=n-4;
}
for(int i=0;i<3;i++){
cout<<ans[i]<<' ';
}
cout<<endl;
}
signed main(){
solve();
return 0;
}