Submission #1065691

#TimeUsernameProblemLanguageResultExecution timeMemory
1065691mispertionInside information (BOI21_servers)C++17
50 / 100
197 ms68692 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("Ofast") mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); typedef long long ll; #define int ll typedef unsigned long long ull; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define pb push_back #define all(x) x.begin(), x.end() #define sz(x) (int)x.size() #define mispertion ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) #define F first #define S second #define getlast(s) (*s.rbegin()) #define debg cout << "OK\n" const ld PI = 3.1415926535; const int N = 3e5 + 10; const int M = 1e5 + 10; int mod = 998244353; const int infi = INT_MAX; const ll infl = 1e16; const int P = 2; int mult(int a, int b){ return a * 1LL * b % mod; } int sum(int a, int b){ if(a + b >= mod) return a + b - mod; if(a + b < 0) return a + b + mod; return a + b; } int binpow(int a, int n){ if (n == 0) return 1; if (n % 2 == 1){ return mult(binpow(a, n - 1), a); } else{ auto b = binpow(a, n / 2); return mult(b, b); } } const int K = 21; int n, q, up[N][K], tin[N], tout[N], tick, d[N], edg[N]; vector<int> g[N]; pair<char, pii> qs[N]; struct dsu{ int p[N], sz[N]; pii mnd[N]; dsu(int n){ for(int i = 1; i <= n; i++){ p[i] = i; sz[i] = 1; mnd[i] = {d[i], i}; } } int getp(int v){ if(p[v] == v) return v; return p[v] = getp(p[v]); } void uni(int a, int b){ a = getp(a); b = getp(b); if(a == b) return; if(sz[a] > sz[b]) swap(a, b); p[a] = b; sz[b] += sz[a]; mnd[b] = min(mnd[b], mnd[a]); } }; void dfs(int v, int p){ tin[v] = ++tick; up[v][0] = p; for(int k = 1; k < K; k++) up[v][k] = up[up[v][k - 1]][k - 1]; for(auto u : g[v]){ if(u == p) continue; d[u] = d[v] + 1; dfs(u, v); } tout[v] = tick; } bool isasc(int p, int v){ return (tin[p] <= tin[v] && tout[v] <= tout[p]); } int prlca(int v, int u){ for(int k = K - 1; k >= 0; k--){ if(!isasc(up[v][k], u)) v = up[v][k]; } return v; } void solve(){ //freopen("in.txt", "r", stdin); cin >> n >> q; for(int i = 1; i <= n + q - 1; i++){ char tp; cin >> tp; int a, b; if(tp == 'S'){ cin >> a >> b; g[a].pb(b); g[b].pb(a); }else if(tp == 'Q'){ cin >> a >> b; }else{ cin >> a; } qs[i] = {tp, {a, b}}; } dfs(1, 1); dsu inc = dsu(n); dsu dec = dsu(n); int cur = 0; for(int i = 1; i <= n + q - 1; i++){ if(qs[i].F == 'S'){ int u = qs[i].S.F, v = qs[i].S.S; if(up[v][0] != u) swap(u, v); edg[v] = ++cur; for(auto to : g[v]){ if(to == u) continue; if(edg[to]){ inc.uni(v, to); } } if(edg[u]) dec.uni(v, u); }else if(qs[i].F == 'Q'){ int fr = qs[i].S.S, to = qs[i].S.F; if(isasc(fr, to)){ int v = dec.mnd[dec.getp(to)].S; if(isasc(v, fr)){ cout << "yes\n"; continue; } if(up[v][0] != fr){ cout << "no\n"; continue; } if(edg[v]){ cout << "yes\n"; }else{ cout << "no\n"; } }else if(isasc(to, fr)){ int v = inc.mnd[inc.getp(fr)].S; if(isasc(v, to)){ cout << "yes\n"; continue; } if(up[v][0] != to){ cout << "no\n"; continue; } if(edg[v]){ cout << "yes\n"; }else{ cout << "no\n"; } }else{ int ufr = inc.mnd[inc.getp(fr)].S; int uto = dec.mnd[dec.getp(to)].S; int lfr = prlca(fr, to); int lto = prlca(to, fr); if(!isasc(ufr, lfr) || !isasc(uto, lto)){ cout << "no\n"; continue; } if(edg[lfr] && edg[lto] && edg[lfr] < edg[lto]){ cout << "yes\n"; }else{ cout << "no\n"; } } }else{ cout << 0 << '\n'; } } } signed main(){ mispertion; int t = 1; //cin >> t; while (t--){ solve(); } return 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...