제출 #409760

#제출 시각아이디문제언어결과실행 시간메모리
409760Jasiekstrz장난감 기차 (IOI17_train)C++17
0 / 100
892 ms1380 KiB
#include<bits/stdc++.h> #include "train.h" using namespace std; const int N=5e3; bool ab[N+10]; bool charge[N+10]; vector<int> e[N+10]; bool vis[N+10][2]; bool dp[N+10][2]; bool win[N+10]; int g[N+10]; vector<int> st; void dfs(int x,bool t) { vis[x][t]=true; g[x]=st.size(); st.push_back(x); if(charge[x] && !t) { if(!vis[x][1]) dfs(x,1); dp[x][0]=dp[x][1]; return; } dp[x][t]=!ab[x]; for(auto v:e[x]) { if(g[v]==1) { if(ab[x]==t) { dp[x][t]=ab[x]; break; } else continue; } else if(g[v]!=0) { if(!ab[x]) { dp[x][t]=false; break; } else continue; } if(!vis[v][t]) dfs(v,t); if(dp[v][t]==ab[x]) { dp[x][t]=ab[x]; break; } } g[x]=0; st.pop_back(); return; } void dfsw(int x,int fch) { vis[x][0]=true; g[x]=st.size(); st.push_back(x); if(charge[x]) fch=g[x]; bool sm=false; for(auto v:e[x]) { if(g[v]!=0) { if(g[v]>fch && !ab[x]) sm=true; } else { if(!vis[v][0]) dfsw(v,fch); if(win[v]==ab[x]) sm=true; } } if(!win[x]) win[x]=(sm ? ab[x]:!ab[x]); g[x]=0; st.pop_back(); return; } vector<int> who_wins(vector<int> a,vector<int> r,vector<int> u,vector<int> v) { int n=a.size(),m=u.size(); for(int i=0;i<n;i++) { ab[i]=a[i]; charge[i]=r[i]; } for(int i=0;i<m;i++) e[u[i]].push_back(v[i]); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) vis[j][0]=vis[i][1]=false; dfs(i,0); if(ab[i]) win[i]=dp[i][0]; else win[i]=!dp[i][0]; //cerr<<win[i]<<"\n"; } for(int i=0;i<n;i++) vis[i][0]=vis[i][1]=false; for(int i=0;i<n;i++) { if(!vis[i][0]) dfsw(i,0); } vector<int> ans(n); for(int i=0;i<n;i++) ans[i]=win[i]; return ans; }
#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...