Submission #558246

#TimeUsernameProblemLanguageResultExecution timeMemory
558246cheissmartInside information (BOI21_servers)C++14
50 / 100
350 ms162580 KiB
#include <bits/stdc++.h> #define IO_OP std::ios::sync_with_stdio(0); std::cin.tie(0); #define F first #define S second #define V vector #define PB push_back #define EB emplace_back #define MP make_pair #define SZ(v) int((v).size()) #define ALL(v) (v).begin(), (v).end() using namespace std; typedef long long ll; typedef pair<int, int> pi; typedef V<int> vi; const int INF = 1e9 + 7, N = 120005; struct Data { bool ok; int l, r; int mx; Data(int _mx = -1) { ok = true; l = r = mx = _mx; } friend Data operator + (const Data lhs, const Data rhs) { if(lhs.mx == -1) return rhs; if(rhs.mx == -1) return lhs; Data res; res.ok = lhs.ok & rhs.ok & (lhs.r < rhs.l); res.l = lhs.l, res.r = rhs.r; res.mx = max(lhs.mx, rhs.mx); return res; } } up[N][20], down[N][20]; V<pi> G[N]; int p[N][20], d[N]; void dfs(int u, int pa = 0) { p[u][0] = pa; for(int i = 1; i < 20; i++) { p[u][i] = p[p[u][i - 1]][i - 1]; up[u][i] = up[u][i - 1] + up[p[u][i - 1]][i - 1]; down[u][i] = down[p[u][i - 1]][i - 1] + down[u][i - 1]; } for(auto[v, i]:G[u]) if(v != pa) { d[v] = d[u] + 1; up[v][0] = down[v][0] = Data(i); dfs(v, u); } } int lca(int u, int v) { if(d[u] > d[v]) swap(u, v); for(int i = 0; i < 20; i++) if((d[v] - d[u]) >> i & 1) v = p[v][i]; if(u == v) return u; for(int i = 19; i >= 0; i--) if(p[u][i] != p[v][i]) u = p[u][i], v = p[v][i]; assert(u != v && p[u][0] == p[v][0]); return p[u][0]; } Data go_up(int u, int step) { Data res; for(int i = 0; i < 20; i++) if(step >> i & 1) res = res + up[u][i], u = p[u][i]; return res; } Data go_down(int u, int step) { Data res; for(int i = 0; i < 20; i++) if(step >> i & 1) res = down[u][i] + res, u = p[u][i]; return res; } signed main() { IO_OP; int n, k; cin >> n >> k; V<array<int, 3>> qq; for(int i = 1; i <= n + k - 1; i++) { char op; cin >> op; if(op == 'S') { int u, v; cin >> u >> v; G[u].EB(v, i); G[v].EB(u, i); } else if(op == 'Q') { int u, v; cin >> u >> v; qq.PB({u, v, i}); } else { int u; cin >> u; qq.PB({u, -1, i}); } } dfs(1); for(auto[u, v, i] : qq) { if(v != -1) { // is the path v -> u increasing? if(u == v) { cout << "yes\n"; continue; } int l = lca(u, v); Data tt = go_up(v, d[v] - d[l]) + go_down(u, d[u] - d[l]); if(tt.mx < i && tt.ok) cout << "yes\n"; else cout << "no\n"; } else { throw; } } }

Compilation message (stderr)

servers.cpp: In function 'void dfs(int, int)':
servers.cpp:49:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   49 |  for(auto[v, i]:G[u]) if(v != pa) {
      |          ^
servers.cpp: In function 'int main()':
servers.cpp:104:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  104 |  for(auto[u, v, i] : qq) {
      |          ^
#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...