Submission #136264

# Submission time Handle Problem Language Result Execution time Memory
136264 2019-07-25T05:12:06 Z 윤교준(#3260) Link (CEOI06_link) C++14
0 / 100
333 ms 20308 KB
#include <bits/stdc++.h>
#define eb emplace_back
#define sz(V) ((int)(V).size())
#define allv(V) ((V).begin()),((V).end())
#define sorv(V) sort(allv(V))
#define univ(V) (V).erase(unique(allv(V)),(V).end())
#define INF (0x3f3f3f3f)
using namespace std;
typedef pair<int, int> pii;

const int MAXN = 500055;

struct DJF {
	DJF() { init(); }
	int ud[MAXN];

	void init() { iota(ud, ud+MAXN, 0); }
	int uf(int i) { return i == ud[i] ? i : (ud[i] = uf(ud[i])); }
	void uf(int a, int b) { ud[uf(b)] = uf(a); }
} djf, djfC;

vector<vector<int>> CV;
int CI[MAXN], CJ[MAXN], CL[MAXN], Cn;
bitset<MAXN> isC;

int dep[MAXN];

int A[MAXN], O[MAXN];
bitset<MAXN> ison, isdead, chk;

int N, K, Ans;

int getDC(int a, int b) { return CJ[a] <= CJ[b] ? CJ[b]-CJ[a] : CL[CI[a]] - (CJ[a]-CJ[b]); }
void goCycle(int v, int l) {
	for(int i = v;;) {
		i = djfC.uf(i);
		if(chk[i] || getDC(v, i) > l) break;
		chk[i] = true;
		djfC.uf(A[i], i);
	}
}

void goTree(int v, int l) {
	int i = v;
	for(;;) {
		i = djf.uf(i);
		if(isC[i]) break;
		if(dep[v] - dep[i] > l) break;
		chk[i] = true;
		djf.uf(A[i], i);
	}
	if(isC[i] && dep[v] - dep[i] <= l)
		goCycle(i, l - (dep[v] - dep[i]));
}

void dfs(int i) {
	isdead[i] = true;
	if(!isC[A[i]] && !isdead[A[i]]) dfs(A[i]);
	dep[i] = dep[A[i]] + 1;
	CI[i] = CI[A[i]];
}

int predfs(vector<int> &V, int i) {
	ison[i] = true; V.eb(i);
	if(isdead[A[i]]) return 0;
	if(ison[A[i]]) return A[i];
	int ret = predfs(V, A[i]);
	isdead[i] = true;
	return ret;
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);

	cin >> N >> K;
	for(int i = 0, a, b; i < N; i++) {
		cin >> a >> b;
		A[a] = b;
	}

	for(int i = 1, v; i <= N; i++) if(!isdead[i]) {
		vector<int> V;
		v = predfs(V, i);
		if(!v) continue;
		V.erase(V.begin(), find(allv(V), v));
		CV.eb(V);
		for(int j = 0, n = sz(V), v; j < n; j++) {
			v = V[j];
			isC[v] = true;
			CI[v] = Cn;
			CJ[v] = j;
		}
		CL[Cn] = sz(V);
		Cn++;
	}

	isdead.reset();
	for(int i = 1; i <= N; i++) if(!isC[i] && !isdead[i]) dfs(i);

	iota(O, O+N+1, 0); sort(O+2, O+N+1, [&](int a, int b) {
		return dep[a] > dep[b];
	});
	
	for(int oi = 1, i; oi <= N; oi++) {
		i = O[oi];
		if(chk[i]) continue;
		if(isC[i]) goCycle(i, 1 == i ? K : K-1);
		else goTree(i, 1 == i ? K : K-1);
		Ans++;
	}

	cout << Ans-1 << endl;
	return 0;
}
# Verdict Execution time Memory Grader output
1 Incorrect 5 ms 4344 KB Output isn't correct
2 Incorrect 5 ms 4344 KB Output isn't correct
3 Incorrect 6 ms 4344 KB Output isn't correct
4 Incorrect 6 ms 4472 KB Output isn't correct
5 Incorrect 7 ms 4600 KB Output isn't correct
6 Incorrect 17 ms 5240 KB Output isn't correct
7 Incorrect 26 ms 5656 KB Output isn't correct
8 Incorrect 36 ms 6392 KB Output isn't correct
9 Incorrect 51 ms 8020 KB Output isn't correct
10 Incorrect 52 ms 7636 KB Output isn't correct
11 Incorrect 78 ms 14112 KB Output isn't correct
12 Incorrect 108 ms 8768 KB Output isn't correct
13 Incorrect 144 ms 12448 KB Output isn't correct
14 Incorrect 170 ms 12972 KB Output isn't correct
15 Incorrect 221 ms 16228 KB Output isn't correct
16 Incorrect 235 ms 17636 KB Output isn't correct
17 Incorrect 293 ms 18524 KB Output isn't correct
18 Incorrect 309 ms 17496 KB Output isn't correct
19 Incorrect 309 ms 18160 KB Output isn't correct
20 Incorrect 326 ms 18240 KB Output isn't correct
21 Incorrect 333 ms 19428 KB Output isn't correct
22 Incorrect 319 ms 19644 KB Output isn't correct
23 Incorrect 308 ms 18904 KB Output isn't correct
24 Incorrect 315 ms 20028 KB Output isn't correct
25 Incorrect 323 ms 20308 KB Output isn't correct