ARC107 E - Mex MatA(打表找规律)

题意:

在这里插入图片描述

解法:

打表找规律,
发现当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{
    
    //x=0
        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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/115264099
Mex
今日推荐