제출 #910123

#제출 시각아이디문제언어결과실행 시간메모리
910123MinaRagy06Inside information (BOI21_servers)C++17
5 / 100
3575 ms93204 KiB
#include <bits/stdc++.h> using namespace std; typedef int64_t ll; #define SZ(x) (int) x.size() const int N = 120'005; vector<array<int, 3>> adj[N]; //0: increasing, 1: decreasing, {ancestor, last weight} array<int, 3> bl[2][18][N]; int st[N], en[N], curt; void dfs(int i, int par, int part) { bl[0][0][i] = {par, part, part}; bl[1][0][i] = {par, part, part}; for (int j = 1; j < 18; j++) { bl[0][j][i] = bl[0][j - 1][i]; auto [lst, lstt, mx] = bl[0][j][i]; if (lstt <= bl[0][0][lst][1]) { bl[0][j][i] = bl[0][j - 1][lst]; bl[0][j][i][2] = max(bl[0][j][i][2], mx); } } for (int j = 1; j < 18; j++) { bl[1][j][i] = bl[1][j - 1][i]; auto [lst, lstt, mx] = bl[1][j][i]; if (lstt >= bl[1][0][lst][1]) { bl[1][j][i] = bl[1][j - 1][lst]; bl[1][j][i][2] = max(bl[1][j][i][2], mx); } } st[i] = curt++; for (auto [nxt, t, nxtidx] : adj[i]) { if (nxt == par) continue; dfs(nxt, i, t); } en[i] = curt; } bool lca(int l, int b) { if (st[l] <= st[b] && en[b] <= en[l]) { return 1; } return 0; } array<int, 2> check(int t, int a, int b) { int mx = -1e9, high = bl[t][17][a][0]; if (!lca(high, b)) { return {int(1e9), 0}; } if (a == high || lca(a, b)) { return {int(-1e9), (t == 1? 1 : -1) * int(1e9)}; } for (int j = 17; j >= 0; j--) { if (!lca(bl[t][j][a][0], b) && !lca(bl[t][j][a][0], high)) { mx = max(mx, bl[t][j][a][2]); a = bl[t][j][a][0]; } } return {max(mx, bl[t][0][a][2]), bl[t][0][a][1]}; } vector<array<int, 3>> curadj[N]; vector<int> dp[N]; int solve(int i, int par) { if (~dp[i][par]) return dp[i][par]; int prv = -1; if (par < SZ(curadj[i])) prv = adj[i][par][1]; dp[i][par] = 1; for (int j = 0; j < SZ(curadj[i]); j++) { auto [nxt, t, nxtidx] = curadj[i][j]; if (j == par || prv >= t) continue; dp[i][par] += solve(nxt, nxtidx); } return dp[i][par]; } bool checkpath(int a, int b, int t, bool x) { array<int, 2> l = check(x, a, b), r = check(!x, b, a); if (l[0] <= t && r[0] <= t && (l[1] == r[1] || (x ^ (l[1] < r[1]))) ) { return 1; } else { return 0; } } const int B = 400; int main() { ios_base::sync_with_stdio(0), cin.tie(0); auto S = chrono::steady_clock::now().time_since_epoch().count(); int n, q; cin >> n >> q; q += n - 1; pair<char, vector<int>> v[q]; for (int i = 0; i < q; i++) { cin >> v[i].first; if (v[i].first == 'S') { int a, b; cin >> a >> b; int x = adj[b].size(), y = adj[a].size(); adj[a].push_back({b, i, x}); adj[b].push_back({a, i, y}); v[i].second = {a, b}; } else if (v[i].first == 'Q') { int a, b; cin >> a >> b; v[i].second = {a, b}; } else { int a; cin >> a; v[i].second = {a}; } } dfs(1, 1, 0); for (int i = 1; i <= n; i++) { dp[i].resize(adj[i].size() + 1); } auto recalc = [&] () { for (int i = 1; i <= n; i++) { for (int j = 0; j <= SZ(adj[i]); j++) { dp[i][j] = -1; } } for (int i = 1; i <= n; i++) { for (int j = 0; j <= SZ(adj[i]); j++) { solve(i, j); } } }; vector<array<int, 3>> upd; recalc(); ll s = 0; for (int i = 0; i < q; i++) { if (upd.size() == B) { for (auto [a, b, t] : upd) { int x = curadj[b].size(), y = curadj[a].size(); curadj[a].push_back({b, t, x}); curadj[b].push_back({a, t, y}); } upd.clear(); recalc(); } if (v[i].first == 'S') { int a = v[i].second[0], b = v[i].second[1]; upd.push_back({a, b, i}); } else if (v[i].first == 'Q') { int a = v[i].second[0], b = v[i].second[1]; #ifdef MINA // cout << i << endl; s += (checkpath(a, b, i, 1)); #else cout << (checkpath(a, b, i, 1)? "yes\n" : "no\n"); #endif } else { int x = v[i].second[0]; int ans = dp[x][adj[x].size()]; for (auto [a, b, t] : upd) { ans += checkpath(x, b, t - 1, 0) || checkpath(x, a, t - 1, 0); } #ifdef MINA // cout << i << endl; s += ans; #else cout << ans << '\n'; #endif } } #ifdef MINA cout << s << '\n'; auto E = chrono::steady_clock::now().time_since_epoch().count(); cout << (E - S) / 1e9 << 's'; #endif return 0; }

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

servers.cpp: In function 'int main()':
servers.cpp:84:7: warning: unused variable 'S' [-Wunused-variable]
   84 |  auto S = chrono::steady_clock::now().time_since_epoch().count();
      |       ^
servers.cpp:126:5: warning: unused variable 's' [-Wunused-variable]
  126 |  ll s = 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...
#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...