답안 #1081825

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1081825 2024-08-30T11:39:05 Z Malix 공장들 (JOI14_factories) C++14
15 / 100
8000 ms 234104 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;
vector<vector<ll>> dst;

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);
  REP(j,1,k)REP(i,0,n)if(p[i][j-1]!=-1)p[i][j]=p[p[i][j-1]][j-1];
  vis.resize(n,0);b.resize(n);par.resize(n,-1);
  int x=centroid(0,n);
  vis[x]=1;
  decompose(x);
  dst.resize(n,vector<ll>(k));
  REP(i,0,n){
    int r=i;
    int ps=0;
    while(r!=-1){
      dst[i][ps]=distance(i,r);
      r=par[r];
      ps++;
    }
  }
}

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];
    int ps=0;
    while(r!=-1){
      d[r]=min(d[r],dst[X[i]][ps]);
      r=par[r];ps++;
    }
  }
  REP(i,0,t){
    int r=Y[i];
    int ps=0;
    while(r!=-1){
      if(d[r]!=INF)ans=min(ans,d[r]+dst[Y[i]][ps]);
      r=par[r];ps++;
    }
  }
  return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 860 KB Output is correct
2 Correct 181 ms 10268 KB Output is correct
3 Correct 195 ms 10132 KB Output is correct
4 Correct 191 ms 10320 KB Output is correct
5 Correct 209 ms 10576 KB Output is correct
6 Correct 139 ms 10068 KB Output is correct
7 Correct 212 ms 10324 KB Output is correct
8 Correct 206 ms 10200 KB Output is correct
9 Correct 198 ms 10580 KB Output is correct
10 Correct 142 ms 10068 KB Output is correct
11 Correct 199 ms 10292 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 600 KB Output is correct
2 Execution timed out 8096 ms 234104 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 860 KB Output is correct
2 Correct 181 ms 10268 KB Output is correct
3 Correct 195 ms 10132 KB Output is correct
4 Correct 191 ms 10320 KB Output is correct
5 Correct 209 ms 10576 KB Output is correct
6 Correct 139 ms 10068 KB Output is correct
7 Correct 212 ms 10324 KB Output is correct
8 Correct 206 ms 10200 KB Output is correct
9 Correct 198 ms 10580 KB Output is correct
10 Correct 142 ms 10068 KB Output is correct
11 Correct 199 ms 10292 KB Output is correct
12 Correct 2 ms 600 KB Output is correct
13 Execution timed out 8096 ms 234104 KB Time limit exceeded
14 Halted 0 ms 0 KB -