제출 #249207

#제출 시각아이디문제언어결과실행 시간메모리
249207MarcoMeijer장난감 기차 (IOI17_train)C++14
38 / 100
2094 ms4312 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; bitset<MX> visited; set<int> f(bool A, set<int> x) { // O(n+m) set<int> 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.insert(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; } set<int> getInv(set<int> x) { set<int> y; RE(u,n) if(adj[u].sz && !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(); R.erase(u); } 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); int remainingNodes = n; while(1) { set<int> y = f(1, R); if(y.sz == remainingNodes) { RE(u,n) if(adj[u].sz) res[u] = 1; return res; } set<int> x = getInv(y); set<int> z = f(0,x); for(int u:z) res[u] = 0; for(int u:z) removeFromGraph(u), remainingNodes--; } }

컴파일 시 표준 에러 (stderr) 메시지

train.cpp: In function 'std::set<int> f(bool, std::set<int>)':
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;
                           ^
train.cpp: In function 'vi who_wins(vi, vi, vi, vi)':
train.cpp:83:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(y.sz == remainingNodes) {
            ~~~~~^~~~~~~~~~~~~~~~~
#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...