Submission #550444

#TimeUsernameProblemLanguageResultExecution timeMemory
550444LittleCubeInside information (BOI21_servers)C++14
50 / 100
259 ms31712 KiB
#include <bits/stdc++.h> #define ll long long #define pii pair<int, int> #define pll pair<ll, ll> #define F first #define S second using namespace std; int N, K, a[240005], b[240005], dsu[120005], rk[120005], aca[240005], acb[240005], ans[240005], cur[120005]; vector<int> Q[120005]; map<int, int> mp[240005]; vector<pii> undo; char t[240005]; int find(int k) { return dsu[k] == k ? k : find(dsu[k]); } void merge(int x, int y, int tag = 0) { int rx = find(x), ry = find(y); if(rx == ry) return; if(rk[rx] <= rk[ry]) { dsu[rx] = ry; rk[ry] += rk[rx]; if(tag) { Q[ry].emplace_back(tag); aca[tag] = rx; acb[tag] = ry; } else undo.emplace_back(pii(rx, ry)); } else { dsu[ry] = rx; rk[rx] += rk[ry]; if(tag) { Q[rx].emplace_back(tag); aca[tag] = rx; acb[tag] = ry; } else undo.emplace_back(pii(ry, rx)); } } void rollback(int t) { while(undo.size() > t) { auto [x, y] = undo.back(); undo.pop_back(); dsu[x] = x; rk[y] -= rk[x]; } } void solve(int k) { int sz = undo.size(); while(!Q[k].empty()) { int i = Q[k].back(); Q[k].pop_back(); if(t[i] == 'S') { merge(a[i], b[i]); solve(aca[i]); solve(acb[i]); break; } else if(t[i] == 'Q') ans[i] = (find(a[i]) == find(b[i])); } rollback(sz); } signed main() { cin >> N >> K; K += N - 1; for(int i = 1; i <= K; i++) { cin >> t[i]; if(t[i] == 'C') cin >> a[i]; else cin >> a[i] >> b[i]; } for(int i = 1; i <= N; i++) dsu[i] = i, cur[i] = rk[i] = 1; for(int i = K; i >= 1; i--) { if(t[i] == 'S') { merge(a[i], b[i], i); cur[a[i]] += cur[b[i]]; cur[b[i]] = cur[a[i]]; } else if(t[i] == 'C') ans[i] = cur[a[i]]; else { int r = find(a[i]); Q[r].emplace_back(i); } } int r = find(1); for(int i = 1; i <= N; i++) dsu[i] = i, rk[i] = 1; solve(r); for(int i = 1; i <= K; i++) if(t[i] == 'C') cout << ans[i] << '\n'; else if(t[i] == 'Q') cout << (ans[i] ? "yes\n" : "no\n"); }

Compilation message (stderr)

servers.cpp: In function 'void rollback(int)':
servers.cpp:56:20: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   56 |  while(undo.size() > t)
      |        ~~~~~~~~~~~~^~~
servers.cpp:58:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   58 |   auto [x, y] = undo.back();
      |        ^
#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...