Submission #249210

#TimeUsernameProblemLanguageResultExecution timeMemory
249210MarcoMeijerToy Train (IOI17_train)C++14
100 / 100
595 ms3832 KiB
#include "train.h" #include <bits/stdc++.h> using namespace std; //macros typedef long long ll; typedef pair<int, int> ii; typedef pair<ll, ll> lll; typedef tuple<int, int, int> iii; typedef vector<int> vi; typedef vector<ii> vii; typedef vector<iii> viii; typedef vector<ll> vll; typedef vector<lll> vlll; #define REP(a,b,c) for(int a=int(b); a<int(c); a++) #define RE(a,c) REP(a,0,c) #define RE1(a,c) REP(a,1,c+1) #define REI(a,b,c) REP(a,b,c+1) #define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--) #define INF 1e9 #define pb push_back #define fi first #define se second #define sz size() const int MX=6000; int n, m; vi a, r, u, v; vi res; set<int> adj[MX], rev[MX]; int cnt[MX]; vi R; bitset<MX> visited; vi f(bool A, vi x) { // O(n+m) vi ret; queue<int> q; RE(u,n) cnt[u] = 0; visited.reset(); for(int u : x) q.push(u), visited[u] = 1; while(!q.empty()) { int u = q.front(); q.pop(); ret.push_back(u); for(int v:rev[u]) { if(visited[v]) continue; cnt[v]++; if(a[v] == A) { q.push(v), visited[v] = 1; } else { if(cnt[v] == adj[v].sz) q.push(v), visited[v] = 1; } } } return ret; } vi getInv(vi x) { vi y; visited.reset(); for(int u:x) visited[u] = 1; RE(u,n) if(!visited[u] && adj[u].sz) y.push_back(u); return y; } void removeFromGraph(int u) { for(int v:adj[u]) rev[v].erase(u); for(int v:rev[u]) adj[v].erase(u); adj[u].clear(); rev[u].clear(); } vi who_wins(vi A, vi _R, vi U, vi V) { a = A; r = _R; u = U; v = V; n = a.size(); m = u.size(); res.resize(n); RE(i,m) adj[u[i]].insert(v[i]); RE(i,m) rev[v[i]].insert(u[i]); RE(u,n) if(r[u]) R.push_back(u); while(1) { vi y = f(1, R); vi x = getInv(y); if(x.sz == 0) { RE(u,n) if(adj[u].sz) res[u] = 1; return res; } vi z = f(0,x); for(int u:z) res[u] = 0; for(int u:z) removeFromGraph(u); } }

Compilation message (stderr)

train.cpp: In function 'vi f(bool, vi)':
train.cpp:51:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if(cnt[v] == adj[v].sz) q.push(v), visited[v] = 1;
                           ^
#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...