Submission #1145604

#TimeUsernameProblemLanguageResultExecution timeMemory
1145604hirayuu_ojVirus Experiment (JOI19_virus)C++20
0 / 100
1 ms576 KiB
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); i++)
#define rng(i,l,r) for(int i=(l); i<(r); i++)
#define all(x) x.begin(),x.end()
using ll=long long;

void dfs(vector<vector<int>> &gr,vector<int> &memo,int &cnt,int pos){
    memo[pos]=-2;
    for(int i:gr[pos]){
        if(memo[i]==-1)dfs(gr,memo,cnt,i);
    }
    memo[pos]=cnt;
    cnt++;
}
//Sが全部同じ文字のときバケモンじゃない?
int main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);
    int M,R,C;
    cin>>M>>R>>C;
    string S;
    cin>>S;
    S=S+S;
    vector<vector<int>> U(R,vector<int>(C,0));
    rep(i,R){
        rep(j,C){
            cin>>U[i][j];
        }
    }
    vector<vector<int>> gr(R*C);
    vector<vector<int>> rev(R*C);
    vector<int> invalid(R*C,0);
    rep(i,R){
        rep(j,C){            
            if(U[i][j]==0){
                invalid[i*C+j]=1;
                continue;
            }
        }
    }
    string dir="NWSE";
    rep(i,4){
        int cnt=0;
        int mx=0;
        rep(j,M*2){
            if(S[j]==dir[i]){
                cnt++;
            }
            else{
                cnt=0;
            }
            mx=max(mx,cnt);
        }
        if(cnt==M*2)mx=998244353;
        rep(j,R){
            rep(k,C){
                if(U[j][k]==0){
                    continue;
                }
                if(dir[i]=='N'&&j==0)continue;
                if(dir[i]=='S'&&j==R-1)continue;
                if(dir[i]=='W'&&k==0)continue;
                if(dir[i]=='E'&&k==C-1)continue;
                int nxt=j*C+k;
                if(dir[i]=='N')nxt-=C;
                if(dir[i]=='S')nxt+=C;
                if(dir[i]=='W')nxt-=1;
                if(dir[i]=='E')nxt+=1;
                if(invalid[nxt])continue;
                if(U[j][k]<=mx){
                    gr[nxt].push_back(j*C+k);
                    rev[j*C+k].push_back(nxt);
                }
            }
        }
    }
    int cnt=0;
    vector<int> memo(R*C,-1);
    rep(i,R*C){
        if(invalid[i])continue;
        if(memo[i]!=-1)continue;
        dfs(gr,memo,cnt,i);
    }
    int scc=0;
    vector<int> grp(R*C,-1);
    vector<pair<int,int>> order;
    rep(i,R*C){
        if(invalid[i])continue;
        order.emplace_back(memo[i],i);
    }
    sort(all(order));reverse(all(order));
    for(auto&[_,i]:order){
        if(grp[i]!=-1)continue;
        stack<int> vert;
        vert.push(i);
        grp[i]=scc;
        while(!vert.empty()){
            int pos=vert.top();
            vert.pop();
            for(auto j:rev[pos]){
                if(grp[j]==-1){
                    grp[j]=scc;
                    vert.push(j);
                }
            }
        }
        scc++;
    }
    vector<int> valid(scc,1);
    vector<int> ccnt(scc,0);
    rep(i,R*C){
        if(invalid[i])continue;
        ccnt[grp[i]]++;
        cout<<grp[i]<<" ";
        for(int j:gr[i]){
            if(grp[i]!=grp[j])valid[grp[i]]=0;
        }
    }
    int mn=998244353;
    rep(i,scc){
        if(valid[i])mn=min(mn,ccnt[i]);
    }
    cout<<mn<<"\n";
    int ans=0;
    rep(i,scc){
        if(valid[i]&&ccnt[i]==mn)ans+=mn;
    }
    cout<<ans<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...