제출 #417839

#제출 시각아이디문제언어결과실행 시간메모리
417839Hegdahl장난감 기차 (IOI17_train)C++17
11 / 100
13 ms2124 KiB
#include <bits/stdc++.h> #include "train.h" using namespace std; const int mxN = 5000; vector<int> g[mxN], gp[mxN], condensed[mxN]; int a[mxN], r[mxN]; bool all_a = true, all_b = true; int vis[mxN], scc[mxN]; vector<int> order; void dfs1(int cur) { vis[cur] = 1; for (int nxt : g[cur]) if (!vis[nxt]) dfs1(nxt); order.push_back(cur); } void dfs2(int root, int cur) { vis[cur] = 1; scc[cur] = root; for (int nxt : gp[cur]) if (!vis[nxt]) dfs2(root, nxt); } vector<int> who_wins(vector<int> _a, vector<int> _r, vector<int> u, vector<int> v) { const int n = (int)_a.size(); const int m = (int)u.size(); for (int i = 0; i < n; ++i) a[i] = _a[i]; for (int i = 0; i < n; ++i) r[i] = _r[i]; for (int i = 0; i < n; ++i) { all_a &= a[i]; all_b &= !a[i]; } assert(all_a); for (int i = 0; i < n; ++i) g[i].clear(); for (int i = 0; i < n; ++i) gp[i].clear(); for (int mm = 0; mm < m; ++mm) g[u[mm]].push_back(v[mm]); for (int mm = 0; mm < m; ++mm) gp[v[mm]].push_back(u[mm]); fill(vis, vis+n, 0); for (int i = 0; i < n; ++i) if (!vis[i]) dfs1(i); reverse(order.begin(), order.end()); fill(vis, vis+n, 0); for (int i : order) if (!vis[i]) dfs2(i, i); /* cerr << "scc: "; for (int i = 0; i < n; ++i) cerr << scc[i] << " \n"[i==n-1]; // */ vector<int> e_cnt(n), ans(n); for (int mm = 0; mm < m; ++mm) e_cnt[scc[u[mm]]] += scc[u[mm]] == scc[v[mm]]; /* cerr << "e_cnt: "; for (int i = 0; i < n; ++i) cerr << e_cnt[i] << " \n"[i==n-1]; // */ for (int i = 0; i < n; ++i) ans[scc[i]] |= e_cnt[scc[i]] && r[i]; /* cerr << "scc_ans: "; for (int i = 0; i < n; ++i) cerr << ans[i] << " \n"[i==n-1]; // */ for (int mm = 0; mm < m; ++mm) condensed[scc[u[mm]]].push_back(scc[v[mm]]); reverse(order.begin(), order.end()); for (int i : order) { if (scc[i] != i) continue; for (int j : condensed[i]) ans[scc[i]] |= ans[scc[j]]; } for (int i = 0; i < n; ++i) ans[i] = ans[scc[i]]; return ans; }
#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...