Submission #1081808

# Submission time Handle Problem Language Result Execution time Memory
1081808 2024-08-30T11:26:08 Z Malix Factories (JOI14_factories) C++14
15 / 100
8000 ms 162864 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);
  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);
}

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;
}
# Verdict Execution time Memory Grader output
1 Correct 6 ms 860 KB Output is correct
2 Correct 255 ms 19004 KB Output is correct
3 Correct 480 ms 19076 KB Output is correct
4 Correct 387 ms 19096 KB Output is correct
5 Correct 349 ms 19540 KB Output is correct
6 Correct 141 ms 19028 KB Output is correct
7 Correct 481 ms 19000 KB Output is correct
8 Correct 494 ms 19112 KB Output is correct
9 Correct 356 ms 19368 KB Output is correct
10 Correct 146 ms 18976 KB Output is correct
11 Correct 478 ms 19028 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 604 KB Output is correct
2 Execution timed out 8084 ms 162864 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 6 ms 860 KB Output is correct
2 Correct 255 ms 19004 KB Output is correct
3 Correct 480 ms 19076 KB Output is correct
4 Correct 387 ms 19096 KB Output is correct
5 Correct 349 ms 19540 KB Output is correct
6 Correct 141 ms 19028 KB Output is correct
7 Correct 481 ms 19000 KB Output is correct
8 Correct 494 ms 19112 KB Output is correct
9 Correct 356 ms 19368 KB Output is correct
10 Correct 146 ms 18976 KB Output is correct
11 Correct 478 ms 19028 KB Output is correct
12 Correct 2 ms 604 KB Output is correct
13 Execution timed out 8084 ms 162864 KB Time limit exceeded
14 Halted 0 ms 0 KB -