Submission #1337406

#TimeUsernameProblemLanguageResultExecution timeMemory
1337406wstcubeFactories (JOI14_factories)C++20
100 / 100
1768 ms150160 KiB
#include <bits/stdc++.h>
#include "factories.h"
const int N = 5e5 +5;
#define pii pair<int,int>
#define se second
#define fi first
#define ll long long
#define pb push_back
const ll INF = 2e18;
using namespace std;
vector<vector<pii>> adj(N);
int tin[N],tout[N];
int tt=0;
int par[N][20];
ll dist[N];
void dfs(int s,int p){
    tin[s] = ++tt;
    par[s][0] = p;
    for(int i=1; i<20;i++){
        par[s][i] = par[par[s][i-1]][i-1];
    }
    for(auto& i : adj[s]){
        if(i.fi!=p){
            dist[i.fi] = dist[s]+i.se;
            dfs(i.fi,s);
        }
    }
    tout[s] = tt;
}

void Init(int n, int A[], int B[], int D[]) {
    for(int i=0;i<n-1;i++){
        adj[A[i]].pb({B[i],D[i]});
        adj[B[i]].pb({A[i],D[i]});
    }
    dist[0]=0;
    dfs(0,0);
}
bool isanc(int u, int v){
    return (tin[u]<=tin[v] && tout[u]>=tout[v]);
}

int lca(int u,int v){
    if(isanc(u,v)) return u;
    if(isanc(v,u)) return v;
    for(int i=19;i>=0;i--){
        if(!isanc(par[u][i],v))
            u = par[u][i];
    }
    return par[u][0];
}

vector<vector<pair<ll,ll>>> gvt(N);

void connect(int u, int v){
    if(u==v)
        return;
    ll d =abs(dist[u]-dist[v]);
    gvt[u].pb({v,d});
    gvt[v].pb({u,d});
}


int createvt(vector<int>& nodes){
    sort(nodes.begin(),nodes.end(),[](int& u, int& v){
        return tin[u] < tin[v];
    });
    for(int i = int(nodes.size())-2;i>=0;i--){
        nodes.pb(lca(nodes[i],nodes[i+1]));
    }
    sort(nodes.begin(),nodes.end(),[](int& u, int& v){
        return tin[u] < tin[v];
    });
    vector<int> ve;
    ve.pb(nodes[0]);
    for(int i=1;i<nodes.size();i++){
        while(!isanc(ve.back(),nodes[i])){
            connect(ve.back(),ve[ve.size()-2]);
            ve.pop_back();
        }
        ve.pb(nodes[i]);
    }
    while(ve.size()>1){
        connect(ve.back(),ve[ve.size()-2]);
        ve.pop_back();
    }
    return ve[0];
}
ll best=INF;
int col[N];
pair<ll,ll> defes(int u, int p){
    ll m1 = (col[u] == 1 ? 0 : INF), m2 = (col[u]==2 ? 0 : INF);
    for(auto& v : gvt[u]){
        if(p==v.fi) continue;
        pair<ll,ll> sigma = defes(v.fi,u);
        m1=min(sigma.fi+v.se,m1),m2=min(sigma.se+v.se,m2);
    }
    best =min(m1+m2,best);
    return {m1,m2};
}


long long Query(int S, int X[], int T, int Y[]) {
    vector<int> nodes;
    for(int i = 0;i < S;i++)
        col[X[i]] = 1,nodes.pb(X[i]);
    for(int i = 0;i < T;i++)
        col[Y[i]] = 2,nodes.pb(Y[i]);
    best = INF;
    int ligma = createvt(nodes);
    defes(ligma,ligma);
    for(int i = 0;i < S;i++)
        col[X[i]] = 0;
    for(int i = 0;i < T;i++)
        col[Y[i]] = 0;
    for(auto& i : nodes){
        gvt[i].clear();
    }
    return best;
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...