# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
150664 | graneli (#200) | 갈라파고스 여행 (FXCUP4_island) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "island.h"
#include <bits/stdc++.h>
#define F first
#define S second
#define mp make_pair
#define pb push_back
//#define ll __int128
#define ll long long
#define LEFT(a) ((a)<<1)
#define RIGHT(a) (LEFT(a) + 1)
#define MID(a,b) ((a+b)>>1)
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define y1 y122
using namespace std;
const int N = 300005;
int n, m;
vector < int > V[N];
int par[N];
set < pair < int, int > > S[N];
void Init(int K, std::vector<int> F, std::vector<int> S, std::vector<int> E){
n = F.size(), m = S.size();
// ToDo
for (int i = 0; i < n; i++){
S[i].insert ({m, i});
par[i] = i;
}
for (int i = m - 1; i >= 0; i--){
int u = S[i], v = E[i];
u = par[u];
v = par[v];
if (u == v)
continue;
if ((int)V[u].size() > (int)V[v].size())
swap (u, v);
for (int x : V[u]){
par[x] = v;
V[v].pb (x);
S[x].insert ({i, v});
}
V[u].clear();
}
}
int Separate(int A, int B){
int l = 0, r = m - 1;
while (l < r){
int mid = l + r + 1 >> 1;
int x, y;
auto I = S[A].lower_bound ({mid, 0});
x = (*I);
I = S[B].lower_bound ({mid, 0});
y = (*I);
if (x == y)
l = mid;
else
r = mid - 1;
}
return l;
}