/* 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 = 250, 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 |
271 ms |
26596 KB |
Output is correct |
2 |
Correct |
287 ms |
26720 KB |
Output is correct |
3 |
Correct |
283 ms |
26724 KB |
Output is correct |
4 |
Correct |
295 ms |
26716 KB |
Output is correct |
5 |
Correct |
279 ms |
26636 KB |
Output is correct |
6 |
Correct |
303 ms |
26664 KB |
Output is correct |
7 |
Correct |
295 ms |
26532 KB |
Output is correct |
8 |
Correct |
281 ms |
26660 KB |
Output is correct |
9 |
Correct |
300 ms |
26592 KB |
Output is correct |
10 |
Correct |
302 ms |
26608 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
7416 KB |
Output is correct |
2 |
Correct |
8 ms |
7416 KB |
Output is correct |
3 |
Correct |
222 ms |
24128 KB |
Output is correct |
4 |
Correct |
264 ms |
25000 KB |
Output is correct |
5 |
Correct |
315 ms |
26524 KB |
Output is correct |
6 |
Correct |
369 ms |
29032 KB |
Output is correct |
7 |
Correct |
549 ms |
34184 KB |
Output is correct |
8 |
Correct |
1087 ms |
48356 KB |
Output is correct |
9 |
Correct |
2165 ms |
23904 KB |
Output is correct |
10 |
Correct |
1142 ms |
23904 KB |
Output is correct |
11 |
Correct |
1212 ms |
23908 KB |
Output is correct |
12 |
Correct |
1177 ms |
23780 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
7416 KB |
Output is correct |
2 |
Correct |
8 ms |
7416 KB |
Output is correct |
3 |
Correct |
271 ms |
26596 KB |
Output is correct |
4 |
Correct |
287 ms |
26720 KB |
Output is correct |
5 |
Correct |
283 ms |
26724 KB |
Output is correct |
6 |
Correct |
295 ms |
26716 KB |
Output is correct |
7 |
Correct |
279 ms |
26636 KB |
Output is correct |
8 |
Correct |
303 ms |
26664 KB |
Output is correct |
9 |
Correct |
295 ms |
26532 KB |
Output is correct |
10 |
Correct |
281 ms |
26660 KB |
Output is correct |
11 |
Correct |
300 ms |
26592 KB |
Output is correct |
12 |
Correct |
302 ms |
26608 KB |
Output is correct |
13 |
Correct |
222 ms |
24128 KB |
Output is correct |
14 |
Correct |
264 ms |
25000 KB |
Output is correct |
15 |
Correct |
315 ms |
26524 KB |
Output is correct |
16 |
Correct |
369 ms |
29032 KB |
Output is correct |
17 |
Correct |
549 ms |
34184 KB |
Output is correct |
18 |
Correct |
1087 ms |
48356 KB |
Output is correct |
19 |
Correct |
2165 ms |
23904 KB |
Output is correct |
20 |
Correct |
1142 ms |
23904 KB |
Output is correct |
21 |
Correct |
1212 ms |
23908 KB |
Output is correct |
22 |
Correct |
1177 ms |
23780 KB |
Output is correct |
23 |
Correct |
936 ms |
24104 KB |
Output is correct |
24 |
Correct |
597 ms |
24156 KB |
Output is correct |
25 |
Correct |
448 ms |
24032 KB |
Output is correct |
26 |
Correct |
362 ms |
24148 KB |
Output is correct |
27 |
Correct |
326 ms |
24160 KB |
Output is correct |
28 |
Correct |
290 ms |
24744 KB |
Output is correct |
29 |
Correct |
290 ms |
25224 KB |
Output is correct |
30 |
Correct |
288 ms |
25956 KB |
Output is correct |
31 |
Correct |
288 ms |
26520 KB |
Output is correct |
32 |
Correct |
302 ms |
26528 KB |
Output is correct |