제출 #619809

#제출 시각아이디문제언어결과실행 시간메모리
619809yuto1115Inside information (BOI21_servers)C++17
55 / 100
235 ms37680 KiB
#include <bits/stdc++.h> #define rep(i, n) for(ll i = 0; i < ll(n); ++i) #define rep2(i, s, n) for(ll i = ll(s); i < ll(n); ++i) #define rrep(i, n) for(ll i = ll(n) - 1; i >= 0; --i) #define rrep2(i, n, t) for(ll i = ll(n) - 1; i >= ll(t); --i) #define pb push_back #define eb emplace_back #define all(a) a.begin(), a.end() #define SZ(a) int(a.size()) using namespace std; using ll = long long; using P = pair<int, int>; using vi = vector<int>; using vvi = vector<vi>; using vl = vector<ll>; using vvl = vector<vl>; using vp = vector<P>; using vvp = vector<vp>; using vb = vector<bool>; using vvb = vector<vb>; using vs = vector<string>; const int inf = 1001001001; const ll linf = 1001001001001001001; template<class T> bool chmin(T &a, T b) { if (a > b) { a = b; return true; } return false; } template<class T> bool chmax(T &a, T b) { if (a < b) { a = b; return true; } return false; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, q; cin >> n >> q; vvp G(n); vp es; vector qs(n, vector<tuple<int, int, int>>()); bool uni = true; bool line = true; rep(_, n + q - 1) { char c; cin >> c; if (c == 'S') { int a, b; cin >> a >> b; --a, --b; G[a].eb(b, SZ(es)); G[b].eb(a, SZ(es)); es.eb(a, b); uni &= (!a or !b); line &= abs(a - b) == 1; } else if (c == 'Q') { int a, d; cin >> a >> d; --a, --d; qs[SZ(es)].eb(0, d, a); } else { int d; cin >> d; --d; qs[SZ(es)].eb(1, d, 0); } } vi dep(n); vvi par(20, vi(n)); vi pid(n), inc(n), dec(n); auto dfs = [&](auto &dfs, int u, int p, int d, int _pid) -> void { dep[u] = d; par[0][u] = p; pid[u] = _pid; for (auto[v, id]: G[u]) { if (v == p) continue; inc[v] = (u and _pid > id ? inc[u] : 0) + 1; dec[v] = (u and _pid < id ? dec[u] : 0) + 1; dfs(dfs, v, u, d + 1, id); } }; dfs(dfs, 0, -1, 0, -1); rep(k, 19) { rep(i, n) { if (par[k][i] == -1) par[k + 1][i] = -1; else par[k + 1][i] = par[k][par[k][i]]; } } auto la = [&](int u, int d) { if (!d) return u; rep(k, 20) { if (d >> k & 1) { u = par[k][u]; assert(u != -1); } } return u; }; auto lca = [&](int u, int v) { if (dep[u] > dep[v]) swap(u, v); v = la(v, dep[v] - dep[u]); if (u == v) return u; rrep(k, 20) { if (par[k][u] != par[k][v]) { u = par[k][u]; v = par[k][v]; } } return par[0][u]; }; vs ans(q); int it = 0; rep(i, n) { for (auto[t, d, a]: qs[i]) { if (t == 0) { int l = lca(d, a); int hd = dep[d] - dep[l]; int ha = dep[a] - dep[l]; int when; if (d == a) { when = -1; } else if (l == d) { when = (dec[a] >= ha ? pid[a] : inf); } else if (l == a) { when = (inc[d] >= hd ? pid[la(d, hd - 1)] : inf); } else { // d -> (edge : x) -> l -> (edge : y) -> a int x = pid[la(d, hd - 1)]; int y = pid[la(a, ha - 1)]; when = (inc[d] >= hd and dec[a] >= ha and x < y ? pid[a] : inf); } ans[it] = (when < i ? "yes" : "no"); } else { int val = 0; if (uni) { if (!d) { val = i + 1; } else { val = max<int>(1, i - pid[d] + 1); } } else if (line) { val = 1; val += d + 1 - (upper_bound(pid.begin() + d - inc[d] + 1, pid.begin() + d + 1, i, [&](int key, int now) { return pid[now] < key; }) - pid.begin()); int _d = d; val += (lower_bound(pid.begin() + d + 1, pid.end(), i, [&](int now, int key) { return pid[now] < key and dec[now] >= now - _d; }) - pid.begin()) - d - 1; } ans[it] = to_string(val); } ++it; } } if (n <= 4000) { vector<bitset<4000>> bt(n); rep(i, n) bt[i].set(i); vi cnt(n, 1); it = 0; rep(i, n) { for (auto[t, d, a]: qs[i]) { if (t == 1) { ans[it] = to_string(cnt[d]); } ++it; } if (i < n - 1) { auto[u, v] = es[i]; rep(j, n) if (bt[u][j] or bt[v][j]) ++cnt[j]; bt[u] |= bt[v]; bt[v] = bt[u]; } } } rep(i, q) cout << ans[i] << '\n'; } //4 4 //S 1 2 //S 1 3 //S 3 4 //Q 2 1 //Q 2 2 //Q 2 3 //Q 2 4
#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...