답안 #136284

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
136284 2019-07-25T05:37:41 Z 윤교준(#3260) Link (CEOI06_link) C++14
0 / 100
445 ms 35552 KB
#include <bits/stdc++.h>
#define pb push_back
#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;
void fuk() { puts("ERR!"); exit(-1); }

const bool debug = 0;

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; i <= N; i++) if(!A[i]) fuk();

	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);

	if(debug) {
	for(int i = 1; i <= N; i++)
		printf("%d ; %d / %d %d | %d\n", i, int(isC[i]), CI[i], CJ[i], dep[i]);
	for(int i = 0; i < Cn; i++) printf("Cy %d ; %d\n", i, CL[i]);
	}

	iota(O, O+N+1, 0); sort(O+2, O+N+1, [&](int a, int b) -> bool {
		if(isC[a] != isC[b]) return isC[b];
		if(!isC[a]) return dep[a] > dep[b];
		if(CI[a] != CI[b]) return CI[a] < CI[b];
		return CJ[a] < CJ[b];
	});
	
	for(int oi = 1, i; oi <= N; oi++) {
		i = O[oi];
		if(chk[i]) continue;
		if(1 != i && isC[i]) continue;
		if(isC[i]) goCycle(i, 1 == i ? K : K-1);
		else goTree(i, 1 == i ? K : K-1);
		if(debug) printf("Color %d\n", i);
		Ans++;
	}

	for(int i = 0; i < Cn; i++) {
		vector<bool> V;
		for(int v : CV[i]) V.pb(chk[v]);
		for(int v : CV[i]) V.pb(chk[v]);

		int l = CL[i]<<1;
		vector<vector<int>> nxt(20, vector<int>(l|1, l));
		for(int i = l; i--;) {
			if(V[i]) {
				nxt[0][i] = nxt[0][i+1];
			} else {
				nxt[0][i] = i;
			}
		}
		for(int i = 0, j; i < l; i++) {
			if(V[i]) continue;
			j = i+K-1;
			if(l <= j) nxt[0][i] = l;
			else nxt[0][i] = nxt[0][j+1];
		}
		for(int i = l; i--;) if(V[i]) nxt[0][i] = nxt[0][i+1];

		for(int j = 1; j < 20; j++) for(int i = 0; i < l; i++)
			nxt[j][i] = nxt[j-1][nxt[j-1][i]];

		if(debug) {
			printf("%d Cycle : l=%d : ", i, l);
			for(int v : CV[i]) printf("%d ", v); puts("");
			for(int j = 0; j < l; j++) printf("%d", int(V[j]));
			puts("");
		}

		int ret = N + 5;
		for(int k = 0; k < CL[i]; k++) if(!V[k]) {
			int t = 0, x = k;
			for(int j = 20, y; j--;) {
				y = nxt[j][x];
				if(k+CL[k] <= y) continue;
				else {
					t |= 1<<j;
					x = y;
				}
			}
			t++;
			if(t < ret) ret = t;
		}

		if(N+5 <= ret) ret = 0;
		
		if(debug) {
			printf("C %d ; %d\n", i, ret);
		}

		Ans += ret;
	}

	cout << Ans-1 << endl;
	return 0;
}

Compilation message

link.cpp: In function 'int main()':
link.cpp:155:4: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
    for(int v : CV[i]) printf("%d ", v); puts("");
    ^~~
link.cpp:155:41: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
    for(int v : CV[i]) printf("%d ", v); puts("");
                                         ^~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 4344 KB Output isn't correct
2 Incorrect 6 ms 4344 KB Output isn't correct
3 Incorrect 6 ms 4472 KB Output isn't correct
4 Incorrect 7 ms 4472 KB Output isn't correct
5 Incorrect 9 ms 4600 KB Output isn't correct
6 Incorrect 22 ms 6184 KB Output isn't correct
7 Incorrect 33 ms 6264 KB Output isn't correct
8 Incorrect 45 ms 7812 KB Output isn't correct
9 Incorrect 70 ms 13020 KB Output isn't correct
10 Incorrect 65 ms 11540 KB Output isn't correct
11 Incorrect 123 ms 35552 KB Output isn't correct
12 Incorrect 129 ms 9476 KB Output isn't correct
13 Incorrect 191 ms 20536 KB Output isn't correct
14 Incorrect 194 ms 21520 KB Output isn't correct
15 Incorrect 272 ms 29352 KB Output isn't correct
16 Incorrect 278 ms 34280 KB Output isn't correct
17 Incorrect 377 ms 31508 KB Output isn't correct
18 Incorrect 372 ms 25980 KB Output isn't correct
19 Incorrect 442 ms 27856 KB Output isn't correct
20 Incorrect 445 ms 28340 KB Output isn't correct
21 Incorrect 407 ms 32524 KB Output isn't correct
22 Incorrect 413 ms 32828 KB Output isn't correct
23 Incorrect 369 ms 32104 KB Output isn't correct
24 Incorrect 424 ms 33392 KB Output isn't correct
25 Incorrect 436 ms 33300 KB Output isn't correct