답안 #546182

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
546182 2022-04-06T15:24:24 Z keta_tsimakuridze 낙하산 고리들 (IOI12_rings) C++14
52 / 100
1702 ms 262144 KB
#include<bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define pii pair<int,int>
const int N = 1e6 + 5;
int n, sz = 0, h[N];
int cycle[6], tried[6] , rem[6], stop = 0, p[N][6], built[2];
pii deg;
vector<int> V[6][N];
void Init(int N_) {
  n = N_;
  for(int i = 0; i < n; i++) {
  	for(int t = 0; t < 6; t++) {
  		p[i][t] = i;
	}
  }
}
int find(int a, int t) {
	return (p[a][t] == a ? p[a][t] :  p[a][t] = find(p[a][t], t));	
}
void merge(int a,int b, int t) {
	a = find(a, t); b = find(b, t);
	if(a == b) return;
	p[a][t] = b;
	return;
}
void dfs(int a, int p) {
	if(p == -1) h[a] = 1;
	else
	h[a] = h[p] + 1;
	for(int i = 0; i < V[5][a].size(); i++) {
		if(V[5][a][i] == p) continue;
		if(sz) return;
		if(h[V[5][a][i]]) { 
			sz = h[a] - h[V[5][a][i]] + 1;
			return;
		} else dfs(V[5][a][i], a);
	}
}
void add(int a, int b, int t) {
	if(a == rem[t] || b == rem[t]) return;
	V[t][a].push_back(b); V[t][b].push_back(a);
	tried[t] = max(tried[t], max((int)V[t][a].size(),(int)V[t][b].size()));
	if(find(a, t) == find(b, t)) cycle[t] = 1;
	else merge(a, b, t);
	return;	
}
void Link(int a, int b) {
	if(stop) return;
	V[5][a].push_back(b); V[5][b].push_back(a);
	deg = max(deg, {(int)V[5][a].size(), a});
	deg = max(deg, {(int)V[5][b].size(), b});
	if(find(a, 5) != find(b, 5)) {
		merge(a, b, 5);
	}
	else {
		if(!cycle[5]) {
			merge(a, b, 5);
			dfs(a, -1);
			cycle[5] = a + 1;
		}
		else if(find(a, 5) != find(cycle[5] - 1, 5)) {
			stop = 1;
		}
	}
	if(built[0]) {
		add(a, b, 0);
	}
	if(built[1]) {
		for(int i = 1; i <= 4; i++) add(a, b, i);
	}
	
}
void build(int t) {
	int u = rem[t];
	for(int i = 0; i < n; i++) {
		if(u == i) continue;
		for(int j = 0; j < V[5][i].size(); j++) {
			int v = V[5][i][j];
			if(v == u || v < i) continue;
			if(find(v, t) == find(i, t)) cycle[t] = 1;
			merge(i, v, t);
			V[t][i].push_back(v); V[t][v].push_back(i);
		}
	}
	for(int i = 0; i < n; i++) tried[t] = max(tried[t], (int)V[t][i].size());	
}
int CountCritical() {
	if(stop) return 0; 
	if(!cycle[5] && deg.f <= 2) return n;
	if(deg.f <= 2) return sz;
	
	if(deg.f >= 4) {
		if(!built[0]) {
			built[0] = 1;
			rem[0] = deg.s;
			build(0);
		}
		if(tried[0] <= 2 && !cycle[0]) return 1;
		stop = 1;
		return 0;
	}
	if(!built[1]) {
		built[1] = 1;
		rem[1] = deg.s; 
		if(V[5][rem[1]].size() != 3) {
			return 342432;
		}
		for(int i = 0; i < V[5][rem[1]].size(); i++) {
			rem[i + 2] = V[5][rem[1]][i]; 
		}
		for(int i = 1; i <= 4; i++) {
			build(i);
		}
	}
	int cn = 0;
	for(int i = 1; i <= 4; i++) {
		if(tried[i] <= 2 && !cycle[i]) cn++;
	}
	if(!cn) stop = 1;
	return cn;
}

Compilation message

rings.cpp: In function 'void dfs(int, int)':
rings.cpp:32:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  for(int i = 0; i < V[5][a].size(); i++) {
      |                 ~~^~~~~~~~~~~~~~~~
rings.cpp: In function 'void build(int)':
rings.cpp:79:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |   for(int j = 0; j < V[5][i].size(); j++) {
      |                  ~~^~~~~~~~~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:110:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  110 |   for(int i = 0; i < V[5][rem[1]].size(); i++) {
      |                  ~~^~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 141136 KB Output is correct
2 Correct 67 ms 141500 KB Output is correct
3 Correct 76 ms 141588 KB Output is correct
4 Correct 68 ms 141192 KB Output is correct
5 Correct 66 ms 141388 KB Output is correct
6 Correct 67 ms 141756 KB Output is correct
7 Correct 67 ms 141448 KB Output is correct
8 Correct 69 ms 141360 KB Output is correct
9 Correct 71 ms 142136 KB Output is correct
10 Correct 70 ms 142148 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 364 ms 169688 KB Output is correct
2 Correct 1164 ms 210000 KB Output is correct
3 Correct 539 ms 183756 KB Output is correct
4 Correct 942 ms 197708 KB Output is correct
5 Correct 949 ms 201220 KB Output is correct
6 Correct 1047 ms 229136 KB Output is correct
7 Correct 1463 ms 222136 KB Output is correct
8 Runtime error 1702 ms 262144 KB Execution killed with signal 9
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 141136 KB Output is correct
2 Correct 67 ms 141500 KB Output is correct
3 Correct 76 ms 141588 KB Output is correct
4 Correct 68 ms 141192 KB Output is correct
5 Correct 66 ms 141388 KB Output is correct
6 Correct 67 ms 141756 KB Output is correct
7 Correct 67 ms 141448 KB Output is correct
8 Correct 69 ms 141360 KB Output is correct
9 Correct 71 ms 142136 KB Output is correct
10 Correct 70 ms 142148 KB Output is correct
11 Correct 68 ms 142156 KB Output is correct
12 Correct 75 ms 143112 KB Output is correct
13 Correct 77 ms 143312 KB Output is correct
14 Correct 69 ms 141804 KB Output is correct
15 Correct 68 ms 141960 KB Output is correct
16 Correct 68 ms 141720 KB Output is correct
17 Correct 67 ms 141496 KB Output is correct
18 Correct 70 ms 141924 KB Output is correct
19 Correct 72 ms 141860 KB Output is correct
20 Correct 75 ms 142972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 141136 KB Output is correct
2 Correct 67 ms 141500 KB Output is correct
3 Correct 76 ms 141588 KB Output is correct
4 Correct 68 ms 141192 KB Output is correct
5 Correct 66 ms 141388 KB Output is correct
6 Correct 67 ms 141756 KB Output is correct
7 Correct 67 ms 141448 KB Output is correct
8 Correct 69 ms 141360 KB Output is correct
9 Correct 71 ms 142136 KB Output is correct
10 Correct 70 ms 142148 KB Output is correct
11 Correct 68 ms 142156 KB Output is correct
12 Correct 75 ms 143112 KB Output is correct
13 Correct 77 ms 143312 KB Output is correct
14 Correct 69 ms 141804 KB Output is correct
15 Correct 68 ms 141960 KB Output is correct
16 Correct 68 ms 141720 KB Output is correct
17 Correct 67 ms 141496 KB Output is correct
18 Correct 70 ms 141924 KB Output is correct
19 Correct 72 ms 141860 KB Output is correct
20 Correct 75 ms 142972 KB Output is correct
21 Correct 84 ms 143356 KB Output is correct
22 Correct 92 ms 144696 KB Output is correct
23 Correct 104 ms 145672 KB Output is correct
24 Correct 119 ms 146636 KB Output is correct
25 Correct 84 ms 144940 KB Output is correct
26 Correct 190 ms 155984 KB Output is correct
27 Correct 105 ms 145612 KB Output is correct
28 Correct 87 ms 143768 KB Output is correct
29 Correct 89 ms 144440 KB Output is correct
30 Correct 116 ms 147688 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 141136 KB Output is correct
2 Correct 67 ms 141500 KB Output is correct
3 Correct 76 ms 141588 KB Output is correct
4 Correct 68 ms 141192 KB Output is correct
5 Correct 66 ms 141388 KB Output is correct
6 Correct 67 ms 141756 KB Output is correct
7 Correct 67 ms 141448 KB Output is correct
8 Correct 69 ms 141360 KB Output is correct
9 Correct 71 ms 142136 KB Output is correct
10 Correct 70 ms 142148 KB Output is correct
11 Correct 364 ms 169688 KB Output is correct
12 Correct 1164 ms 210000 KB Output is correct
13 Correct 539 ms 183756 KB Output is correct
14 Correct 942 ms 197708 KB Output is correct
15 Correct 949 ms 201220 KB Output is correct
16 Correct 1047 ms 229136 KB Output is correct
17 Correct 1463 ms 222136 KB Output is correct
18 Runtime error 1702 ms 262144 KB Execution killed with signal 9
19 Halted 0 ms 0 KB -