제출 #1317498

#제출 시각아이디문제언어결과실행 시간메모리
1317498goodpjw2008Board Game (JOI24_boardgame)C++20
17 / 100
31 ms7460 KiB
#include <bits/stdc++.h> #define x first #define y second #define int long long using namespace std; using pii = pair<int,int>; vector<int>v[50005]; int c[50005],type[50005],distfrom1[50005],distfrom2[50005],from[50005],ans[50005],inq[50005]; pii dist[50005]; bool chk[50005]; struct p{ int idx,cnt,val,jump; bool operator<(const p &b)const{ if(val==b.val)return cnt>b.cnt; return val>b.val; } }; struct pp{ int idx,from,val; }; signed main(){ ios::sync_with_stdio(0);cin.tie(0); int n,m,k,x,y,s; string str; cin>>n>>m>>k; for(int i = 0; i < m; i++){ cin>>x>>y; v[x].push_back(y); v[y].push_back(x); } cin>>str>>s; str="0"+str; for(int i = 1; i <= n; i++){ if(str[i]=='1'){ bool f=0; for(int &nx:v[i]){ if(str[nx]=='1'){ f=1; break; } } if(f)type[i]=2; else type[i]=1; } } queue<pp>qq; for(int i = 1; i <= n; i++){ if(type[i]==1){ chk[i]=1; qq.push({i,i,0}); } } if(qq.empty()){ memset(distfrom1,0x3f,sizeof(distfrom1)); } while(!qq.empty()){ pp now=qq.front();qq.pop(); distfrom1[now.idx]=now.val; for(int &nx:v[now.idx]){ if(!chk[nx]){ chk[nx]=1; from[nx]=now.from; qq.push({nx,now.from,now.val+1}); } } } queue<int>q; memset(distfrom2,0x3f,sizeof(distfrom2)); for(int i = 1; i <= n; i++){ if(type[i]==2){ inq[i]=1; q.push(i); distfrom2[i]=0; } } while(!q.empty()){ int now=q.front();q.pop(); inq[now]=0; for(int &nx:v[now]){ if(distfrom2[nx]>distfrom2[now]+(type[now]==1?0:1)){ distfrom2[nx]=distfrom2[now]+(type[now]==1?0:1); if(!inq[nx]){ inq[nx]=1; q.push(nx); } } } } for(int i = 1; i < k; i++){ cin>>x; if(distfrom2[x]>=1e9){ if(!type[x]){ c[1]+=distfrom1[x]; c[2]+=-distfrom1[x]+2; } else{ c[1]+=2; } continue; } if(distfrom1[x]>=1e9){ if(!type[x]){ c[1]+=distfrom2[x]; c[2]+=-distfrom2[x]+1; } else{ c[1]+=1; } continue; } if(!type[x]){ if(distfrom1[x]>=distfrom2[x]){ c[1]+=distfrom2[x]; c[2]+=-distfrom2[x]+1; } else{ int bv=distfrom2[x]; c[1]+=distfrom1[x]; c[2]+=-distfrom1[x]+2; c[min(n+1,2+bv-distfrom1[x])]+=-1; } } else if(type[x]==1){ c[1]+=2; c[distfrom2[x]]+=-1; } else{ c[1]+=1; } } int add=0; for(int i = 1; i <= n; i++){ add+=c[i]; c[i]=add; dist[i]={1e18,1e18}; ans[i]=1e18; } //for(int i = 1; i <= n; i++)cerr<<distfrom1[i]<<' '; //cerr<<'\n'; //for(int i = 1; i <= n; i++)cerr<<distfrom2[i]<<' '; //cerr<<'\n'; //for(int i = 1; i <= n; i++)cerr<<c[i]<<' '; priority_queue<p>pq; pq.push({s,0,0,0}); while(!pq.empty()){ p cur=pq.top();pq.pop(); if(pii{cur.val,cur.cnt}>=pii{dist[cur.idx].x,dist[cur.idx].y})continue; dist[cur.idx]={cur.cnt,cur.val}; ans[cur.idx]=min(ans[cur.idx],cur.val); if(cur.jump)cur.val+=c[cur.cnt]; for(int &nx:v[cur.idx]){ if(type[nx]){ pq.push({nx,cur.cnt+1,cur.val+1,1}); } else{ pq.push({nx,cur.cnt,cur.val+1,0}); } } } 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...