Submission #1320690

#TimeUsernameProblemLanguageResultExecution timeMemory
1320690ghammazhassanFactories (JOI14_factories)C++20
0 / 100
8090 ms589824 KiB
#include "factories.h"
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <vector>
#include <iomanip>
#include <string>
#include <queue>
#include <set>
#include <deque>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define ll long long
#define MAX_N          500000+5
#define MAX_Q          100000+5
#define MAX_SUM_ST    1000000+5
#define MAX_VALUE  1000000000+5
#define fi first
#define se second
static int N, Q;

map<pair<int,int>,ll>d;
int p[MAX_N];
vector<int>a[MAX_N];
int sz[MAX_N];
int vi[MAX_N];
int co=0;
int gl;
int dfs(int x,int y){
    sz[x]=1;
    co++;
    for (int i:a[x]){
        if (i==y or vi[i])continue;
        d[{i,gl}]=d[{gl,i}]=d[{i,x}]+d[{x,gl}];
        sz[x]+=dfs(i,x);
    }
    return sz[x];
}
int cent(int x){
    co=0;
    dfs(x,0);
    int p=0;
    while (sz[x]>co/2){
        int y=x;
        for (int i:a[x]){
            if (sz[i]>co/2 and i!=p and !vi[i]){
                p=x;
                x=i;
                break;
            }
        }
        if (y==x)break;
    }
    vi[x]=1;
    gl=x;
    dfs(x,0);
    return x;
}
void Init(int n,int A[], int B[], int D[]){
    for (int i=0;i<n-1;i++){
        int x=A[i],y=B[i];
        x++;
        y++;
        a[x].push_back(y);
        a[y].push_back(x);
        d[{x,y}]=d[{y,x}]=D[i];
    }
    vector<int>lb(n+1);
    queue<pair<int,int>>o;
    lb[0]=-1;
    o.push({1,0});
    while (o.size()){
        auto h=o.front();
        o.pop();
        if (vi[h.fi])continue;
        h.fi=cent(h.fi);
        lb[h.fi]=lb[h.se]+1;
        p[h.fi]=h.se;
        for (int i:a[h.fi]){
            if (vi[i])continue;
            o.push({i,h.fi});
        }
    }
    queue<int>q;
    for (int i=1;i<=n;i++){
        if (lb[i]==0){
            q.push(i);
        }
    }
    // int cp=0;
    // while (q.size()){
    //     int x=q.front();
    //     q.pop();
    //     queue<int>o;
    //     o.push(x);
    //     vector<int>l;
    //     map<int,int>vi;
    //     vi[x]=1;
    //     while (o.size()){
    //         int h=o.front();
    //         o.pop();
    //         for (int i:a[h]){
    //             cp++;
    //             if (vi[i] or lb[i]<=lb[x])continue;
    //             d[{i,x}]=d[{x,i}]=d[{h,x}]+d[{i,h}];
    //             vi[i]=1;
    //             o.push(i);
    //             if (lb[i]==lb[x]+1){
    //                 p[i]=x;
    //                 l.push_back(i);
    //             }
    //         }
    //     }
    //     for (int i:l)q.push(i);
    // }
    // cout << cp << endl;
    // cout << p[] << endl;
    // cout << endl;
}
ll Query(int S,int X[],int T,int Y[]){
    map<int,ll>dx;
    map<int,ll>dy;
    for (int i=0;i<S;i++){
        X[i]++;
        int x=X[i];
        dx[x]=-1;
        while (p[x]!=0){
            x=p[x];
            if (dx[x]==0){
                dx[x]=d[{x,X[i]}];
            }
            else{
                dx[x]=min(dx[x],d[{x,X[i]}]);
            }
        }
    }
    ll ans=1e18;
    for (int i=0;i<T;i++){
        Y[i]++;
        int x=Y[i];
        dy[x]=-1;
        if (dx[x]){
            ans=min(ans,dx[x]+dy[x]+(dx[x]==-1)+(dy[x]==-1));
        }
        while (p[x]!=0){
            x=p[x];
            if (dy[x]==0){
                dy[x]=d[{x,Y[i]}];
            }
            else{
                dy[x]=min(dy[x],d[{x,Y[i]}]);
            }
            if (dx[x]){
                ans=min(ans,dx[x]+dy[x]+(dx[x]==-1)+(dy[x]==-1));
            }
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...