Submission #1301303

#TimeUsernameProblemLanguageResultExecution timeMemory
1301303mohammadsamFactories (JOI14_factories)C++20
100 / 100
1720 ms158540 KiB

#include "factories.h"
#include <bits/stdc++.h>
using namespace std;

typedef pair<int,int> pii;
typedef pair<long long ,long long> pll;
typedef long long ll ;

#define File          freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#define all(V)        V.begin(),V.end()
#define setprec(x)    fixed << setprecision(x)
#define Mp(a,b)       make_pair(a,b)
#define len(V)        (int)(V.size())
#define sep           ' '
#define endl          '\n'
#define pb            push_back
#define fi            first
#define sec           second
#define popcount(x)   __builtin_popcount(x)
#define lid           u<<1
#define rid           (lid)|1
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll N = 1e6 + 10,SQ=320,LOG=21;
const ll inf = 2e17 , MD = 1e9 + 7;

inline ll md(ll x){ x %= MD; return (x < 0 ? x + MD : x);}

vector<pii> g[N];
int st[N],ft[N],tim=1;
int par[N][LOG];
int dis[N];
vector<pair<int,long long>> adj[N];
int col[N];
ll dp[N],dp1[N],dp2[N];
ll ps[N];
void dfs(int u,int p){
  st[u] = tim++;
  par[u][0] = p;
  dis[u] = (u == p ? 0 : dis[p] + 1);
  for(int j =1 ;j < LOG;j++) par[u][j] = par[par[u][j-1]][j-1];
  for(auto h : g[u]){
    if(h.fi != p) {
      ps[h.fi] = ps[u] + h.sec;
      dfs(h.fi,u);
    }

  }
  ft[u] = tim;
}
int lift(int u,int k){
  for(int j = 0 ;j  < LOG;j++){
    if(k&(1<<j)) u = par[u][j];
  }
  return u;
}
int lca(int u,int v){
  if(dis[u] > dis[v]) swap(u,v);
  v =lift(v,dis[v] - dis[u]);
  if(u==v) return u;
  for(int j = LOG-1;j >= 0;j--){
    if(par[u][j] != par[v][j]){
      u = par[u][j],v= par[v][j];
    }
  }
  return par[u][0];
}
void Init(int N,int A[],int B[],int D[]){
  int n = N;
  for(int i = 0 ; i < n - 1;i++){
    g[A[i]].pb({B[i],D[i]});
    g[B[i]].pb({A[i],D[i]});

  }
  fill(col,col+n+2,0);
  dfs(0,0);
}

void DFS(int u){
  dp[u] = dp1[u] = dp2[u] = inf;
  for(auto h : adj[u]){
    DFS(h.fi);
    dp1[u] = min(dp1[u],dp1[h.fi] + h.sec);
    dp2[u] = min(dp2[u],dp2[h.fi] + h.sec);
    dp[u] = min(dp[u],dp[h.fi]);
  }
  ll m1 = inf;
  for(auto h : adj[u]){
    dp[u] = min(dp[u],dp1[h.fi] + h.sec + m1);
    m1 = min(m1,dp2[h.fi] + h.sec);
  }
  m1 = inf;
  for(auto h : adj[u]){
    dp[u] = min(dp[u],dp2[h.fi] + h.sec + m1);
    m1 = min(m1,dp1[h.fi] + h.sec);
  }
  if(col[u] == 1) dp1[u] = 0;
  if(col[u] == 2) dp2[u] = 0;
  if(col[u] == 1) dp[u] = min(dp[u],dp2[u]);
  if(col[u] == 2) dp[u] = min(dp[u],dp1[u]);
}
long long Query(int S, int X[], int T, int Y[]){
  vector<int> ver;
  for(int j = 0 ; j < S;j++) ver.pb(X[j]);
  for(int j = 0 ;j  < S;j++) col[X[j]] = 1;
  for(int j = 0 ; j < T;j++) ver.pb(Y[j]);
  for(int j = 0 ; j < T;j++) col[Y[j]] = 2;
  
  sort(all(ver),[&](int u,int v){
    return (st[u] < st[v]);
  });
  int ln = len(ver);
  for(int j = 0 ; j + 1 < ln;j++) ver.pb(lca(ver[j],ver[j+1]));
  sort(all(ver),[&](int u,int v){
    return st[u] < st[v];
  });
  ver.resize(unique(all(ver))-ver.begin());
  function<bool(int,int)> is_anc = [&](int u,int v){
    return (st[u] <= st[v] && ft[v] <= ft[u]);
  };
  vector<int> stk;
  stk.pb(ver[0]);
  for(int j = 1;j < len(ver);j++){
    while(!stk.empty() && !is_anc(stk.back(),ver[j])){
      stk.pop_back();
    }
    adj[stk.back()].pb({ver[j],ps[ver[j]] - ps[stk.back()]});
    stk.pb(ver[j]);
  }
  
  DFS(ver[0]);
  for(auto h : ver) adj[h].clear();

  for(int j = 0 ; j < S;j++) col[X[j]] = 0;
  for(int j = 0 ; j < T;j++) col[Y[j]] = 0;
  return dp[ver[0]];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...