제출 #71030

#제출 시각아이디문제언어결과실행 시간메모리
71030funcsr장난감 기차 (IOI17_train)C++17
0 / 100
16 ms3404 KiB
#include "train.h" #include <iostream> #include <vector> #include <queue> #include <set> #include <algorithm> #include <cassert> #define rep(i, n) for (int i=0; i<(n); i++) #define all(x) (x).begin(), (x).end() #define pb push_back #define INF (1LL<<60) #define _1 first #define _2 second using namespace std; typedef pair<int, int> P; int N, M; vector<int> G[5000], R[5000]; bool self[5000]; bool used[5000]; int ord[5000]; vector<int> W[5000]; void dfs(int x,vector<int> &ret) { if (used[x])return; used[x]=true; for (int t : G[x]) dfs(t, ret); ret.pb(x); } void dfs2(int x,int k){ if (used[x])return; used[x]=true; ord[x]=k; for (int t : R[x]) dfs2(t, k); } vector<int> G2[5000]; bool earn[5000]; int memo[5000]; int dfs3(int x) { if (memo[x] != -1) return memo[x]; int ret = earn[x]; for (int t : G2[x]) ret |= dfs3(t); return memo[x] = ret; } vector<int> who_wins(vector<int> owner, vector<int> color, vector<int> U, vector<int> V) { N = owner.size(), M = U.size(); bool case1 = true; rep(i, M) { G[U[i]].pb(V[i]); R[V[i]].pb(U[i]); if (!(V[i] == U[i] || V[i] == U[i]+1)) case1 = false; } bool allA = true, allB = true; for (int x : owner) if (x != 1) allA = false; for (int x : owner) if (x != 0) allB = false; if (false){ //if (case1) { vector<int> win(N); for (int x=N-1; x>=0; x--) { bool loop = false; for (int t : G[x]) if (x == t) loop = true; bool next = false; for (int t : G[x]) if (x != t) next = true; //A if (owner[x] == 1) { if (color[x] && loop) win[x] = 1; else { if (next) win[x] = win[x+1]; else win[x] = 0; } } else { if (!color[x] && loop) win[x] = 0; else { if (next) win[x] = win[x+1]; else win[x] = 1; } } } return win; } else if (allA||allB) { rep(i, M) if (U[i]==V[i]) self[i] = true; vector<int> vs; rep(i, N) used[i] = false; rep(i, N) if (!used[i]) dfs(i, vs); rep(i, N) used[i] = false; int K = 0; for (int i=vs.size()-1; i>=0; i--) if (!used[vs[i]]) { dfs2(vs[i], K++); } rep(i, N) W[ord[i]].pb(i); rep(i, N) if (!W[i].empty()) { if (W[i].size() == 1 && !self[W[i][0]]) continue; bool has = false; for (int x : W[i]) if (color[x]) has = true; if (allA) earn[i] |= has; else earn[i] |= !has; //if (earn[i]) cout<<"g="<<i<<" ({";for(int x:W[i])cout<<x<<",";cout<<"}): ok\n"; } //cout<<"K="<<K<<"\n"; rep(i, M) { if (ord[U[i]] != ord[V[i]]) { //cout<<ord[U[i]]<<"->"<<ord[V[i]]<<"\n"; G2[ord[U[i]]].pb(ord[V[i]]); } } rep(i, K) memo[i] = -1; vector<int> ret(N, 0); if (allB) rep(i, N) ret[i] = 1; rep(i, K) if (dfs3(i)) { //cout<<"g="<<i<<": yes\n"; for (int x : W[i]) { if (allA) ret[x] = 1; else ret[x] = 0; } } return ret; } else abort(); }

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

train.cpp: In function 'std::vector<int> who_wins(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
train.cpp:48:8: warning: variable 'case1' set but not used [-Wunused-but-set-variable]
   bool case1 = true;
        ^~~~~
#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...