Submission #151184

# Submission time Handle Problem Language Result Execution time Memory
151184 2019-09-02T04:30:24 Z imyujin Trip to the Galapagos Islands (FXCUP4_island) C++17
31 / 100
5000 ms 24528 KB
#include "island.h"
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;

#define eb emplace_back
#define allv(v) ((v).begin()),((v).end())

const int SQRTN = 320;
const int MAXN = SQRTN * SQRTN;
const int MAXM = 300010;
const int MX = 1 << 17;

int N, M;
vector<int> node[MAXN], ed[MAXN];
int uni[MAXN];
vector<int> idx[MAXN];
int mem[SQRTN][MAXN];
int bigidx[MAXN];
int seg[2 * MX];

int guni(int x) { return x == uni[x] ? x : guni(uni[x]); }

void mkseg(int idx, int l, int r) {
	if(l == r) seg[idx] = ed[0][l];
	else {
		int m = (l + r) / 2;
		mkseg(idx * 2, l, m);
		mkseg(idx * 2 + 1, m + 1, r);
		seg[idx] = min(seg[idx * 2], seg[idx * 2 + 1]);
	}
}

int gseg(int idx, int l, int r, int x, int y) {
	if(x <= l && r <= y) return seg[idx];
	else if(r < x || y < l) return M;
	int m = (l + r) / 2;
	return min(gseg(idx * 2, l, m, x, y), gseg(idx * 2 + 1, m + 1, r, x, y));
}
int gseg(int x, int y) { return gseg(1, 0, N - 2, x, y); }

void Init(int K, vector<int> F, vector<int> S, vector<int> E){
	N = F.size();
	M = S.size();
	for(int i = 0; i < N; i++) {
		uni[i] = i;
		node[i].eb(i);
	}

	for(int i = M - 1; i >= 0; i--) {
		S[i] = guni(S[i]);
		E[i] = guni(E[i]);
		if(S[i] == E[i]) continue;
		if(node[S[i]].size() < node[E[i]].size()) swap(S[i], E[i]);
		node[S[i]].insert(node[S[i]].end(), allv(node[E[i]]));
		ed[S[i]].eb(i);
		ed[S[i]].insert(ed[S[i]].end(), allv(ed[E[i]]));
		uni[E[i]] = S[i];
	}
	for(int i = 0; i < N; i++) if(i == uni[i]) {
		node[0] = node[i];
		ed[0] = ed[i];
	}
	for(int i = 0; i < N; i++) idx[F[node[0][i]]].eb(i);
	mkseg(1, 0, N - 2);

	int cnt = 0;
	for(int i = 0; i < K; i++) {
		if(idx[i].size() > SQRTN) {
			bigidx[i] = cnt++;
			int mn = M;
			for(int j = idx[i][0] + 1; j < N; j++) {
				mn = min(mn, ed[0][j - 1]);
				if(F[node[0][j]] == i) mn = M;
				else mem[bigidx[i]][F[node[0][j]]] = max(mem[bigidx[i]][F[node[0][j]]], mn);
			}
			mn = M;
			for(int j = idx[i].back() - 1; j >= 0; j--) {
				mn = min(mn, ed[0][j]);
				if(F[node[0][j]] == i) mn = M;
				else mem[bigidx[i]][F[node[0][j]]] = max(mem[bigidx[i]][F[node[0][j]]], mn);
			}
		}
		else bigidx[i] = -1;
	}
}

int Separate(int A, int B){
	if(bigidx[A] != -1) return mem[bigidx[A]][B] + 1;
	if(bigidx[B] != -1) return mem[bigidx[B]][A] + 1;

	int ans = 0;
	int pa = 0, pb = 0;
	while(pa < idx[A].size() && pb < idx[B].size()) {
		if(idx[A][pa] < idx[B][pb]) {
			ans = max(ans, gseg(idx[A][pa], idx[B][pb] - 1));
			pa++;
		}
		else {
			ans = max(ans, gseg(idx[B][pb], idx[A][pa] - 1));
			pb++;
		}
	}
	return ans + 1;
}

Compilation message

island.cpp: In function 'int Separate(int, int)':
island.cpp:95:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(pa < idx[A].size() && pb < idx[B].size()) {
        ~~~^~~~~~~~~~~~~~~
island.cpp:95:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while(pa < idx[A].size() && pb < idx[B].size()) {
                              ~~~^~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 241 ms 24060 KB Output is correct
2 Correct 248 ms 24188 KB Output is correct
3 Correct 245 ms 24528 KB Output is correct
4 Correct 245 ms 24416 KB Output is correct
5 Correct 244 ms 24312 KB Output is correct
6 Correct 245 ms 24032 KB Output is correct
7 Correct 247 ms 24420 KB Output is correct
8 Correct 242 ms 24160 KB Output is correct
9 Correct 241 ms 24416 KB Output is correct
10 Correct 243 ms 24260 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 7544 KB Output is correct
2 Correct 8 ms 7544 KB Output is correct
3 Correct 182 ms 21444 KB Output is correct
4 Correct 216 ms 21600 KB Output is correct
5 Correct 261 ms 21604 KB Output is correct
6 Correct 348 ms 21652 KB Output is correct
7 Correct 521 ms 21600 KB Output is correct
8 Correct 1002 ms 23336 KB Output is correct
9 Execution timed out 5037 ms 21332 KB Time limit exceeded
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 7544 KB Output is correct
2 Correct 8 ms 7544 KB Output is correct
3 Correct 241 ms 24060 KB Output is correct
4 Correct 248 ms 24188 KB Output is correct
5 Correct 245 ms 24528 KB Output is correct
6 Correct 245 ms 24416 KB Output is correct
7 Correct 244 ms 24312 KB Output is correct
8 Correct 245 ms 24032 KB Output is correct
9 Correct 247 ms 24420 KB Output is correct
10 Correct 242 ms 24160 KB Output is correct
11 Correct 241 ms 24416 KB Output is correct
12 Correct 243 ms 24260 KB Output is correct
13 Correct 182 ms 21444 KB Output is correct
14 Correct 216 ms 21600 KB Output is correct
15 Correct 261 ms 21604 KB Output is correct
16 Correct 348 ms 21652 KB Output is correct
17 Correct 521 ms 21600 KB Output is correct
18 Correct 1002 ms 23336 KB Output is correct
19 Execution timed out 5037 ms 21332 KB Time limit exceeded
20 Halted 0 ms 0 KB -