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...