56pts,求条
查看原帖
56pts,求条
1127936
C6H12O6_n楼主2024/12/26 21:01
#include<bits/stdc++.h>
#define int long long
using namespace std;
void testread(){
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
}
int x[200010],y[200010];
char c[200010];
int dir[1010][1010];
int ach[1010][1010];
int n,q;
int f[1010][1010];
inline int dfs(int x,int y){
    if(x<1||x>n||y<1||y>n)return 1;
    if(ach[x][y]!=-1)return ach[x][y];
    if(f[x][y]){
        ach[x][y]=0;
        return 0;
    }
    f[x][y]=1;
    bool res=0;
    if(dir[x][y]==1)res=dfs(x,y-1);//x,y+1
    if(dir[x][y]==2)res=dfs(x,y+1);//x,y-1
    if(dir[x][y]==3)res=dfs(x-1,y);//x+1,y
    if(dir[x][y]==4)res=dfs(x+1,y);//x-1,y
    if(dir[x][y]==5)res=(dfs(x-1,y)||dfs(x+1,y))||(dfs(x,y-1)||dfs(x,y+1));
    ach[x][y]=res;
    f[x][y]=0;
    return res;
}
int sum=0;
inline void dfs2(int x,int y){
    if(x<1||x>n||y<1||y>n)return;
    //cout<<x<<' '<<y<<endl;
    if(ach[x][y]==1)return;
    ach[x][y]=1;
    sum++;
    if(dir[x][y+1]==1||dir[x][y+1]==5)dfs2(x,y+1);
    if(dir[x][y-1]==2||dir[x][y-1]==5)dfs2(x,y-1);
    if(dir[x+1][y]==3||dir[x+1][y]==5)dfs2(x+1,y);
    if(dir[x-1][y]==4||dir[x-1][y]==5)dfs2(x-1,y);
    return;
}
int ans[500010];
signed main(){
    testread();
    int t=1;
    while(t--){
        cin>>n>>q;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                dir[i][j]=5;
            }
        }
        for(int i=1;i<=q;i++){
            cin>>x[i]>>y[i]>>c[i];
            if(c[i]=='L')dir[x[i]][y[i]]=1;
            if(c[i]=='R')dir[x[i]][y[i]]=2;
            if(c[i]=='U')dir[x[i]][y[i]]=3;
            if(c[i]=='D')dir[x[i]][y[i]]=4;
        }
        memset(ach,-1,sizeof ach);
        for(int i=1;i<=n;i++)ach[i][0]=ach[i][n+1]=1;
        for(int i=0;i<=n+1;i++)ach[0][i]=ach[n+1][i]=1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                ach[i][j]=dfs(i,j);
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(ach[i][j]==1)sum++;
            }
        }
        ans[q]=n*n-sum;
        for(int i=q;i>=1;i--){
            dir[x[i]][y[i]]=5;
            dfs2(x[i],y[i]);
            ans[i-1]=n*n-sum;
            //cout<<endl;
        }
        for(int i=1;i<=q;i++)cout<<ans[i]<<'\n';
    }
    return 0;
}

1~7点,10点通过,其他全都WA了

2024/12/26 21:01
加载中...