제출 #38256

#제출 시각아이디문제언어결과실행 시간메모리
38256funcsr동기화 (JOI13_synchronization)C++14
60 / 100
993 ms20428 KiB
#include <iostream> #include <vector> #include <set> #include <algorithm> using namespace std; typedef pair<int, int> P; #define rep(i, n) for (int i=0; i<(n); i++) #define all(x) x.begin(), x.end() #define pb push_back #define _1 first #define _2 second #define INF 1000001919 int N, M, Q; vector<P> G[100000]; int evt[200000]; int start[100000]; vector<P> T[100000]; int QV[100000]; int dfs(int x, int p, int time) { // cout<<"x="<<x<<" is counted, time="<<time<<"\n"; int s = 1; for (P pp : G[x]) if (pp._1 != p) { int t = pp._1, e = pp._2; auto it = lower_bound(all(T[e]), P(time, -1)); if (it == T[e].end()) continue; s += dfs(t, x, max(it->_2, time)); } return s; } int ans[100000]; vector<int> f() { vector<bool> used(N-1, false); vector<int> ret(N, 1); set<int> zeros; zeros.insert(-1); rep(i, N-1) zeros.insert(i); rep(t, M) { int e = evt[t]; if (used[e]) { zeros.insert(e); used[e] = false; } else { int dest = *(--zeros.find(e))+1; ret[dest] += ret[e+1]; ret[e+1] = 0; zeros.erase(e); used[e] = true; } } return ret; } void solve_linear() { rep(i, N-1) { int u, v; cin >> u >> v; u--, v--; if (u != i || v != i+1) abort(); } rep(i, M) cin >> evt[i], evt[i]--; vector<int> A = f(); int d = 1; rep(i, N) { d += A[i]-1; ans[i] += d; } // reverse rep(i, M) evt[i] = N-2-evt[i]; vector<int> B = f(); reverse(all(B)); d = 1; for (int i=N-1; i>=0; i--) { d += B[i]-1; ans[i] += d; } rep(i, N) ans[i]--; rep(i, Q) { int x; cin >> x; x--; cout << ans[x] << "\n"; } } int main() { cin >> N >> M >> Q; if (Q == 1) { rep(i, N-1) { int u, v; cin >> u >> v; u--, v--; G[u].pb(P(v, i)); G[v].pb(P(u, i)); } rep(i, N-1) start[i] = 0; rep(i, M) { cin >> evt[i]; evt[i]--; start[evt[i]] ^= 1; } rep(i, Q) cin >> QV[i], QV[i]--; rep(i, N-1) { if (start[i]) start[i] = -1; else start[i] = INF; } reverse(evt, evt+M); rep(t, M) { int e = evt[t]; if (start[e] == INF) { // open start[e] = t; } else { // close T[e].pb(P(t, start[e])); //cout<<"T["<<e<<"]: ["<<start[e]<<","<<t<<"]\n"; start[e] = INF; } } cout << dfs(QV[0], -1, 0) << "\n"; } else { solve_linear(); } return 0; }
#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...