제출 #1188403

#제출 시각아이디문제언어결과실행 시간메모리
1188403DanielPr8Inside information (BOI21_servers)C++20
0 / 100
17 ms3652 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvl = vector<vll>;
using pll = pair<ll,ll>;
using vpl = vector<pll>;
using vvp = vector<vpl>;
#define f first
#define s second
#define pb push_back
#define all(v) v.begin(),v.end()
vvl pr;
vvp g;
vll dep, ln;
void dfs(ll cr){
    for(pll i:g[cr]){
        if(i.f!=pr[0][cr]){
            pr[0][i.f]=cr;
            dep[i.f] = dep[cr]+1;
            ln[i.f]=i.s;
            dfs(i.f);
        }
    }
}
ll get_pr(ll i, ll j){
    for(ll h = 19; h >= 0; --h){
        if(j>=(1<<h)){
            i=pr[h][i];
            j-=(1<<h);
        }
    }
    return i;
}
ll lca(ll a, ll b){
    if(dep[a]<dep[b])swap(a, b);
    a = get_pr(a, dep[a]-dep[b]);
    if(a==b)return a;
    for(ll h = 19; h >= 0; --h){
        if(pr[h][a]!=pr[h][b]){
            a=pr[h][a];
            b=pr[h][b];
        }
    }
    return pr[0][a];
}
ll kes(ll a, ll b){
    b = get_pr(b, dep[b]-dep[a]-1);
    return ln[b];
}
vpl up, dow;
ll t = 0;
pll get_up(ll a, ll b=-1){
    if(up[a].f==a)return {a,b};
    if(ln[a]>b)return up[a] = get_up(up[a].f, up[a].s);
    return {a,b};
}
pll get_dow(ll a, ll b=1e9){
    if(dow[a].f==a)return {a,b};
    if(ln[a]<b)return up[a] = get_dow(up[a].f, up[a].s);
    return {a,b};
}
int main(){
    ios_base::sync_with_stdio(0);cin.tie(NULL);
    ll n, a, b, k;
    cin >> n >> k;
    pr = vvl(20, vll(n));
    g = vvp(n);
    ln = dep = vll(n);
    vector<pair<char, pll>> que(n+k-1);
    for(ll i = 0; i < n+k-1; ++i){
        cin >> que[i].f;
        if(que[i].f=='S'){
            cin >> que[i].s.f >> que[i].s.s;
            que[i].s.f--; que[i].s.s--;
            g[que[i].s.f].pb({que[i].s.s, i});
            g[que[i].s.s].pb({que[i].s.f, i});
        }
        else if(que[i].f=='Q'){
            cin >> que[i].s.f >> que[i].s.s;
            que[i].s.f--; que[i].s.s--;
        }
        else {cin >> que[i].s.f;que[i].s.f--;}

    }
    dfs(0);
    for(ll i = 1; i < 20; ++i){
        for(ll j = 0; j < n; ++j){
            pr[i][j] = pr[i-1][pr[i-1][j]];
        }
    }
    up = dow = vpl(n);
    for(ll i = 0; i < n; ++i){up[i]={i,-1};dow[i]={i, 1e9};}
    for(; t < n+k-1; ++t){
        if(que[t].f=='Q'){
            a = que[t].s.f;
            b = que[t].s.s;
            ll q = lca(a,b);
            if(dep[get_up(b).f]>dep[q] || dep[get_dow(a).f]>dep[q]){
                cout << "no\n";
            }
            else if(kes(q, a) < kes(q,b))cout << "no\n";
            else cout << "yes\n";
        }
        else if(que[t].f=='S'){
            a = que[t].s.f;
            b = que[t].s.s;
            if(a!=pr[0][b])swap(a,b);
            dow[b] = up[b] = {a,ln[b]};
        }
    }
}
#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...