/* cerberus97 - Hanit Banga */
#include <iostream>
#include <iomanip>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#include "island.h"
using namespace std;
#define pb push_back
#define fast_cin() ios_base::sync_with_stdio(false); cin.tie(NULL)
typedef long long ll;
typedef long double ld;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
const int N = 1e5 + 10, M = 3e5 + 10, S = 150, BIG = N / S + 5;
int n, m;
int par[N], sz[N], max_seen[N];
vector<int> in_comp[N], at_islands[N];
vector<pii> roots[N];
int big_finch_id[N], big_precomp[BIG][N];
vector<int> big_finches;
bool is_big_finch[N], big_finches_done[BIG][N];
int get_root(int u);
void merge(int u, int v, int id, vector<int> &f);
void Init(int k, std::vector<int> f, std::vector<int> eu, std::vector<int> ev) {
// cout << (sizeof(big_finches_done) + sizeof(big_precomp)) / 1e6 << endl;
n = f.size(); m = eu.size();
for (int i = 0; i < n; ++i) {
par[i] = i;
sz[i] = 1;
in_comp[i] = {i};
roots[i].pb({m, i});
at_islands[f[i]].pb(i);
}
for (int i = 0; i < k; ++i) {
if (at_islands[i].size() >= S) {
big_finch_id[i] = big_finches.size();
big_finches.pb(i);
is_big_finch[i] = true;
for (auto &u : at_islands[i]) {
big_finches_done[big_finch_id[i]][u] = true;
big_precomp[big_finch_id[i]][f[u]] = m;
}
}
}
for (int i = m - 1; i >= 0; --i) {
merge(eu[i], ev[i], i, f);
}
}
int Separate(int A, int B) {
if (at_islands[A].size() < at_islands[B].size()) {
swap(A, B);
}
if (is_big_finch[A]) {
return big_precomp[big_finch_id[A]][B] + 1;
} else {
int ans = 1;
for (auto &u : at_islands[A]) {
for (auto &p : roots[u]) {
max_seen[p.second] = max(max_seen[p.second], p.first);
}
}
for (auto &v : at_islands[B]) {
for (auto &p : roots[v]) {
auto cand = min(max_seen[p.second], p.first) + 1;
ans = max(ans, cand);
}
}
for (auto &u : at_islands[A]) {
for (auto &p : roots[u]) {
max_seen[p.second] = 0;
}
}
return ans;
}
return 0;
}
int get_root(int u) {
if (u != par[u]) {
par[u] = get_root(par[u]);
}
return par[u];
}
void merge(int u, int v, int id, vector<int> &f) {
u = get_root(u);
v = get_root(v);
if (u == v) {
return;
} else if (sz[u] < sz[v]) {
swap(u, v);
}
for (auto &b : big_finches) {
int add_to = -1, bid = big_finch_id[b];
if (big_finches_done[bid][u] xor big_finches_done[bid][v]) {
add_to = (big_finches_done[bid][u] ? v : u);
big_finches_done[bid][add_to] = true;
for (auto &w : in_comp[add_to]) {
big_precomp[bid][f[w]] = max(big_precomp[bid][f[w]], id);
}
}
}
par[v] = u;
sz[u] += sz[v];
for (auto &w : in_comp[v]) {
in_comp[u].pb(w);
roots[w].pb({id, u});
}
in_comp[v].clear();
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
274 ms |
26596 KB |
Output is correct |
2 |
Correct |
291 ms |
26592 KB |
Output is correct |
3 |
Correct |
297 ms |
26572 KB |
Output is correct |
4 |
Correct |
278 ms |
26720 KB |
Output is correct |
5 |
Correct |
309 ms |
26572 KB |
Output is correct |
6 |
Correct |
277 ms |
26592 KB |
Output is correct |
7 |
Correct |
306 ms |
26596 KB |
Output is correct |
8 |
Correct |
282 ms |
26596 KB |
Output is correct |
9 |
Correct |
286 ms |
26532 KB |
Output is correct |
10 |
Correct |
295 ms |
26616 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
7416 KB |
Output is correct |
2 |
Correct |
9 ms |
7420 KB |
Output is correct |
3 |
Correct |
220 ms |
24024 KB |
Output is correct |
4 |
Correct |
237 ms |
24928 KB |
Output is correct |
5 |
Correct |
305 ms |
26340 KB |
Output is correct |
6 |
Correct |
375 ms |
28996 KB |
Output is correct |
7 |
Correct |
554 ms |
34236 KB |
Output is correct |
8 |
Correct |
1119 ms |
48256 KB |
Output is correct |
9 |
Correct |
2819 ms |
81428 KB |
Output is correct |
10 |
Correct |
1161 ms |
23908 KB |
Output is correct |
11 |
Correct |
1183 ms |
23908 KB |
Output is correct |
12 |
Correct |
1129 ms |
23852 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
7416 KB |
Output is correct |
2 |
Correct |
9 ms |
7420 KB |
Output is correct |
3 |
Correct |
274 ms |
26596 KB |
Output is correct |
4 |
Correct |
291 ms |
26592 KB |
Output is correct |
5 |
Correct |
297 ms |
26572 KB |
Output is correct |
6 |
Correct |
278 ms |
26720 KB |
Output is correct |
7 |
Correct |
309 ms |
26572 KB |
Output is correct |
8 |
Correct |
277 ms |
26592 KB |
Output is correct |
9 |
Correct |
306 ms |
26596 KB |
Output is correct |
10 |
Correct |
282 ms |
26596 KB |
Output is correct |
11 |
Correct |
286 ms |
26532 KB |
Output is correct |
12 |
Correct |
295 ms |
26616 KB |
Output is correct |
13 |
Correct |
220 ms |
24024 KB |
Output is correct |
14 |
Correct |
237 ms |
24928 KB |
Output is correct |
15 |
Correct |
305 ms |
26340 KB |
Output is correct |
16 |
Correct |
375 ms |
28996 KB |
Output is correct |
17 |
Correct |
554 ms |
34236 KB |
Output is correct |
18 |
Correct |
1119 ms |
48256 KB |
Output is correct |
19 |
Correct |
2819 ms |
81428 KB |
Output is correct |
20 |
Correct |
1161 ms |
23908 KB |
Output is correct |
21 |
Correct |
1183 ms |
23908 KB |
Output is correct |
22 |
Correct |
1129 ms |
23852 KB |
Output is correct |
23 |
Correct |
942 ms |
24212 KB |
Output is correct |
24 |
Correct |
593 ms |
24008 KB |
Output is correct |
25 |
Correct |
457 ms |
24000 KB |
Output is correct |
26 |
Correct |
432 ms |
24068 KB |
Output is correct |
27 |
Correct |
537 ms |
24132 KB |
Output is correct |
28 |
Correct |
291 ms |
24676 KB |
Output is correct |
29 |
Correct |
292 ms |
25188 KB |
Output is correct |
30 |
Correct |
299 ms |
25952 KB |
Output is correct |
31 |
Correct |
281 ms |
26468 KB |
Output is correct |
32 |
Correct |
281 ms |
26596 KB |
Output is correct |