제출 #1105905

#제출 시각아이디문제언어결과실행 시간메모리
1105905vjudge1무제 (POI11_rot)C++17
100 / 100
231 ms42700 KiB
#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ll long long #define task "task" const int ar = 4e5 + 5; const ll mod = 1e9 + 7; int n; int cur; vector<int> ad[ar]; void input(int p) { int x; cin >> x; int tmp = (x == 0) ? ++cur : x; int C = cur; if (x == 0) { input(C); input(C); } if (p != 0) ad[p].push_back(tmp); } int sz[ar]; int Sz[ar]; int timedfs = 0; int in[ar], out[ar], node[ar]; void dfs(int u, int p) { sz[u] = 1; in[u] = ++timedfs; node[timedfs] = u; bool ok = false; for (auto v : ad[u]) { if (v == p) continue; ok = true; dfs(v, u); Sz[u] += Sz[v]; } if (!ok) Sz[u]++; out[u] = timedfs; } int bit[ar]; void update(int u, int v) { if (u == 0) { cout << 0; exit(0); } while(u <= n) { bit[u] += v; u += u & (-u); } } int get(int u) { int ans = 0; while(u > 0) { ans += bit[u]; u -= u & (-u); } return ans; } ll res[ar]; void hld(int u, int p) { int bigc = 0; int _sz = 0; for (auto v : ad[u]) { if (v == p) continue; if (_sz < Sz[v]) { _sz = Sz[v]; bigc = v; } } for (auto v : ad[u]) { if (v == p || v == bigc) continue; hld(v, u); res[u] += res[v]; for (int i = in[v]; i <= out[v]; i++) { int uu = node[i]; if (uu > n) continue; update(uu, -1); } } if (bigc) hld(bigc, u), res[u] += res[bigc]; ll add = 0; for (auto v : ad[u]) { if (v == p || v == bigc) continue; for (int i = in[v]; i <= out[v]; i++) { int uu = node[i]; if (uu > n) continue; if (bigc) { add += (bigc == ad[u][0]) ? get(n) - get(uu) : get(uu - 1); } } for (int i = in[v]; i <= out[v]; i++) { int uu = node[i]; if (uu > n) continue; update(uu, 1); } } if (u <= n) update(u, 1); if (bigc) { add = min(add, 1ll * Sz[ad[u][0]] * Sz[ad[u][1]] - add); } res[u] += add; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } cin >> n; cur = n; input(0); dfs(n + 1, 0); hld(n + 1, 0); cout << res[n + 1]; }

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

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