답안 #1081803

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1081803 2024-08-30T11:19:46 Z Malix 공장들 (JOI14_factories) C++14
0 / 100
6 ms 860 KB
#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,ll> pi;
typedef vector<pi> pii;
typedef tuple<int,int,int> tii;
typedef vector<ll> li;
typedef vector<li> lii;
 
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
 
ll INF=1000000000000000010;
int inf=1e9+10;
ll M=1e9+7;

int n,stv=0,env=0,k;
vector<pii> a;
vi st,en,sz,vis,par;
vector<ll> dist;
vii p,b;

void dfs(int x){
  st[x]=stv++;
  for(auto u:a[x])if(p[x][0]!=u.F){
    p[u.F][0]=x;
    dist[u.F]=dist[x]+u.S;
    dfs(u.F);
    sz[x]+=sz[u.F];
  }
  en[x]=env++;
}

bool ances(int x,int y){
  if(y==-1)return 1;
  if(st[x]>=st[y]&&en[x]<=en[y])return 1;
  return 0;
}

ll distance(int x,int y){
  if(ances(x,y)||ances(y,x))return abs(dist[x]-dist[y]);
  int z=y;
  for(int i=k-1;i>=0;i--)if(!ances(x,p[y][i]))y=p[y][i];
  y=p[y][0];
  return dist[x]+dist[z]-2*dist[y];
}

int centroid(int x,int y){
  for(auto u:a[x])if(vis[u.F]==0&&sz[u.F]>y/2){
    sz[x]-=sz[u.F];
    sz[u.F]=y;
    return centroid(u.F,y);
  }
  return x;
}

void decompose(int x){
  for(auto u:a[x])if(!vis[u.F]){
    int y=centroid(u.F,sz[u.F]);
    b[x].PB(y);
    vis[y]=1;
    par[y]=x;
    decompose(y);
  }
}

void Init(int N, int A[], int B[], int D[]) {
  n=N;
  k=log2(n)+1;
  a.resize(n);p.resize(n,vi(k,-1));sz.resize(n,1);dist.resize(n,0);
  REP(i,0,n-1){
    a[A[i]].PB({B[i],(ll)D[i]});
    a[B[i]].PB({A[i],(ll)D[i]});
  }
  st.resize(n);en.resize(n);
  dfs(0);
  vis.resize(n,0);b.resize(n);par.resize(n,-1);
  int x=centroid(0,n);
  vis[x]=1;
  decompose(x);
}

long long Query(int s, int X[], int t, int Y[]) {
  ll ans=INF;
  vector<ll> d(n,INF);
  REP(i,0,s){
    int r=X[i];
    while(r!=-1){
      d[r]=min(d[r],distance(X[i],r));
      r=par[r];
    }
  }
  REP(i,0,t){
    int r=Y[i];
    while(r!=-1){
      if(d[r]!=INF)ans=min(ans,d[r]+distance(Y[i],r));
      r=par[r];
    }
  }
  return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 860 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 600 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 860 KB Output isn't correct
2 Halted 0 ms 0 KB -