답안 #846825

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
846825 2023-09-08T13:47:53 Z Ahmed57 Inside information (BOI21_servers) C++17
0 / 100
69 ms 15000 KB
#include <bits/stdc++.h>
using namespace std;
vector<pair<int,int>> adj[120001];
array<int,3>P[120001][18][2];
int hi[120001];
void dfs(int x,int p,int co) {
    hi[x] = hi[p]+1;
    P[x][0][0]={p,co,co};
    P[x][0][1]={p,co,co};
    for(int i = 1;i<=17;i++){
        P[x][i][0] = P[x][i-1][0];
        auto[pr,last,ma]=P[x][i][0];
        if(last<=P[pr][0][0][1]) {
            P[x][i][0]=P[pr][i-1][0];
            P[x][i][0][2]=max(P[x][i][0][2],ma);
        }
    }
    for(int i = 1;i<=17;i++){
        P[x][i][1] = P[x][i-1][1];
        auto[pr,last,ma]=P[x][i][1];
        if(last>=P[pr][0][1][1]) {
            P[x][i][1]=P[pr][i-1][1];
            P[x][i][1][2]=max(P[x][i][1][2],ma);
        }
    }
    for(auto j:adj[x]){
        if(j.first==p)continue;
        dfs(j.first,x,j.second);
    }
}
bool lca(int a,int b,int t) {
    int ss = 1 , vv = 0;
    if(hi[a]<hi[b]){swap(a,b);swap(ss,vv);}
    int ma = 0;
    for(int i = 17;i>=0;i--){
        if(hi[a]-(1<<i)>=hi[b]){
            ma = max(ma,P[a][i][ss][2]);
            a = P[a][i][ss][0];
        }
    }
    if(hi[a]!=hi[b])return 0;
    if(a==b)return (ma<t);
    for(int i = 17;i>=0;i--){
        if(P[a][i][ss][0]!=P[b][i][vv][0]){
            ma = max({ma,P[a][i][ss][2],P[b][i][vv][2]});
            a = P[a][i][ss][0];
            b = P[b][i][vv][0];
        }
    }
    if(P[a][0][ss][0]!=P[b][0][vv][0]||hi[a]!=hi[b])return 0;
    return max({ma,P[a][0][ss][2],P[b][0][vv][2]})<t;
}
int main() {
    int n,q;
    cin>>n>>q;
    q+=n-1;
    pair<char,vector<int>> v[q];
    for(int i = 0;i<q;i++) {
        cin >> v[i].first;
        if(v[i].first=='S') {
            int a,b;
            cin>>a>>b;
            adj[a].push_back({b,i});
            adj[b].push_back({a,i});
        }else if(v[i].first=='Q') {
            int a,b;
            cin>>a>> b;
            v[i].second={a,b};
        }else{
            int a;
            cin>>a;
        }
    }
    dfs(1,1,0);
    for(int i=0;i<q;i++) {
        if(v[i].first=='S'||v[i].first=='C')continue;
        int a= v[i].second[0],b=v[i].second[1];
        if(lca(a,b,i)){
            cout<<"yes\n";
        }else{
            cout<<"no\n";
        }
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 56 ms 14724 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 56 ms 14724 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 54 ms 14936 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 54 ms 14936 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 53 ms 14808 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 53 ms 14808 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 66 ms 14756 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 66 ms 14756 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 60 ms 15000 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 60 ms 15000 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 69 ms 14932 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 69 ms 14932 KB Output isn't correct
2 Halted 0 ms 0 KB -