Submission #1280263

#TimeUsernameProblemLanguageResultExecution timeMemory
1280263trandangquangVirus Experiment (JOI19_virus)C++20
100 / 100
136 ms16880 KiB
#include<bits/stdc++.h>
using namespace std;

#define foru(i,a,b) for(int i=(a); i<=(b); ++i)
#define ford(i,a,b) for(int i=(a); i>=(b); --i)
#define rep(i,a) for(int i=0; i<(a); ++i)
#define sz(a) (int)(a).size()
#define all(a) (a).begin(),(a).end()
#define bit(s,i) (((s)>>(i))&1)
#define ii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define ll long long
#define _ << " " <<

template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;}
template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;}

string d="SNWE";
int dx[]={1,-1,0,0};
int dy[]={0,0,-1,1};

const int H=800;

int m,r,c,tim[16],resis[H*H];
int minInf=-1,cntInf;
string s;
vector<ii> edge;

int id(int i, int j){
    return i*c+j;
}
bool inBoard(int x, int y){
    return x>=0 && y>=0 && x<r && y<c;
}
void pr(int x){
    cout<<x/c _ x%c<<'\n';
}

void timeCalc(){
    s=s+s; m=m*2;

    rep(msk,1<<4){
        int cnt=0;
        rep(i,m){
            bool chk=0;
            rep(j,4) if(bit(msk,j) && s[i]==d[j]) chk=1;
            if(chk){
                ++cnt;
            }
            else{
                maxi(tim[msk],cnt);
                cnt=0;
            }
        }
        maxi(tim[msk],cnt);
        if(cnt==m) tim[msk]=1e9;
    }
}

int par[H*H],vis[H*H],cntVis; bool done[H*H];
int find(int x){
    return par[x]==x?x:par[x]=find(par[x]);
}

void bfs(int x){
    queue<int>q;
    q.push(x);

    int num=0;
    vis[x]=++cntVis;
//    if(x==id(2,0))cout<<"ahihi\n";
    while(q.size()){
        int u=q.front(); q.pop(); ++num;
//        if(x==id(2,0))pr(u);
        rep(i,4){
            int vx=u/c+dx[i], vy=u%c+dy[i], v=id(vx,vy);
            if(!inBoard(vx,vy) || vis[v]==cntVis || !resis[v]) continue;
            ll msk=0;
            rep(j,4){
                int wx=vx+dx[j], wy=vy+dy[j], w=id(wx,wy);
                if(!inBoard(wx,wy) || vis[w]!=cntVis) continue;
                msk|=(1<<j);
//                if(u==id(1,0)&&v==id(0,0)) cout<<j _ wx _ wy<<'\n';
            }
            if(tim[msk]>=resis[v]){
                if(find(v)==find(u)){
                    vis[v]=cntVis;
                    q.push(v);
                } else{
                    edge.eb(u,v);
                    return;
                }
            }
        }
    }

    done[x]=true;
    if(minInf==-1 || minInf>num){
        cntInf=num;
        minInf=num;
    } else if(minInf==num){
        cntInf+=num;
    }
}

void mainCalc(){
    iota(par,par+r*c,0);
    while(true){
        rep(i,r*c) if(par[i]==i && resis[i] && !done[i]) bfs(i);//,cerr<<i _ i/c _ i%c<<'\n';
        if(edge.size()==0) break;
        for(auto[x,y]:edge){
//            pr(x);pr(y);cout<<'\n';
            x=find(x);y=find(y);
            par[x]=y;
        }
        edge.clear();
//        break;
    }
}

void solve(){
    cin>>m>>r>>c>>s;
    rep(i,r*c) cin>>resis[i];

    timeCalc();
    mainCalc();
    cout<<minInf<<'\n'<<cntInf<<'\n';
}

int32_t main(){
    #define task "test"
    if(fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
        freopen(task".out","w",stdout);
    }
    cin.tie(0)->sync_with_stdio(0);

    int tc=1; //cin>>tc;
    rep(i,tc){
        solve();
    }
}

Compilation message (stderr)

virus.cpp: In function 'int32_t main()':
virus.cpp:136:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  136 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
virus.cpp:137:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  137 |         freopen(task".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...