Submission #351398

# Submission time Handle Problem Language Result Execution time Memory
351398 2021-01-20T03:17:52 Z Kevin_Zhang_TW Parachute rings (IOI12_rings) C++17
100 / 100
2307 ms 141336 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define pb emplace_back
#define AI(i) begin(i), end(i)
template<class T> bool chmin(T &a, T b) { return b < a && (a = b, true); }
template<class T> bool chmax(T &a, T b) { return a < b && (a = b, true); }
#ifdef KEV
#define DE(args...) kout("[ " + string(#args) + " ] = ", args)
void kout() { cerr << endl; }
template<class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ', kout(b...); }
template<class T> void debug(T L, T R) { while (L != R) cerr << *L << " \n"[next(L) == R], ++L; }
#else
//#include "lib1270.h"
#define DE(...) 0
#define debug(...) 0
#endif
 
const int MAX_N = 1000005;
 
int N, glob;
 
struct dsu {
	vector<int> g, sz;
	vector<short> deg;
 
	int n, badcnt, allbad, answer;
 
	dsu() {};
	dsu (int n, int size) : n(n), answer(size), badcnt(0), allbad(0) { 
		g.resize(n), sz.resize(n, 1), deg.resize(n);
		iota(AI(g), 0); 
	}
 
	int F(int i) { return i == g[i] ? i : g[i] = F(g[i]); }
 
	void M(int a, int b) { 
 
		if (max(++deg[a], ++deg[b]) >= 3) allbad = true;
 
		if (allbad) return;
 
		a = F(a), b = F(b);
		if (sz[a] < sz[b]) swap(a, b);
 
		if (a != b) {
			return sz[a] += sz[b], g[b] = a, void();
		}
		if (++badcnt == 2) allbad = true;
		answer = sz[a];
	}
	bool noring() { return badcnt == 0 && allbad == false; }
 
	int getans() { 
		return allbad ? 0 : answer;
	}
};
 
dsu alld, forone;
 
vector<int> edge[MAX_N];
 
bool iscan[MAX_N];
 
vector<int> big, can;
 
vector<dsu> forcan;
vector<pair<int,int>> alledge;
 
int over = -1, lst;

void canpush(int id) { if (iscan[id]) return; iscan[id] = true, can.pb(id); }
 
void Init(int N_) {
	for (int i = 0;i < N;++i) edge[i].clear(), iscan[i] = false, edge[i].shrink_to_fit();
	big.clear(), can.clear(), forcan.clear(), alledge.clear(), over = -1, lst = 0, alld = forone = dsu();

	N = N_;
	glob = N;
	alld = dsu(N, N);

}
 
void makebig() {
	if (lst == 0)
		forone = dsu(N, N-1);
	while (lst < alledge.size()) {
		auto [a, b] = alledge[lst++];
		if (a != over && b != over)
			forone.M(a, b);
	}
	if (!forone.noring()) glob = -1;
}
void superbig(int id) {
	if (over == -1) {
		over = id;
		return;
	}
	else if (over != id) {
		glob = -1;
		return;
	}
}
void adjust(int a, int b) {

	if (glob == -1) return;
 
	if (big.empty()) {
 
		alld.M(a, b);
 
		glob = alld.getans();
 
		if (glob == 0) --glob;

		return;
	}
 
 	// deal with old ones
 	int oldsize = can.size();
 	for (int i = 0;i < oldsize;++i) {
 		int x = can[i];
 		if (a != x && b != x)
 			forcan[i].M(a, b);
 	}
 
	// put new element into candidate
	for (int x : big) {
		// assert(edge[x].size() <= 3);
		canpush(x);
		for (int u : edge[x]) canpush(u);
	}

	assert(can.size() <= 16);
	// examine new candidates
 
 	for (int i = oldsize;i < can.size();++i) {
 		forcan.pb(N, N-1);
 		int x = can[i];
 		for (auto [a, b] : alledge) if (a != x && b != x) {
 			forcan[i].M(a, b);
 		}
 	}
 
	// assert(forcan.size() == can.size());
 
	glob = 0;
 
 	// examine all candidates
 	for (int i = 0;i < can.size();++i) 
 		glob += forcan[i].noring();
 
}
void Link(int A, int B) {
	if (glob <= 0) return;
 
	edge[A].pb(B), edge[B].pb(A);
 
	if (edge[A].size() == 3) big.pb(A);
	if (edge[B].size() == 3) big.pb(B);
 
	alledge.pb(A, B);
 
 	if (edge[A].size() > 3) superbig(A);
 	if (edge[B].size() > 3) superbig(B);
 
	if (over != -1) return makebig(), void();
 
 	if (big.size() > 3) {
 		glob = -1;
 		return;
 	}
	
	adjust(A, B);
}
 
int CountCritical() {
	if (glob <= 0) return 0;
	if (over != -1) return forone.noring();
	return max(glob, 0);
}

Compilation message

rings.cpp: In constructor 'dsu::dsu(int, int)':
rings.cpp:27:25: warning: 'dsu::answer' will be initialized after [-Wreorder]
   27 |  int n, badcnt, allbad, answer;
      |                         ^~~~~~
rings.cpp:27:9: warning:   'int dsu::badcnt' [-Wreorder]
   27 |  int n, badcnt, allbad, answer;
      |         ^~~~~~
rings.cpp:30:2: warning:   when initialized here [-Wreorder]
   30 |  dsu (int n, int size) : n(n), answer(size), badcnt(0), allbad(0) {
      |  ^~~
rings.cpp: In function 'void makebig()':
rings.cpp:87:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |  while (lst < alledge.size()) {
      |         ~~~~^~~~~~~~~~~~~~~~
rings.cpp: In function 'void adjust(int, int)':
rings.cpp:137:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  137 |   for (int i = oldsize;i < can.size();++i) {
      |                        ~~^~~~~~~~~~~~
rings.cpp:150:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  150 |   for (int i = 0;i < can.size();++i)
      |                  ~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 16 ms 23788 KB Output is correct
2 Correct 19 ms 24300 KB Output is correct
3 Correct 19 ms 24428 KB Output is correct
4 Correct 17 ms 23916 KB Output is correct
5 Correct 20 ms 24044 KB Output is correct
6 Correct 19 ms 24172 KB Output is correct
7 Correct 19 ms 24428 KB Output is correct
8 Correct 18 ms 24044 KB Output is correct
9 Correct 20 ms 24428 KB Output is correct
10 Correct 20 ms 24428 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 523 ms 49256 KB Output is correct
2 Correct 1299 ms 102088 KB Output is correct
3 Correct 332 ms 112492 KB Output is correct
4 Correct 1296 ms 72632 KB Output is correct
5 Correct 1275 ms 72736 KB Output is correct
6 Correct 1209 ms 71528 KB Output is correct
7 Correct 322 ms 112620 KB Output is correct
8 Correct 1927 ms 124492 KB Output is correct
9 Correct 2307 ms 141336 KB Output is correct
10 Correct 850 ms 70600 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 23788 KB Output is correct
2 Correct 19 ms 24300 KB Output is correct
3 Correct 19 ms 24428 KB Output is correct
4 Correct 17 ms 23916 KB Output is correct
5 Correct 20 ms 24044 KB Output is correct
6 Correct 19 ms 24172 KB Output is correct
7 Correct 19 ms 24428 KB Output is correct
8 Correct 18 ms 24044 KB Output is correct
9 Correct 20 ms 24428 KB Output is correct
10 Correct 20 ms 24428 KB Output is correct
11 Correct 20 ms 24428 KB Output is correct
12 Correct 24 ms 24940 KB Output is correct
13 Correct 24 ms 25216 KB Output is correct
14 Correct 22 ms 24684 KB Output is correct
15 Correct 20 ms 25324 KB Output is correct
16 Correct 21 ms 24352 KB Output is correct
17 Correct 19 ms 24428 KB Output is correct
18 Correct 21 ms 25708 KB Output is correct
19 Correct 21 ms 24428 KB Output is correct
20 Correct 23 ms 25196 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 23788 KB Output is correct
2 Correct 19 ms 24300 KB Output is correct
3 Correct 19 ms 24428 KB Output is correct
4 Correct 17 ms 23916 KB Output is correct
5 Correct 20 ms 24044 KB Output is correct
6 Correct 19 ms 24172 KB Output is correct
7 Correct 19 ms 24428 KB Output is correct
8 Correct 18 ms 24044 KB Output is correct
9 Correct 20 ms 24428 KB Output is correct
10 Correct 20 ms 24428 KB Output is correct
11 Correct 20 ms 24428 KB Output is correct
12 Correct 24 ms 24940 KB Output is correct
13 Correct 24 ms 25216 KB Output is correct
14 Correct 22 ms 24684 KB Output is correct
15 Correct 20 ms 25324 KB Output is correct
16 Correct 21 ms 24352 KB Output is correct
17 Correct 19 ms 24428 KB Output is correct
18 Correct 21 ms 25708 KB Output is correct
19 Correct 21 ms 24428 KB Output is correct
20 Correct 23 ms 25196 KB Output is correct
21 Correct 36 ms 25596 KB Output is correct
22 Correct 49 ms 26596 KB Output is correct
23 Correct 64 ms 27564 KB Output is correct
24 Correct 76 ms 31464 KB Output is correct
25 Correct 34 ms 30060 KB Output is correct
26 Correct 64 ms 32100 KB Output is correct
27 Correct 64 ms 27876 KB Output is correct
28 Correct 44 ms 28396 KB Output is correct
29 Correct 47 ms 33132 KB Output is correct
30 Correct 105 ms 28780 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 16 ms 23788 KB Output is correct
2 Correct 19 ms 24300 KB Output is correct
3 Correct 19 ms 24428 KB Output is correct
4 Correct 17 ms 23916 KB Output is correct
5 Correct 20 ms 24044 KB Output is correct
6 Correct 19 ms 24172 KB Output is correct
7 Correct 19 ms 24428 KB Output is correct
8 Correct 18 ms 24044 KB Output is correct
9 Correct 20 ms 24428 KB Output is correct
10 Correct 20 ms 24428 KB Output is correct
11 Correct 523 ms 49256 KB Output is correct
12 Correct 1299 ms 102088 KB Output is correct
13 Correct 332 ms 112492 KB Output is correct
14 Correct 1296 ms 72632 KB Output is correct
15 Correct 1275 ms 72736 KB Output is correct
16 Correct 1209 ms 71528 KB Output is correct
17 Correct 322 ms 112620 KB Output is correct
18 Correct 1927 ms 124492 KB Output is correct
19 Correct 2307 ms 141336 KB Output is correct
20 Correct 850 ms 70600 KB Output is correct
21 Correct 20 ms 24428 KB Output is correct
22 Correct 24 ms 24940 KB Output is correct
23 Correct 24 ms 25216 KB Output is correct
24 Correct 22 ms 24684 KB Output is correct
25 Correct 20 ms 25324 KB Output is correct
26 Correct 21 ms 24352 KB Output is correct
27 Correct 19 ms 24428 KB Output is correct
28 Correct 21 ms 25708 KB Output is correct
29 Correct 21 ms 24428 KB Output is correct
30 Correct 23 ms 25196 KB Output is correct
31 Correct 36 ms 25596 KB Output is correct
32 Correct 49 ms 26596 KB Output is correct
33 Correct 64 ms 27564 KB Output is correct
34 Correct 76 ms 31464 KB Output is correct
35 Correct 34 ms 30060 KB Output is correct
36 Correct 64 ms 32100 KB Output is correct
37 Correct 64 ms 27876 KB Output is correct
38 Correct 44 ms 28396 KB Output is correct
39 Correct 47 ms 33132 KB Output is correct
40 Correct 105 ms 28780 KB Output is correct
41 Correct 267 ms 38876 KB Output is correct
42 Correct 806 ms 84436 KB Output is correct
43 Correct 303 ms 82404 KB Output is correct
44 Correct 296 ms 69484 KB Output is correct
45 Correct 581 ms 127480 KB Output is correct
46 Correct 831 ms 64344 KB Output is correct
47 Correct 1068 ms 65728 KB Output is correct
48 Correct 326 ms 114284 KB Output is correct
49 Correct 796 ms 64972 KB Output is correct
50 Correct 850 ms 64524 KB Output is correct
51 Correct 340 ms 76648 KB Output is correct
52 Correct 302 ms 60692 KB Output is correct
53 Correct 286 ms 113580 KB Output is correct
54 Correct 1626 ms 118768 KB Output is correct
55 Correct 1151 ms 110096 KB Output is correct