답안 #587184

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
587184 2022-07-01T12:57:56 Z GioChkhaidze 낙하산 고리들 (IOI12_rings) C++14
20 / 100
1773 ms 139016 KB
#include <bits/stdc++.h>

#define pb push_back
#define f first
#define s second

using namespace std;

const int Nn = 1e6 + 6;

bool cycle, rekt, f[Nn], us[Nn], in_cycle[Nn];
int n, ans, degreemax, len, comp, p[Nn], sz[Nn];
set < pair < int , int > > st;
vector < int > v[Nn];

int P(int x) {
	if (p[x] == x) return x;
	return p[x] = P(p[x]);
}

void Init(int N_) {
	n = ans = N_;
	degreemax = 0;
	for (int i = 0; i < n; ++i) {
		st.insert({v[i].size(), i});
		p[i] = i;
	}
}

void dfs(int x, int p, int fn) {
	++len;
	in_cycle[x] = true;
	if (x == fn)  { cycle = true; return ; }
	for (int i = 0; i < v[x].size(); ++i) {
		int to = v[x][i];
		if (to != p) dfs(to, x, fn);
		if (cycle) return ;
	}
	in_cycle[x] = false;
	--len;
}

void Link(int A, int B) {
	int ap = P(A), bp = P(B);	
	if (ap != bp) {
		if (sz[ap] < sz[bp]) swap(ap, bp);	
		sz[ap] += sz[bp];
		p[bp] = ap;
	}
		else {
		if (!cycle) {
			comp = A;
			dfs(A, A, B);
			assert(cycle == true);
		}		
			else
		if (cycle && P(comp) != ap) {
			rekt = true;
		}
	}
	
	st.erase(st.find({v[A].size(), A}));
	st.erase(st.find({v[B].size(), B}));
	v[A].pb(B), v[B].pb(A);
	st.insert({v[A].size(), A});
	st.insert({v[B].size(), B});
	if (v[A].size() > v[degreemax].size()) degreemax = A;
	if (v[B].size() > v[degreemax].size()) degreemax = B;
}

bool check(int x) {
	if (cycle && !in_cycle[x]) return 0;
	st.erase(st.find({v[x].size(), x}));
	for (int i = 0; i < v[x].size(); ++i) {
		int to = v[x][i];
		st.erase(st.find({v[to].size(), to}));
		st.insert({v[to].size() - 1, to});
	}
	
	bool ok = true;
	if (st.size() && (*st.rbegin()).f > 2) ok = false;
	for (int i = 0; i < v[x].size(); ++i) {
		int to = v[x][i];
		st.erase(st.find({v[to].size() - 1, to}));
		st.insert({v[to].size(), to});
	}
	st.insert({v[x].size(), x});
	return ok;
}

int CountCritical() {
	if (rekt) return 0;
	assert(n <= 5000);
	if (v[degreemax].size() <= 2) {
		if (!cycle) return n;
		return len;
	}
	int res = 0;
	for (int i = 0; i < n; ++i) {
		res += check(i);
	}
	return res;
	
	if (v[degreemax].size() > 3) {
		if (cycle && !in_cycle[degreemax]) return 0;
		
		st.erase(st.find({v[degreemax].size(), degreemax}));
		if ((*st.rbegin()).f > 3) return 0;
		st.insert({v[degreemax].size(), degreemax});
		
		for (int i = 0; i < v[degreemax].size(); ++i) {
			us[v[degreemax][i]] = true;
		}
		
		bool ok = true;
		for (int i = 0; i < n; ++i) {
			if (i != degreemax && !us[i] && v[i].size() > 2) {
				ok = false;
				break;
			} 
		}
		
		for (int i = 0; i < v[degreemax].size(); ++i) {
			us[v[degreemax][i]] = false;
		}
		
		return ok;
	}
	
	if (v[degreemax].size() == 3) {
		int res = 0;
		res += check(degreemax);
		res += check(v[degreemax][0]);
		res += check(v[degreemax][1]);
		res += check(v[degreemax][2]);
		return res;
	}
}

Compilation message

rings.cpp: In function 'void dfs(int, int, int)':
rings.cpp:34:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |  for (int i = 0; i < v[x].size(); ++i) {
      |                  ~~^~~~~~~~~~~~~
rings.cpp: In function 'bool check(int)':
rings.cpp:74:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |  for (int i = 0; i < v[x].size(); ++i) {
      |                  ~~^~~~~~~~~~~~~
rings.cpp:82:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |  for (int i = 0; i < v[x].size(); ++i) {
      |                  ~~^~~~~~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:111:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |   for (int i = 0; i < v[degreemax].size(); ++i) {
      |                   ~~^~~~~~~~~~~~~~~~~~~~~
rings.cpp:123:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  123 |   for (int i = 0; i < v[degreemax].size(); ++i) {
      |                   ~~^~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23764 KB Output is correct
2 Correct 20 ms 24148 KB Output is correct
3 Correct 26 ms 24276 KB Output is correct
4 Correct 13 ms 23892 KB Output is correct
5 Correct 18 ms 24092 KB Output is correct
6 Correct 18 ms 24400 KB Output is correct
7 Correct 14 ms 24020 KB Output is correct
8 Correct 16 ms 24076 KB Output is correct
9 Correct 25 ms 24276 KB Output is correct
10 Correct 24 ms 24236 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1773 ms 139016 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23764 KB Output is correct
2 Correct 20 ms 24148 KB Output is correct
3 Correct 26 ms 24276 KB Output is correct
4 Correct 13 ms 23892 KB Output is correct
5 Correct 18 ms 24092 KB Output is correct
6 Correct 18 ms 24400 KB Output is correct
7 Correct 14 ms 24020 KB Output is correct
8 Correct 16 ms 24076 KB Output is correct
9 Correct 25 ms 24276 KB Output is correct
10 Correct 24 ms 24236 KB Output is correct
11 Incorrect 80 ms 24220 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23764 KB Output is correct
2 Correct 20 ms 24148 KB Output is correct
3 Correct 26 ms 24276 KB Output is correct
4 Correct 13 ms 23892 KB Output is correct
5 Correct 18 ms 24092 KB Output is correct
6 Correct 18 ms 24400 KB Output is correct
7 Correct 14 ms 24020 KB Output is correct
8 Correct 16 ms 24076 KB Output is correct
9 Correct 25 ms 24276 KB Output is correct
10 Correct 24 ms 24236 KB Output is correct
11 Incorrect 80 ms 24220 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 23764 KB Output is correct
2 Correct 20 ms 24148 KB Output is correct
3 Correct 26 ms 24276 KB Output is correct
4 Correct 13 ms 23892 KB Output is correct
5 Correct 18 ms 24092 KB Output is correct
6 Correct 18 ms 24400 KB Output is correct
7 Correct 14 ms 24020 KB Output is correct
8 Correct 16 ms 24076 KB Output is correct
9 Correct 25 ms 24276 KB Output is correct
10 Correct 24 ms 24236 KB Output is correct
11 Runtime error 1773 ms 139016 KB Execution killed with signal 6
12 Halted 0 ms 0 KB -