제출 #1359524

#제출 시각아이디문제언어결과실행 시간메모리
1359524enzyPictionary (COCI18_pictionary)C++20
140 / 140
55 ms25216 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int maxk=20;
int pai[2*maxn], krt_pai[2*maxn], cnt, val[2*maxn], dp[2*maxn][maxk], prof[2*maxn];
vector<int>v[2*maxn];
int find(int a){
    if(a==pai[a]) return a;
    return krt_pai[a]=find(krt_pai[a]); 
}
void merge(int a, int b, int c){
    a=find(a); b=find(b);
    if(a==b) return;
    pai[a]=pai[b]=krt_pai[a]=krt_pai[b]=++cnt;
    pai[cnt]=cnt;krt_pai[cnt]=cnt; val[cnt]=c;
    v[cnt].push_back(a); v[cnt].push_back(b);
}
void dfs(int u, int p){
    dp[u][0]=p; prof[u]=prof[p]+1;
    for(int k=1;k<maxk;k++) dp[u][k]=dp[dp[u][k-1]][k-1];
    for(int viz : v[u]) dfs(viz,u);
}
int lca(int a, int b){
    if(prof[a]<prof[b]) swap(a,b);
    int d=prof[a]-prof[b];
    for(int k=0;k<maxk;k++) if(d&(1<<k)) a=dp[a][k];
    if(a==b) return val[a];
    for(int k=maxk-1;k>=0;k--){
        int na=dp[a][k], nb=dp[b][k];
        if(na!=nb) a=na, b=nb;
    }
    return val[dp[a][0]];
}
int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    int n, m, q; cin >> n >> m >> q;
    cnt=n;
    for(int i=1;i<=n;i++) pai[i]=krt_pai[i]=i;
    for(int i=m;i>=1;i--){
        for(int j=i;j+i<=n;j+=i) merge(j,j+i,m-i+1);
    }
    dfs(cnt,cnt);
    while(q--){
        int a, b; cin >> a >> b;
        cout << lca(a,b) << '\n';
    }
}
#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...