Submission #1199168

#TimeUsernameProblemLanguageResultExecution timeMemory
1199168yeediotSwapping Cities (APIO20_swap)C++20
0 / 100
133 ms42416 KiB
#include "swap.h"
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define all(x) x.begin(),x.end()
#define pii pair<int,int>
#define pb push_back
#define sz(x) (int)(x.size())
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
#define vi vector<int>
#define vp vector<pii>
#define vvi vector<vi>
#define ykh mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count())
#define __lg(x) 63-__builtin_clzll(x)
const int mxn = 3e5 + 5;
int n, m, ty[mxn], cnt, val[mxn], jump[20][mxn], nxt[mxn], dep[mxn];
vector<int>adj[mxn];
struct DSU{
  int to[mxn], num[mxn], f[mxn], s[mxn];
  void init(){
    for(int i = 0; i < mxn; i++){
      to[i] = f[i] = s[i] = i;
      ty[i] = 0;
      num[i] = 1;
    }
  }
  int find(int x){
    return x == to[x] ? x : to[x] = find(to[x]);
  }
  void add(int x, int c, bool t = 1){
    cnt++;
    adj[cnt].pb(x);
    to[x] = cnt;
    val[cnt] = c;
    ty[cnt] = t;
  }
  void merge(int x, int y, int c){
    int ox = x, oy = y;
    x = find(x), y = find(y);
    if(x == y){
      if(ty[x] == 0){
        add(x, c);
      }
      else{

      }
    }
    else{
      if(ty[x] == 0 and ty[y] == 0){
        // 鏈 
        add(x, c);
        add(y, c);
        cnt++;
        adj[cnt].pb(cnt - 1);
        adj[cnt].pb(cnt - 2);
        val[cnt] = c;
        ty[cnt] = 1 - ((ox == f[x] or ox == s[x]) and (oy == f[y] or oy == s[y]));
        to[cnt - 1] = cnt;
        to[cnt - 2] = cnt;
        f[cnt] = f[x] ^ s[x] ^ ox;
        s[cnt] = f[y] ^ s[y] ^ oy;
      }
      else{
        cnt++;
        ty[cnt] = 1;
        val[cnt] = c;
        adj[cnt].pb(x);
        adj[cnt].pb(y);
        to[y] = cnt;
        to[x] = cnt;
      }
    }
  }
}d;
void dfs(int v, int pa){
  jump[0][v] = pa;
  nxt[v] = nxt[pa];
  dep[v] = dep[pa] + 1;
  if(ty[v] == 1) nxt[v] = v;
  for(auto u : adj[v]){
    dfs(u, v);
  }
}
int lca(int a, int b){
  if(dep[a] < dep[b]) swap(a, b);
  int dif = dep[a] - dep[b];
  for(int i = 19; i >= 0; i--){
    if(dif >> i & 1) a = jump[i][a];
  }
  if(a == b) return nxt[a];
  for(int i = 19; i >= 0; i--){
    if(jump[i][a] != jump[i][b]){
      a = jump[i][a], b = jump[i][b];
    }
  }
  return nxt[jump[0][a]];
}
void init(int N, int M, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
  n = N, m = M;
  d.init();
  vector<array<int, 3>>edges;
  for(int i = 0; i < m; i++){
    edges.pb({W[i], U[i] + 1, V[i] + 1});
  }
  sort(all(edges));
  cnt = n;
  for(auto [c, a, b] : edges){
    d.merge(a, b, c);
  }
  dfs(cnt, cnt);
  for(int i = 1; i < 20; i++){
    for(int j = 1; j <= cnt; j++){
      jump[i][j] = jump[i - 1][jump[i - 1][j]];
    }
  }
}

int getMinimumFuelCapacity(int X, int Y) {
  X++, Y++;
  int lc = lca(X, Y);
  if(lc == 0) return -1;
  else return val[lc];
  return 0;
}
#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...