답안 #270359

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
270359 2020-08-17T14:23:50 Z Autoratch 공장들 (JOI14_factories) C++14
0 / 100
5612 ms 327672 KB
#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
 
const int N = 5e5 + 1;
const int K = 19;
 
vector<pair<int,int> > adj[N];
int sz[N],lv[N],dp[K][N],pa[N],lcc[N][K];
long long dis[N];
vector<pair<long long,int> > diss[N];
bool blocked[N];
long long res[N][2],ans;
vector<int> rev;
 
void dfs(int u,int p)
{
    dp[0][u] = p,lv[u] = lv[p]+1;
    for(auto [d,v] : adj[u]) if(v!=p) dis[v] = dis[u]+d,dfs(v,u);
}
 
void getsz(int u,int p,int st,int w)
{ 
    sz[u] = 1; 
    if(st!=-1) diss[u].push_back({w,st}); 
    for(auto [d,v] : adj[u]) if(v!=p and !blocked[v]) getsz(v,u,st,w+d),sz[u]+=sz[v]; 
}
 
void build(int u,int cp)
{
    getsz(u,cp,-1,0);
    int c = u,prev = 0;
    while(true)
    {
        int mx = -1,r = 0;
        for(auto [d,v] : adj[c]) if(v!=prev and !blocked[v] and sz[v]>mx) mx = sz[v],r = v;
        if(mx*2>sz[u]) prev = c,c = r;
        else break;
    }
    getsz(c,c,c,0);
    pa[c] = cp,blocked[c] = true;
    for(auto [d,v] : adj[c]) if(!blocked[v]) build(v,c);
}
  
int lca(int a,int b)
{
    if(lv[a]<lv[b]) swap(a,b);
    for(int i = K-1;i >= 0;i--) if(lv[dp[i][a]]>=lv[b]) a = dp[i][a];
    if(a==b) return a;
    for(int i = K-1;i >= 0;i--) if(dp[i][a]!=dp[i][b]) a = dp[i][a],b = dp[i][b];
    return dp[0][a];
}

void Init(int n,int a[],int b[],int d[]) 
{
    for(int i = 0;i < n-1;i++) a[i]++,b[i]++;
    for(int i = 0;i < n-1;i++)
    {
        adj[a[i]].push_back({d[i],b[i]});
        adj[b[i]].push_back({d[i],a[i]});
    }
    dfs(1,0);
    build(1,0);
    for(int i = 1;i < K;i++) for(int j = 1;j <= n;j++) dp[i][j] = dp[i-1][dp[i-1][j]];
    for(int i = 1;i <= n;i++) res[i][0] = res[i][1] = LLONG_MAX;
    for(int i = 1;i <= n;i++)
    {
    //    for(int j = 0,x = i;x;x = pa[x],j++) lcc[i][j] = lca(i,x);
    }
}
 
long long dist(int a,int b,int cn)
{
    int l = lcc[a][cn];
    return dis[a]+dis[b]-dis[l]-dis[l]; 
}
 
void upd(int t,int x)
{
    for(auto [d,u] : diss[x])
    {
        rev.push_back(u);
        res[u][t] = min(res[u][t],d);
        if(res[u][0]!=LLONG_MAX and res[u][1]!=LLONG_MAX) ans = min(ans,res[u][0]+res[u][1]);
    }
    /*
    for(int u = x,cnt = 0;u;u = pa[u],cnt++) 
    {
        rev.push_back(u); 
        res[u][t] = min(res[u][t],dist(x,u,cnt));
        if(res[u][0]!=LLONG_MAX and res[u][1]!=LLONG_MAX) ans = min(ans,res[u][0]+res[u][1]);
    }
    */
}
 
long long Query(int s,int x[],int t,int y[]) 
{
    for(int i = 0;i < s;i++) x[i]++;
    for(int i = 0;i < t;i++) y[i]++;
    ans = LLONG_MAX;
    for(int i = 0;i < s;i++) upd(0,x[i]);
    for(int i = 0;i < t;i++) upd(1,y[i]);
    for(int x : rev) res[x][0] = res[x][1] = LLONG_MAX;
    rev.clear();
    return ans;
}

Compilation message

factories.cpp: In function 'void dfs(int, int)':
factories.cpp:19:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   19 |     for(auto [d,v] : adj[u]) if(v!=p) dis[v] = dis[u]+d,dfs(v,u);
      |              ^
factories.cpp: In function 'void getsz(int, int, int, int)':
factories.cpp:26:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   26 |     for(auto [d,v] : adj[u]) if(v!=p and !blocked[v]) getsz(v,u,st,w+d),sz[u]+=sz[v];
      |              ^
factories.cpp: In function 'void build(int, int)':
factories.cpp:36:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   36 |         for(auto [d,v] : adj[c]) if(v!=prev and !blocked[v] and sz[v]>mx) mx = sz[v],r = v;
      |                  ^
factories.cpp:42:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   42 |     for(auto [d,v] : adj[c]) if(!blocked[v]) build(v,c);
      |              ^
factories.cpp: In function 'void upd(int, int)':
factories.cpp:80:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   80 |     for(auto [d,u] : diss[x])
      |              ^
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 24576 KB Output is correct
2 Correct 541 ms 43256 KB Output is correct
3 Incorrect 582 ms 43640 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 24320 KB Output is correct
2 Correct 3179 ms 256656 KB Output is correct
3 Incorrect 5612 ms 327672 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 24576 KB Output is correct
2 Correct 541 ms 43256 KB Output is correct
3 Incorrect 582 ms 43640 KB Output isn't correct
4 Halted 0 ms 0 KB -