Submission #910137

#TimeUsernameProblemLanguageResultExecution timeMemory
910137MinaRagy06Inside information (BOI21_servers)C++17
70 / 100
3565 ms90664 KiB
#include <bits/stdc++.h> #pragma GCC optimize("Ofast") 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 isanc(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 (!isanc(high, b)) { return {int(1e9), 0}; } if (a == high || isanc(a, b)) { return {int(-1e9), (t == 1? 1 : -1) * int(1e9)}; } for (int j = 17; j >= 0; j--) { if (!isanc(bl[t][j][a][0], b) && !isanc(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<int> dp[N]; int lst; int solve(int i, int par) { if (~dp[i][par]) return dp[i][par]; int prv = -1; if (par < SZ(adj[i])) prv = adj[i][par][1]; dp[i][par] = 1; for (int j = 0; j < SZ(adj[i]); j++) { auto [nxt, t, nxtidx] = adj[i][j]; if (t > lst) break; 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 = 350; 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); for (int j = 0; j <= SZ(adj[i]); j++) { dp[i][j] = -1; } } vector<array<int, 3>> upd; lst = -1; 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}); // } lst = i - 1; upd.clear(); for (int i = 1; i <= n; i++) { for (int j = 0; j <= SZ(adj[i]); j++) { dp[i][j] = -1; } } } if (v[i].first == 'S') { int a = v[i].second[0], b = v[i].second[1]; if (isanc(b, a)) swap(a, b); 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 = solve(x, adj[x].size()); for (auto [a, b, t] : upd) { if (isanc(b, x)) { ans += checkpath(x, b, t - 1, 0); } else { ans += 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; }

Compilation message (stderr)

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