답안 #74168

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
74168 2018-08-30T10:58:15 Z Bruteforceman 낙하산 고리들 (IOI12_rings) C++11
100 / 100
2133 ms 77768 KB
#include "bits/stdc++.h"
using namespace std;
int N;
struct dsu {
	bool cycle[1000010];
	int head[1000010];
	int tail[1000010];
	int par[1000010];
	int len[1000010];
	int cycle_cnt;
	int cycle_sum;
	bool bad;
	int no_of_nodes;
	int del_node;

	void init (int n) {
		no_of_nodes = n;
		del_node = -1;
		for(int i = 0; i < no_of_nodes; i++) {
			cycle[i] = false;
			head[i] = tail[i] = par[i] = i;
			len[i] = 1;
		}
		cycle_cnt = 0;
		cycle_sum = 0;
		bad = false;
	}
	int root(int x) {
		if(x == par[x]) return par[x];
		return par[x] = root(par[x]);
	}
	void add(int x, int y) {
		if(del_node == x || del_node == y) return ; 
		if(bad) return ;
		int p = root(x);
		int q = root(y);
		if(p == q) {
			if(cycle[p]) {
				bad = true;
				return ;
			} else if(head[p] == x && tail[p] == y) {
				cycle_cnt += 1;
				cycle_sum += len[p];
				cycle[p] = true;
			} else if (head[p] == y && tail[p] == x) {
				cycle_cnt += 1;
				cycle_sum += len[p];
				cycle[p] = true;
			} else {
				bad = true;
				return ;
			}
		} else {
			if(cycle[p] || cycle[q]) {
				bad = true;
				return ;
			}
			if(len[p] > len[q]) {
				swap(p, q);
				swap(x, y);
			}
			par[p] = q;
			len[q] += len[p];
			if(x == head[p]) {
				if(y == head[q]) {
					head[q] = tail[p];
				} else if (y == tail[q]) {
					tail[q] = tail[p];
				} else {
					bad = true;
					return ;
				}
			} else if (x == tail[p]) {
				if(y == head[q]) {
					head[q] = head[p];
				} else if (y == tail[q]) {
					tail[q] = head[p];
				} else {
					bad = true;
					return ;
				}
			} else {
				bad = true;
				return ;
			}
		}
	}
	int count() {
		if(bad) return 0;
		if(cycle_cnt <= 1) {
			if(cycle_cnt == 1) return cycle_sum;
			else return no_of_nodes;
		}
		return 0;
	}
} T[4];
int deg[1000010];
vector <int> l, r;
bool found_cand;

void Init(int N_) {
  N = N_;
  T[0].init(N);
  for(int i = 0; i < N; i++) {
  	deg[i] = 0;
  }
  l.clear(); r.clear();
  found_cand = false;
}
void Link(int A, int B) {
	if(found_cand) {
		for(int i = 0; i < 4; i++) {
			T[i].add(A, B);
		}
		return ;
	}
	++deg[A]; ++deg[B];
	l.emplace_back(A);
	r.emplace_back(B);
	if(deg[A] == 3 || deg[B] == 3) {
		vector <int> v;
		int can = deg[A] == 3 ? A : B;
		v.emplace_back(can);
		for(int i = 0; i < (int) l.size(); i++) {
			if(l[i] == can || r[i] == can) {
				v.emplace_back(l[i] ^ r[i] ^ can);
			}
		}
		for(int i = 0; i < 4; i++) {
			T[i].init(N);
			T[i].del_node = v[i];
		}
		found_cand = true;
	} else {
		T[0].add(A, B);
	}
	if(found_cand) {
		for(int i = 0; i < (int)l.size(); i++) {
			Link(l[i], r[i]);
		}
 		l.clear(); r.clear();
	}
}

int CountCritical() {
	if(found_cand) {
		int ans = 0;
		for(int i = 0; i < 4; i++) {
			if(T[i].cycle_cnt == 0 && !T[i].bad) {
				++ans;
			}
 		}
 		return ans;
	}
	return T[0].count();
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 4 ms 892 KB Output is correct
3 Correct 4 ms 952 KB Output is correct
4 Correct 2 ms 952 KB Output is correct
5 Correct 3 ms 952 KB Output is correct
6 Correct 3 ms 952 KB Output is correct
7 Correct 2 ms 1040 KB Output is correct
8 Correct 3 ms 1040 KB Output is correct
9 Correct 4 ms 1052 KB Output is correct
10 Correct 4 ms 1052 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 267 ms 15628 KB Output is correct
2 Correct 787 ms 59292 KB Output is correct
3 Correct 394 ms 71236 KB Output is correct
4 Correct 714 ms 71236 KB Output is correct
5 Correct 768 ms 71236 KB Output is correct
6 Correct 663 ms 71236 KB Output is correct
7 Correct 360 ms 71268 KB Output is correct
8 Correct 1762 ms 71916 KB Output is correct
9 Correct 2133 ms 77768 KB Output is correct
10 Correct 555 ms 77768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 4 ms 892 KB Output is correct
3 Correct 4 ms 952 KB Output is correct
4 Correct 2 ms 952 KB Output is correct
5 Correct 3 ms 952 KB Output is correct
6 Correct 3 ms 952 KB Output is correct
7 Correct 2 ms 1040 KB Output is correct
8 Correct 3 ms 1040 KB Output is correct
9 Correct 4 ms 1052 KB Output is correct
10 Correct 4 ms 1052 KB Output is correct
11 Correct 4 ms 77768 KB Output is correct
12 Correct 7 ms 77768 KB Output is correct
13 Correct 6 ms 77768 KB Output is correct
14 Correct 5 ms 77768 KB Output is correct
15 Correct 5 ms 77768 KB Output is correct
16 Correct 6 ms 77768 KB Output is correct
17 Correct 5 ms 77768 KB Output is correct
18 Correct 6 ms 77768 KB Output is correct
19 Correct 5 ms 77768 KB Output is correct
20 Correct 6 ms 77768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 4 ms 892 KB Output is correct
3 Correct 4 ms 952 KB Output is correct
4 Correct 2 ms 952 KB Output is correct
5 Correct 3 ms 952 KB Output is correct
6 Correct 3 ms 952 KB Output is correct
7 Correct 2 ms 1040 KB Output is correct
8 Correct 3 ms 1040 KB Output is correct
9 Correct 4 ms 1052 KB Output is correct
10 Correct 4 ms 1052 KB Output is correct
11 Correct 4 ms 77768 KB Output is correct
12 Correct 7 ms 77768 KB Output is correct
13 Correct 6 ms 77768 KB Output is correct
14 Correct 5 ms 77768 KB Output is correct
15 Correct 5 ms 77768 KB Output is correct
16 Correct 6 ms 77768 KB Output is correct
17 Correct 5 ms 77768 KB Output is correct
18 Correct 6 ms 77768 KB Output is correct
19 Correct 5 ms 77768 KB Output is correct
20 Correct 6 ms 77768 KB Output is correct
21 Correct 17 ms 77768 KB Output is correct
22 Correct 29 ms 77768 KB Output is correct
23 Correct 35 ms 77768 KB Output is correct
24 Correct 38 ms 77768 KB Output is correct
25 Correct 23 ms 77768 KB Output is correct
26 Correct 38 ms 77768 KB Output is correct
27 Correct 40 ms 77768 KB Output is correct
28 Correct 35 ms 77768 KB Output is correct
29 Correct 33 ms 77768 KB Output is correct
30 Correct 42 ms 77768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 4 ms 892 KB Output is correct
3 Correct 4 ms 952 KB Output is correct
4 Correct 2 ms 952 KB Output is correct
5 Correct 3 ms 952 KB Output is correct
6 Correct 3 ms 952 KB Output is correct
7 Correct 2 ms 1040 KB Output is correct
8 Correct 3 ms 1040 KB Output is correct
9 Correct 4 ms 1052 KB Output is correct
10 Correct 4 ms 1052 KB Output is correct
11 Correct 267 ms 15628 KB Output is correct
12 Correct 787 ms 59292 KB Output is correct
13 Correct 394 ms 71236 KB Output is correct
14 Correct 714 ms 71236 KB Output is correct
15 Correct 768 ms 71236 KB Output is correct
16 Correct 663 ms 71236 KB Output is correct
17 Correct 360 ms 71268 KB Output is correct
18 Correct 1762 ms 71916 KB Output is correct
19 Correct 2133 ms 77768 KB Output is correct
20 Correct 555 ms 77768 KB Output is correct
21 Correct 4 ms 77768 KB Output is correct
22 Correct 7 ms 77768 KB Output is correct
23 Correct 6 ms 77768 KB Output is correct
24 Correct 5 ms 77768 KB Output is correct
25 Correct 5 ms 77768 KB Output is correct
26 Correct 6 ms 77768 KB Output is correct
27 Correct 5 ms 77768 KB Output is correct
28 Correct 6 ms 77768 KB Output is correct
29 Correct 5 ms 77768 KB Output is correct
30 Correct 6 ms 77768 KB Output is correct
31 Correct 17 ms 77768 KB Output is correct
32 Correct 29 ms 77768 KB Output is correct
33 Correct 35 ms 77768 KB Output is correct
34 Correct 38 ms 77768 KB Output is correct
35 Correct 23 ms 77768 KB Output is correct
36 Correct 38 ms 77768 KB Output is correct
37 Correct 40 ms 77768 KB Output is correct
38 Correct 35 ms 77768 KB Output is correct
39 Correct 33 ms 77768 KB Output is correct
40 Correct 42 ms 77768 KB Output is correct
41 Correct 189 ms 77768 KB Output is correct
42 Correct 1065 ms 77768 KB Output is correct
43 Correct 287 ms 77768 KB Output is correct
44 Correct 378 ms 77768 KB Output is correct
45 Correct 535 ms 77768 KB Output is correct
46 Correct 562 ms 77768 KB Output is correct
47 Correct 672 ms 77768 KB Output is correct
48 Correct 366 ms 77768 KB Output is correct
49 Correct 548 ms 77768 KB Output is correct
50 Correct 553 ms 77768 KB Output is correct
51 Correct 324 ms 77768 KB Output is correct
52 Correct 327 ms 77768 KB Output is correct
53 Correct 305 ms 77768 KB Output is correct
54 Correct 1276 ms 77768 KB Output is correct
55 Correct 646 ms 77768 KB Output is correct