Submission #249184

#TimeUsernameProblemLanguageResultExecution timeMemory
249184MarcoMeijerToy Train (IOI17_train)C++14
0 / 100
2091 ms4344 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]; set<int> R; set<int> f(bool A, set<int> x) { // O(n+m) set<int> ret; queue<int> q; RE(u,n) cnt[u] = 0; for(int u : x) q.push(u), cnt[u]++; while(!q.empty()) { int u = q.front(); q.pop(); ret.insert(u); for(int v:rev[u]) { cnt[v]++; if(a[v] == A) { if(cnt[v] == 1) q.push(v); } else { if(cnt[v] == adj[v].sz) q.push(v); } } } return ret; } set<int> getInv(set<int> x) { set<int> y; RE(u,n) if(!x.count(u)) y.insert(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.insert(u); set<int> y = f(1, R); if(y.sz == n) { RE(u,n) res[u] = 1; return res; } RE(u,n) res[u] = 1; while(1) { set<int> x = getInv(f(1, R)); set<int> y = f(0,x); for(int u:y) res[u] = 0; for(int u:y) removeFromGraph(u); if(y.size() == 0) break; } return res; }

Compilation message (stderr)

train.cpp: In function 'std::set<int> f(bool, std::set<int>)':
train.cpp:48:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if(cnt[v] == adj[v].sz) q.push(v);
                           ^
train.cpp: In function 'vi who_wins(vi, vi, vi, vi)':
train.cpp:77:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(y.sz == 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...