답안 #708653

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
708653 2023-03-12T06:41:15 Z ToroTN 공장들 (JOI14_factories) C++14
33 / 100
8000 ms 334808 KB
#include "factories.h"
#include<bits/stdc++.h>
using namespace std;
//#include "grader.cpp"
#define ll long long
#define pb push_back
#define X first
#define Y second
const int maxmum=500005,maxlift=25;
vector<pair<int,int> > v[maxmum];
int n,lv[maxmum],par[maxmum][maxlift];
ll dis[maxmum][maxlift],d[maxmum];
void dfs(int u,int p)
{
    for(int i=0;i<v[u].size();i++)
    {
        int node=v[u][i].X,cost=v[u][i].Y;
        if(node==p)continue;
        lv[node]=lv[u]+1;
        dis[node][0]=cost;
        d[node]=d[u]+cost;
        par[node][0]=u;
        dfs(node,u);
    }
}
int lca(int a,int b)
{
    if(lv[a]<lv[b])swap(a,b);
    for(int i=19;i>=0;i--)
    {
        if(lv[par[a][i]]>=lv[b])
        {
            a=par[a][i];
        }
    }
    if(a==b)return a;
    for(int i=19;i>=0;i--)
    {
        if(par[a][i]!=par[b][i])
        {
            a=par[a][i],b=par[b][i];
        }
    }
    return par[a][0];
}
ll lca_dis(int a,int b)
{
    return d[a]+d[b]-2*d[lca(a,b)];
}
int sz[maxmum],vis[maxmum],par_cen[maxmum];
ll opt[maxmum][maxlift];
int dfs_sz(int u,int p)
{
    sz[u]=1;
    for(int i=0;i<v[u].size();i++)
    {
        int node=v[u][i].X;
        if(node==p||vis[node])continue;
        sz[u]+=dfs_sz(node,u);
    }
    return sz[u];
}
int find_cen(int u,int p,int size)
{
    for(int i=0;i<v[u].size();i++)
    {
        int node=v[u][i].X;
        if(node==p||vis[node])continue;
        if(sz[node]>size/2)return find_cen(node,u,size);
    }
    return u;
}
void centroid(int u,int p)
{
    dfs_sz(u,u);
    int cen=find_cen(u,u,sz[u]);
    vis[cen]=1;
    par_cen[cen]=p;
    for(int i=0;i<v[cen].size();i++)
    {
        ll node=v[cen][i].X;
        if(node==p||vis[node])continue;
        centroid(node,cen);
    }
}
ll mn[maxmum];
void Init(int N, int A[], int B[], int D[]) 
{
    n=N;
    for(int i=0;i<n-1;i++)
    {
        v[A[i]+1].pb({B[i]+1,D[i]});
        v[B[i]+1].pb({A[i]+1,D[i]});
    }
    par[1][0]=1;
    dfs(1,1);
    for(int i=1;i<=19;i++)
    {
        for(int j=1;j<=n;j++)
        {
            dis[j][i]=dis[j][i-1]+dis[par[j][i-1]][i-1];
            par[j][i]=par[par[j][i-1]][i-1];
        }
    }
    dfs_sz(1,1);
    centroid(1,0);
    for(int i=1;i<=n;i++)
    {
        ll x=i,kk=0;
        while(1)
        {
            opt[i][kk]=lca_dis(x,i);
            ++kk;
            x=par_cen[x];
            if(x==0)break;
        }
    }
    for(int i=1;i<=n;i++)mn[i]=1e18;
}
void update(int num,int type)
{
    int u=num,kk=0;
    while(1)
    {
        if(type==0)
        {
            mn[u]=min(mn[u],opt[num][kk]);
        }else
        {
            mn[u]=1e18;
        }
        u=par_cen[u];
        ++kk;
        if(u==0)break;
    }
}
ll query(ll num)
{
    int u=num,kk=0;
    ll val=1e18;
    while(1)
    {
        val=min(val,opt[num][kk]+mn[u]);
        u=par_cen[u];
        ++kk;
        if(u==0)break;
    }
    return val;
}
long long Query(int S, int X[], int T, int Y[]) 
{
    for(int i=0;i<S;i++)
    {
        update(X[i]+1,0);
    }
    ll ans=1e18;
    for(int i=0;i<T;i++)
    {
        ans=min(ans,query(Y[i]+1));
    }
    for(int i=0;i<S;i++)
    {
        update(X[i]+1,1);
    }
    return ans;
}

Compilation message

factories.cpp: In function 'void dfs(int, int)':
factories.cpp:15:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   15 |     for(int i=0;i<v[u].size();i++)
      |                 ~^~~~~~~~~~~~
factories.cpp: In function 'int dfs_sz(int, int)':
factories.cpp:55:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |     for(int i=0;i<v[u].size();i++)
      |                 ~^~~~~~~~~~~~
factories.cpp: In function 'int find_cen(int, int, int)':
factories.cpp:65:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |     for(int i=0;i<v[u].size();i++)
      |                 ~^~~~~~~~~~~~
factories.cpp: In function 'void centroid(int, int)':
factories.cpp:79:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |     for(int i=0;i<v[cen].size();i++)
      |                 ~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 12804 KB Output is correct
2 Correct 264 ms 23580 KB Output is correct
3 Correct 281 ms 23600 KB Output is correct
4 Correct 297 ms 23520 KB Output is correct
5 Correct 322 ms 23968 KB Output is correct
6 Correct 188 ms 23892 KB Output is correct
7 Correct 277 ms 24012 KB Output is correct
8 Correct 281 ms 23852 KB Output is correct
9 Correct 315 ms 24220 KB Output is correct
10 Correct 190 ms 23936 KB Output is correct
11 Correct 329 ms 23816 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 12492 KB Output is correct
2 Correct 2645 ms 303828 KB Output is correct
3 Correct 6078 ms 306476 KB Output is correct
4 Correct 899 ms 304824 KB Output is correct
5 Correct 7915 ms 334808 KB Output is correct
6 Correct 5886 ms 307624 KB Output is correct
7 Correct 1164 ms 79256 KB Output is correct
8 Correct 392 ms 79820 KB Output is correct
9 Correct 1230 ms 83452 KB Output is correct
10 Correct 1113 ms 80384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 12804 KB Output is correct
2 Correct 264 ms 23580 KB Output is correct
3 Correct 281 ms 23600 KB Output is correct
4 Correct 297 ms 23520 KB Output is correct
5 Correct 322 ms 23968 KB Output is correct
6 Correct 188 ms 23892 KB Output is correct
7 Correct 277 ms 24012 KB Output is correct
8 Correct 281 ms 23852 KB Output is correct
9 Correct 315 ms 24220 KB Output is correct
10 Correct 190 ms 23936 KB Output is correct
11 Correct 329 ms 23816 KB Output is correct
12 Correct 10 ms 12492 KB Output is correct
13 Correct 2645 ms 303828 KB Output is correct
14 Correct 6078 ms 306476 KB Output is correct
15 Correct 899 ms 304824 KB Output is correct
16 Correct 7915 ms 334808 KB Output is correct
17 Correct 5886 ms 307624 KB Output is correct
18 Correct 1164 ms 79256 KB Output is correct
19 Correct 392 ms 79820 KB Output is correct
20 Correct 1230 ms 83452 KB Output is correct
21 Correct 1113 ms 80384 KB Output is correct
22 Correct 3080 ms 305456 KB Output is correct
23 Correct 2797 ms 307620 KB Output is correct
24 Correct 6527 ms 307960 KB Output is correct
25 Correct 6515 ms 311508 KB Output is correct
26 Correct 6495 ms 308324 KB Output is correct
27 Execution timed out 8048 ms 329204 KB Time limit exceeded
28 Halted 0 ms 0 KB -