Submission #1136929

#TimeUsernameProblemLanguageResultExecution timeMemory
1136929LeonidCuk공장들 (JOI14_factories)C++17
100 / 100
2844 ms352088 KiB
#include <bits/stdc++.h>
#include "factories.h"
using namespace std;
vector<pair<long long int,long long int>>g[500000],cd[500000],v(500000);
vector<int>sz(500000);
int m=1;
bool vis[500000]={0};
void dfs(int a,int b)
{
    sz[a]=1;
    for(auto p:g[a])
    {
        int i=p.first;
        if(i!=b&&vis[i]==0)
        {
            dfs(i,a);
            sz[a]+=sz[i];
        }
    }
}
void dfs2(int a,int b,long long int d,int k)
{
    cd[a].push_back({k,d});
    for(auto p:g[a])
    {
        int i=p.first;
        if(i!=b&&vis[i]==0)
        {
            dfs2(i,a,d+p.second,k);
        }
    }
}
void cen(int a)
{
    dfs(a,a);
    int n=sz[a],b=a;
    bool check=true;
    while(check)
    {
        check=false;
        for(auto p:g[a])
        {
            int i=p.first;
            if(i!=b&&vis[i]==0&&sz[i]*2>n)
            {
                check=true;
                b=a;
                a=i;
                break;
            }
        }
    }
    dfs2(a,a,0,a);
    vis[a]=1;
    for(auto p:g[a])
    {
        if(!vis[p.first])
        {
            cen(p.first);
        }
    }
}
void Init(int n, int a[], int b[], int c[])
{
    for(int i=0;i<n-1;i++)
    {
        g[a[i]].push_back({b[i],c[i]});
        g[b[i]].push_back({a[i],c[i]});
    }
    cen(0);
}
long long Query(int n1, int X[], int n2, int Y[])
{
        for(int i=0;i<n1;i++)
        {
            int a=X[i];
            for(int j=cd[a].size()-1;j>=0;j--)
            {
                auto p=cd[a][j];
                if(v[p.first].first!=m+1)
                {
                    v[p.first].second=p.second;
                    v[p.first].first=m+1;
                }
                else
                {
                    v[p.first].second=min(v[p.first].second,p.second);
                }
            }
        }
        long long ans=50000000000000;
        for(int i=0;i<n2;i++)
        {
            int a=Y[i];
            for(int j=cd[a].size()-1;j>=0;j--)
            {
                auto p=cd[a][j];
                if(v[p.first].first!=m+1)continue;
                else ans=min(ans,v[p.first].second+p.second);
            }
        }
        m++;
        return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...