Submission #1226726

#TimeUsernameProblemLanguageResultExecution timeMemory
1226726noyancanturkBoard Game (JOI24_boardgame)C++20
17 / 100
41 ms6760 KiB
#include<bits/stdc++.h> using namespace std; #define int int64_t #define pb push_back #define dbg(c) for(int i=1;i<=n;i++)cerr<<c[i]<<' ';cerr<<'\n'; using pii=pair<int,int>; const int lim=5e4+100; vector<int>v[lim]; int stop[lim]; int fakedist[lim]; int baddist[lim],gooddist[lim]; int dist[lim],ans[lim]; signed main(){ int n,m,k; cin>>n>>m>>k; for(int i=0;i<m;i++){ int x,y; cin>>x>>y; v[x].pb(y); v[y].pb(x); } string s; cin>>s; for(int i=0;i<n;i++)stop[i+1]=s[i]-'0'; deque<int>q; for(int i=1;i<=n;i++){ fakedist[i]=INT_MAX; if(stop[i]){ fakedist[i]=0; q.pb(i); } } while(q.size()){ int node=q.front(); q.pop_front(); for(int j:v[node]){ if(fakedist[j]==INT_MAX){ fakedist[j]=fakedist[node]+1; q.pb(j); } } } for(int i=1;i<=n;i++){ baddist[i]=INT_MAX; for(int j:v[i]){ if(fakedist[j]!=INT_MAX){ baddist[i]=min(baddist[i],fakedist[j]+1); } } } for(int i=1;i<=n;i++){ fakedist[i]=INT_MAX; if(!stop[i])continue; for(int j:v[i]){ if(stop[j]){ fakedist[i]=0; q.pb(i); break; } } } while(q.size()){ int node=q.front(); q.pop_front(); for(int j:v[node]){ if(fakedist[j]==INT_MAX){ if(stop[j]){ fakedist[j]=fakedist[node]; q.push_front(j); }else{ fakedist[j]=fakedist[node]+1; q.pb(j); } } } } for(int i=1;i<=n;i++){ gooddist[i]=INT_MAX; for(int j:v[i]){ if(fakedist[j]!=INT_MAX){ gooddist[i]=min(gooddist[i],fakedist[j]+1); } } } int a[k]; for(int i=0;i<k;i++){ cin>>a[i]; } for(int i=1;i<=n;i++)dist[i]=ans[i]=INT_MAX; dist[a[0]]=ans[a[0]]=0; q.pb(a[0]); unordered_set<int>changed; while(q.size()){ int node=q.front(); q.pop_front(); for(int j:v[node]){ if(dist[j]==INT_MAX){ dist[j]=dist[node]+1; ans[j]=dist[j]; if(stop[j]){ changed.insert(j); }else{ q.pb(j); } } } } if(!changed.size()){ for(int i=1;i<=n;i++)cout<<ans[i]<<'\n'; return 0; } int torem[n+1]{}; int base=0,inc=0; for(int i=1;i<k;i++){ base+=baddist[a[i]]; inc+=2; if(gooddist[a[i]]!=INT_MAX)torem[gooddist[a[i]]-baddist[a[i]]]++; } for(int i=0;i<=n;i++){ priority_queue<pii,vector<pii>,greater<pii>>pq; for(int j:changed)pq.push({dist[j],j}); changed.clear(); while(pq.size()){ auto[ds,node]=pq.top(); pq.pop(); if(ds!=dist[node])continue; for(int j:v[node]){ if(ds+1<dist[j]){ dist[j]=ds+1; ans[j]=min(ans[j],dist[j]+base); if(stop[j]){ changed.insert(j); }else{ pq.push({dist[j],j}); } } } } inc-=torem[i]; base+=inc; } for(int i=1;i<=n;i++){ cout<<ans[i]<<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...