제출 #1351251

#제출 시각아이디문제언어결과실행 시간메모리
1351251yyc000123자매 도시 (APIO20_swap)C++20
0 / 100
202 ms48464 KiB
#include<bits/stdc++.h>
using namespace std ;
#define F first
#define S second
#define g0 get<0>
#define g1 get<1>
#define g2 get<2>
const int N = 1e5+5 ;
const int M = 2e5+5 ;
const int Q = 2e5+5 ;
int n , m , par[N+M] , anc[N+M][(int)log2(N+M)+5] , maxi[N+M] , flag[N+M] , deep[N+M] ;
vector<int> nei[N+M] , nei1[N+M] ;

int p(int k){
    if(par[k]<0) return k ;
    else return par[k]=p(par[k]) ;
}

void dfs(int node){
    for(int i:nei[node]){
        deep[i]=deep[node]+1 ;
        dfs(i) ;
    }
}

void init(int n1 , int m1 , vector<int> u , vector<int> v , vector<int> w){
    n = n1 , m = m1 ;
    vector<tuple<int,int,int>> vt ;
    for(int i=0 ; i<m ; i++){
        vt.push_back({w[i],u[i],v[i]}) ;
    }
    sort(vt.begin(),vt.end()) ;
    memset(anc,-1,sizeof(anc)) ;
    memset(par,-1,sizeof(par)) ;
    for(int i=0 ; i<m ; i++){
        int w = g0(vt[i]) , pu = p(g1(vt[i])) , pv = p(g2(vt[i])) ;
        anc[pu][0]=anc[pv][0]=n+i ;
        if(pu==pv) nei[n+i].push_back(pu) , flag[n+i]=1 ;
        else{
            nei[n+i].push_back(pu) , nei[n+i].push_back(pv) ;
            if(flag[pu] || flag[pv]) flag[n+i]=1 ;
            else if(nei1[g1(vt[i])].size()>1 || nei1[g2(vt[i])].size()>1) flag[n+i]=1 ;
        }
        nei1[g1(vt[i])].push_back(g2(vt[i])) ; nei1[g2(vt[i])].push_back(g1(vt[i])) ;
        maxi[n+i]=max({maxi[pu],maxi[pv],w}) ;
        par[n+i]=par[pu]+par[pv] ;
        par[pu]=par[pv]=n+i ;
    }
    for(int j=1 ; j<=log2(n+m)+1 ; j++){
        for(int i=0 ; i<n+m ; i++) anc[i][j]=anc[anc[i][j-1]][j-1] ;
    }
    dfs(n+m-1) ;
}

int flca(int a , int b){
    if(deep[a]<deep[b]) swap(a,b) ;
    int diff = deep[a]-deep[b] ;
    for(int i=0 ; i<=log2(n+m)+1 ; i++){
        if((diff>>i)&1) a=anc[a][i] ;
    }
    if(a==b) return a ;
    for(int i=log2(n+m)+1 ; i>=0 ; i--){
        if(anc[a][i]!=anc[b][i] || (anc[a][i]!=-1 && !flag[anc[a][i]])) a=anc[a][i] , b=anc[b][i] ;
    }
    return anc[a][0] ;
}

int getMinimumFuelCapacity(int x , int y){
    int lca = flca(x,y) ;
    if(lca==-1) return -1 ;
    return maxi[lca] ;
}

/*
int main(){
    init(3, 2, {0, 0}, {1, 2}, {5, 6}) ; cout << getMinimumFuelCapacity(1, 2) << '\n' ;
    // init(5, 6, {0, 0, 1, 1, 1, 2}, {1, 2, 2, 3, 4, 3}, {4, 4, 1, 2, 10, 3}) ;
    // cout << getMinimumFuelCapacity(1, 2) << ' ' << getMinimumFuelCapacity(2, 4) << ' ' << getMinimumFuelCapacity(0, 1) << '\n' ;
    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...