Submission #1307259

#TimeUsernameProblemLanguageResultExecution timeMemory
1307259NipphitchTraining (IOI07_training)C++20
100 / 100
36 ms8948 KiB
// Credit : tphuocdz
#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int K=10;
const int N=(1<<10);
const int INF=1e18;

int p[N+1],d[N+1],far[N+1][K+1],dp[N+1][N+1];
vector <pair <int,int>> adj[N+1];
vector <tuple <int,int,int>> k[N+1];

void cal(int u){
    for(int i=1;i<=K;i++){
        far[u][i]=far[far[u][i-1]][i-1];
    }
}

void dfs(int u,int par){
    d[u]=d[par]+1;
    far[u][0]=par;
    cal(u);
    p[u]=par;
    for(auto [v,w]:adj[u]){
        if(w>0 || v==par) continue;
        dfs(v,u);
    }
}

void goto_dep(int &a,int dep){
    if(d[a]==dep) return ;
    int akt=0;
    while(d[far[a][akt+1]]>dep) akt++;
    a=far[a][akt];
    goto_dep(a,dep);
}

int lca(int a,int b){
    if(d[a]>d[b]) swap(a,b);
    goto_dep(b,d[a]);
    while(a!=b){
        int akt=0;
        while(far[a][akt+1]!=far[b][akt+1]) akt++;
        a=far[a][akt];
        b=far[b][akt];
    }
    return a;
}

void fix(int u){
    vector <pair <int,int>> n;
    for(auto [v,w]:adj[u]){
        int l=lca(u,v);
        int dis=d[u]+d[v]-2*d[l];
        if(dis%2==0 || w==0){
            n.push_back({v,w});
            if(u<v && w>0) k[l].push_back({u,v,w});
        }
    }
    adj[u]=n;
}

int rec(int u,int pp,int x,pair <int,int> &dz){
    if(u==x){
        if(dz.first==-1) dz.first=pp;
        else dz.second=pp;
        return 0;
    }
    int idx=N-1,t=-1;
    for(auto [v,w]:adj[u]){
        t++;
        if(v==p[u] || w>0) continue;
        if(v==pp) idx-=(1<<t);
    }
    return dp[u][idx]-dp[pp][N-1]+rec(p[u],u,x,dz);
}

void solve(int u,int par){
    for(auto [v,w]:adj[u]){
        if(w>0 || v==par) continue;
        solve(v,u);
    }
    for(int i=0;i<N;i++){
        int t=-1;
        for(auto [v,w]:adj[u]){
            t++;
            if(v==par || w>0) continue;
            dp[u][i]+=dp[v][N-1];
        }
    }
    for(auto [a,b,val]:k[u]){
        pair <int,int> dz={-1,-1};
        int idx=0,w=rec(a,-1,u,dz)+rec(b,-1,u,dz),t=-1,odj=0;
        for(auto [v,w]:adj[u]){
            t++;
            if(v==par || w>0) continue;
            if(v==dz.first || v==dz.second){
                idx+=(1<<t);
                odj+=dp[v][N-1];
            }
        }
        for(int i=0;i<N;i++){
            if((i&idx)==idx){
                dp[u][i]=max(dp[u][i],dp[u][i^idx]+val-odj+w);
            }
        }
    }
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,m;
    cin >> n >> m;
    int s=0;
    for(int i=0;i<m;i++){
        int u,v,w;
        cin >> u >> v >> w;
        adj[u].push_back({v,w});
        adj[v].push_back({u,w});
        s+=w;
    }
    dfs(1,1);
    for(int i=1;i<=n;i++) fix(i);
    solve(1,1);
    int ans=0;
    for(int i=0;i<N;i++) ans=max(ans,dp[1][i]);
    cout << s-ans;  
}
#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...