Submission #1305800

#TimeUsernameProblemLanguageResultExecution timeMemory
1305800petezaSwapping Cities (APIO20_swap)C++20
100 / 100
393 ms14916 KiB
//baby do u kno what u wanna hearrrr
#include "swap.h"
#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int>> par[100005];
int h[100005];
int valid[100005];
int deg[100005];

int fpar(int x, int ct) {
  //find parent with time <= ct
  auto it = --upper_bound(par[x].begin(), par[x].end(), make_pair(ct, INT_MAX));
  //cout << x;
  return (it->second == x ? x : fpar(it->second, ct));
}

vector<int> wws;

void init(int N, int M, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
  for(int i=0;i<N;i++) {
    valid[i] = INT_MAX;
    par[i].clear(); h[i] = 0;
    par[i].emplace_back(0, i);
    //time 0 === parent = i
    deg[i] = 0;
  }
  wws = W; wws.push_back(0);
  sort(wws.begin(), wws.end());
  vector<int> edgord(M); iota(edgord.begin(), edgord.end(), 0);
  sort(edgord.begin(), edgord.end(), [&](int a, int b) {
    return W[a] < W[b];
  });
  for(int i=0;i<M;i++) {
    //at time i+1, add the i-th edge
    int a = fpar(U[edgord[i]], M), b = fpar(V[edgord[i]], M);
    if(a == b) {
      //formed cycle!!
      valid[a] = min(valid[a], i+1);
    } else {
      deg[U[edgord[i]]]++; deg[V[edgord[i]]]++;
      int na = a;
      if(h[a] > h[b]) {
        par[b].emplace_back(i+1, a);
      } else {
        par[a].emplace_back(i+1, b);
        na = b;
        h[b]++;
      }
      
      if(min(valid[a], valid[b]) < INT_MAX) valid[na] = min(valid[na], i+1);
      if(max(deg[U[edgord[i]]], deg[V[edgord[i]]]) > 2) valid[na] = min(valid[na], i+1);
    }
  }
}

int getMinimumFuelCapacity(int X, int Y) {
  //bsearch for first time
  int l=0, r=wws.size(), mid;
  while(l < r) {
    mid = (l+r) >> 1;
    int a = fpar(X, mid), b = fpar(Y, mid);
    if(a != b || mid < valid[a]) l = mid+1;
    else r = mid;
  }
  //cout << l << '\n';
  return (l>=wws.size()?-1:wws[l]);
}
#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...