Submission #1360912

#TimeUsernameProblemLanguageResultExecution timeMemory
1360912yyc000123Wind Turbines (EGOI25_windturbines)C++20
13 / 100
162 ms38224 KiB
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
#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 = 1e5+5 ;
const int Q = 2e5+5 ;
int n , m , q , par[N+M] , arr[N+M] , deep[N+M] , anc[N+M][(int)log2(N+M)+5] , cnt ;
vector<int> child[N+M] ;
vector<pair<int,int>> nei[N] ;
vector<tuple<int,int,int>> edge ;
ll cost ;

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

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(cnt)+1 ; i++){
        if((diff>>i)&1) a=anc[a][i] ;
    }
    if(a==b) return a ;
    for(int j=log2(cnt)+1 ; j>=0 ; j--){
        if(anc[a][j]!=anc[b][j]) a=anc[a][j] , b=anc[b][j] ;
    }
    return anc[a][0] ;
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) ;
    cin >> n >> m >> q ;
    for(int i=0 ; i<m ; i++){
        int a , b , c ; cin >> a >> b >> c ;
        nei[a].push_back({b,c}) ; nei[b].push_back({a,c}) ;
        edge.push_back({c,a,b}) ;
    }
    sort(edge.begin(),edge.end()) ;
    auto p = [&] (int k , auto &self) -> int {
        if(par[k]<0) return k ;
        else return par[k] = self(par[k],self) ;
    };
    memset(par,-1,sizeof(par)) ;
    cnt = n-1 ;
    for(int i=0 ; i<m ; i++){
        int u = g1(edge[i]) , v = g2(edge[i]) , pu = p(u,p) , pv = p(v,p) ;
        if(pu==pv) continue ;
        cnt++ ;
        child[cnt].push_back(pu) , child[cnt].push_back(pv) ;
        arr[cnt]=g0(edge[i]) ; cost+=arr[cnt] ;
        par[pu]=par[pv]=cnt ;
    }
    anc[cnt][0]=-1 ;
    dfs(cnt) ;
    for(int j=1 ; j<=log2(cnt)+1 ; j++){
        for(int i=0 ; i<cnt ; i++) anc[i][j]=anc[anc[i][j-1]][j-1] ;
    }
    while(q--){
        int le , ri ; cin >> le >> ri ;
        int lca = flca(le,ri) ;
        cout << cost-arr[lca] << '\n' ;
    }
    return 0 ;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...