Submission #574618

#TimeUsernameProblemLanguageResultExecution timeMemory
574618definitelynotmeeToy Train (IOI17_train)C++98
27 / 100
998 ms262144 KiB
#include<bits/stdc++.h> #include"train.h" #define ff first #define ss second #define all(x) x.begin(), x.end() using namespace std; using ll = long long; using pii = pair<int,int>; using pll = pair<ll,ll>; template<typename T> using matrix = vector<vector<T>>; std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) { int owned = accumulate(all(a),0); int n = a.size(), m = u.size(); vector<int> resp(n); matrix<int> g(n), rev(n); bool flag = 1; for(int i = 0; i < m; i++){ g[u[i]].push_back(v[i]); rev[v[i]].push_back(u[i]); flag&=v[i] == u[i] || v[i] == u[i]+1; } if(owned == n){ for(int i = 0; i < n; i++){ if(!r[i]) continue; vector<int> reach(n), reachedby(n); auto dfs =[&](int id, auto dfs)->void{ reach[id] = 1; for(int i : g[id]) if(!reach[i]) dfs(i,dfs); }; auto rdfs =[&](int id, auto dfs)->void{ reachedby[id] = 1; for(int i : rev[id]) if(!reachedby[i]) dfs(i,dfs); }; for(int j : g[i]) dfs(j,dfs); for(int j : rev[i]) rdfs(j,rdfs); if(reach[i]){ for(int j = 0; j < n; j++) resp[j]|=reachedby[j]; } } } else if(owned == 0){ for(int i = 0; i < n; i++){ if(r[i]) continue; vector<int> reach(n), reachedby(n); auto dfs =[&](int id, auto dfs)->void{ reach[id] = 1; for(int i : g[id]) if(!reach[i] && !r[i]) dfs(i,dfs); }; auto rdfs =[&](int id, auto dfs)->void{ reachedby[id] = 1; for(int i : rev[id]) if(!reachedby[i]) dfs(i,dfs); }; for(int j : g[i]) if(!r[j])dfs(j,dfs); for(int j : rev[i]) rdfs(j,rdfs); if(reach[i]){ for(int j = 0; j < n; j++) resp[j]|=reachedby[j]; } } for(int& i : resp) i^=1; } else if(flag){ for(int i = n-1; i >= 0; i--){ int t1 = 0, t2 = 0; for(int j : g[i]){ if(j == i) t1 = 1; else if(j == i+1) t2 = 1; } if(a[i]){ if(t2){ resp[i] = resp[i+1]; } if(t1 && r[i]) resp[i] = 1; } else { resp[i] = 1; if(t2){ resp[i] = resp[i+1]; } if(t1 && !r[i]) resp[i] = 0; } } } else { vector<int> power(16,1); for(int i = 1; i < 16; i++) power[i] = power[i-1]*3; matrix<int> can(power[n],vector<int>(n)); auto getbit =[&](int x, int id){ return( x%(power[id]*3)-x%power[id])/power[id]; }; auto solve=[&](int id, int mask, auto solve)->int{ int resp = a[id]^1; for(int i : g[id]){ int newmask = mask; int state = getbit(mask,i); // << id << ' ' << mask << "=>" << i << ":\n"; if(state == 1){ // << 'a' << '\n'; if(!a[id]){ resp = 0; break; } } else if(state == 2){ // << 'b' << '\n'; if(a[id]){ resp = 1; break; } } else { if(r[i]){ for(int j = 0; j < n; j++){ if(getbit(newmask,j) == 1){ newmask+=power[j]; } } newmask+=power[i]*2; } else { newmask+=power[i]; } // << newmask << '\n'; int cur = solve(i,newmask,solve); if(cur == a[id]){ resp = cur; break; } } } // << id << ' ' << mask << " tem resp " << resp << '\n'; return resp; }; for(int i = 0; i < n; i++){ int mask = power[i]*(1+r[i]); resp[i] = solve(i,mask,solve); } } return resp; }
#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...