Submission #1180373

#TimeUsernameProblemLanguageResultExecution timeMemory
1180373meisgood자매 도시 (APIO20_swap)C++20
100 / 100
588 ms99640 KiB
#include "swap.h"

#include <vector>
#include <bits/stdc++.h>
using namespace std ;
#define aaa 400003
// #define aaa 203
int n,m ;
int gp[aaa] ;
vector <int> gps[aaa] ;
int ok[aaa] ;
int dsu(int x){
  if (x==gp[x]) return x ;
  gp[x]=dsu(gp[x]) ;
  return gp[x] ;
}
void un(int a,int b,int nw){
  a=dsu(a),b=dsu(b) ;
  if (a==b){
    if (ok[a]==INT_MAX) for (auto x : gps[a]) ok[x]=nw ;
    return ;
  }
  if (gps[a].size()<gps[b].size()) swap(a,b) ;
  for (auto x : gps[b]) gps[a].push_back(x) ;
  gps[b].clear() ;
  gp[dsu(b)]=dsu(a) ;
}
int gp2[aaa] ;
int dsu2(int x){
  if (x==gp2[x]) return x ;
  gp2[x]=dsu2(gp2[x]) ;
  return gp2[x] ;
}
int anc[32][aaa] ;
int dep[aaa] ;
int ww[aaa] ;
vector <int> adj2[aaa] ;
void dfs(int x){
  for (auto a : adj2[x]) dep[a]=dep[x]+1,dfs(a) ;
}
int lca(int u,int v){
  if (dep[u]<dep[v]) swap(u,v) ;
  for (int k = 31 ; k >= 0 ; k --){
    if (dep[anc[k][u]]>=dep[v]) u=anc[k][u] ;
  }
  if (u==v) return u ;
  for (int k = 31 ; k >= 0 ; k --){
    if (anc[k][u]!=anc[k][v]) u=anc[k][u],v=anc[k][v] ;
  }
  return anc[0][u] ;
}
void init(int N, int M,
          std::vector<int> U, std::vector<int> V, std::vector<int> W) {
  n=N,m=M ;
  int i,j ;
  map <int,vector<pair<int,int>>> mp ;
  vector <int> adj[aaa] ;
  for (i = 0 ; i < n ; i ++) ok[i]=INT_MAX,gp[i]=i,gps[i].push_back(i) ;
  for (i = 0 ; i < m ; i ++){
    mp[W[i]].push_back({U[i],V[i]}) ;
    // mp[W[i]].push_back({V[i],U[i]}) ;
  }
  for (auto [x,v] : mp){
    for (auto [a,b] : v){
      adj[a].push_back(b) ;
      adj[b].push_back(a) ;
      if (ok[a]!=INT_MAX&&ok[b]==INT_MAX) for (auto aa : gps[dsu(b)]) ok[aa]=x ;
      if (ok[b]!=INT_MAX&&ok[a]==INT_MAX) for (auto aa : gps[dsu(a)]) ok[aa]=x ;
      un(a,b,x) ;
      if (adj[a].size()>=3){
        if (ok[a]==INT_MAX){
          for (auto aa : gps[dsu(a)]) ok[aa]=x ;
        }
      }
      if (adj[b].size()>=3){
        if (ok[b]==INT_MAX){
          for (auto aa : gps[dsu(b)]) ok[aa]=x ;
        }
      }
    }
  }
  // for (i = 0 ; i < n ; i ++) cout << ok[i] << " " ; cout << endl ;
  for (i = 0 ; i < n+m ; i ++) gp2[i]=i ;
  vector <pair<int,pair<int,int>>> adjj ;
  for (i = 0 ; i < m ; i ++) adjj.push_back({W[i],{U[i],V[i]}}) ;
  sort(adjj.begin(),adjj.end()) ;
  int cnt=n ;
  for (auto [w,abc] : adjj){
    auto [a,b]=abc ;
    if (dsu2(a)==dsu2(b)) continue ;
    a=dsu2(a),b=dsu2(b) ;
    gp2[a]=cnt,gp2[b]=cnt ;
    anc[0][a]=cnt,anc[0][b]=cnt ;
    adj2[cnt].push_back(a) ;
    adj2[cnt].push_back(b) ;
    ww[cnt]=w ;
    anc[0][cnt]=cnt ;
    cnt++ ;
  }
  dep[cnt-1]=0 ;
  dfs(cnt-1) ;
  for (int k = 1 ; k < 32 ; k ++){
    for (i = 0 ; i < cnt ; i ++){
      anc[k][i]=anc[k-1][anc[k-1][i]] ;
    }
  }
  // cout << ww[lca(1,3)] << endl ;
}

int getMinimumFuelCapacity(int X, int Y) {
  int mx=-1 ;
  mx=max(mx,ok[X]) ;
  mx=max(mx,ok[Y]) ;
  mx=max(mx,ww[lca(X,Y)]) ;
  if (mx==INT_MAX) mx=-1 ;
  return mx;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...