제출 #1313425

#제출 시각아이디문제언어결과실행 시간메모리
1313425kzhiSynchronization (JOI13_synchronization)C++20
100 / 100
480 ms21012 KiB
/* Author : kmv__ yhl :> TST completed */ #include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; const int LOG = 16; int n, m, q; vector < int > E[N]; int in[N], ou[N], Timedfs = 0; int par[LOG + 1][N]; int dep[N]; struct LazyFenwick{ vector<int> bit1, bit2; LazyFenwick(int size) : bit1(size + 1, 0),bit2(size + 1 , 0) {} void capnhat(vector<int>& b, int u, int v) { int idx = u; while (idx <= n) { b[idx] += v; idx += (idx & (-idx)); } } void upd(int l, int r, int v) { capnhat(bit1, l, (n - l + 1) * v); capnhat(bit1, r + 1, -(n - r) * v); capnhat(bit2, l, v); capnhat(bit2, r + 1, -v); } int get(vector<int>& b, int u) { int idx = u, ans = 0; while (idx > 0) { ans += b[idx]; idx -= (idx & (-idx)); } return ans; } int pref(int u) { return get(bit1, u) - get(bit2, u) * (n - u); } int query(int l, int r) { return pref(r) - pref(l - 1); } int Get(int u){ return query(u, u); } } bit(100000); void dfs(int u, int p){ dep[u] = dep[p] + 1; par[0][u] = p; for (int i = 1; i <= 16; i ++) par[i][u] = par[i - 1][par[i - 1][u]]; in[u] = ++ Timedfs; for (int v : E[u]){ if (v == p) continue; dfs(v, u); } ou[u] = Timedfs; } bool check(int u, int p){ return (dep[u] - dep[p] == bit.Get(in[u]) - bit.Get(in[p])); } int f(int u){ for (int i = 16; i >= 0; i --) if (par[i][u] > 0 && check(u, par[i][u])) u = par[i][u]; return u; } int old_res[N]; int res_dinh[N]; pair<int,int> a[N]; bool c[N]; void SOLVE(){ cin >> n >> m >> q; for (int i = 1; i < n; i ++){ int u, v; cin >> u >> v; E[u].push_back(v); E[v].push_back(u); a[i] = {u, v}; } dfs(1, 0); for (int i = 1; i <= n; i ++) res_dinh[i] = 1; while (m --){ int idx; cin >> idx; int u = a[idx].first; int v = a[idx].second; if (dep[u] > dep[v]) swap(u, v); u = f(u); if (!c[idx]){ int kq = res_dinh[v] + res_dinh[u] - old_res[idx]; res_dinh[u] = kq; res_dinh[v] = kq; bit.upd(in[v], ou[v], 1); } else{ int kq = res_dinh[u]; old_res[idx] = kq; res_dinh[v] = kq; bit.upd(in[v], ou[v], -1); } c[idx] = !c[idx]; } while (q --){ int u; cin >> u; cout << res_dinh[f(u)] << '\n'; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define TASK "kmv" if (fopen(TASK".inp","r")){ freopen(TASK".inp","r",stdin); freopen(TASK".out","w",stdout); } int nTest = 1; // cin >> nTest; while (nTest --){ SOLVE(); } return 0; }

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

synchronization.cpp: In function 'int main()':
synchronization.cpp:153:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  153 |         freopen(TASK".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
synchronization.cpp:154:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  154 |         freopen(TASK".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...