Submission #1106605

# Submission time Handle Problem Language Result Execution time Memory
1106605 2024-10-30T17:33:19 Z Octagons Sphinx's Riddle (IOI24_sphinx) C++17
50 / 100
523 ms 2024 KB
#include <bits/stdc++.h>
using namespace std;
#include "sphinx.h"
#define sz(x) int(x.size())
int n, mmo;
int p[255], sz[255], p2[255], sz2[255], dep[255], idxo = 1;
vector<int> adj57[255], tr[255], bck[255], adj2[255], nds[255], ret;
int vis[255];
bool fnd[255];
vector<int> fo, so;

int findp2(int u) {
    return p2[u] = (p2[u] == u ? u : findp2(p2[u]));
}
 
bool merge2(int u, int v) {
    u = findp2(u), v = findp2(v);
    if (u == v)return false;
    if (sz2[u] < sz2[v])swap(u, v);
    sz2[u] += sz2[v];
    p2[v] = u;
	return true;
}
 
int findp(int u) {
    return p[u] = (p[u] == u ? u : findp(p[u]));
}
 
void merge(int u, int v) {
    u = findp(u), v = findp(v);
    if (u == v)return;
    if (sz[u] < sz[v])swap(u, v);
    sz[u] += sz[v];
    p[v] = u;
}
 
bool chk(vector<int> v) {
	for (int i = 0; i < n; i++) {
		p2[i] = i;
		sz2[i] = 1;
	}
	int comps = n;
	for (int i = 0; i < n; i++) {
		for (auto &vv : adj57[i]) {
			if (~v[i] && v[i] == v[vv]) {
				comps -= merge2(i, vv);
			} else if (v[i] == -1 && v[vv] == -1 && findp(i) == findp(vv)) {
				comps -= merge2(i, vv);
			}
		}
	}
	int x = perform_experiment(v);
	return (comps > x);
}
 
bool chk2(int u, int v) {
	for (int i = 0; i < n; i++) {
		p2[i] = i;
		sz2[i] = 1;
	}
	int comps = n;
	vector<int> e(n, n);
	e[u] = e[v] = -1;
	for (int i = 0; i < n; i++) {
		for (auto &vv : adj57[i]) {
			if (e[i] == e[vv]) {
				comps -= merge2(i, vv);
			}
		}
	}
	int x = perform_experiment(e);
	return (comps == x);
}
 
void init(int u, int pr) {
	vis[u] = idxo++;
	for (auto &v : adj57[u]) {
		if (v == pr)continue;
		if (vis[v]) {
			if (vis[v] < vis[u])bck[u].push_back(v);
			continue;
		}
		init(v, u);
		tr[u].push_back(v);
	}
}
 
void soly(int u, vector<int> vvo) {
	if (vvo.empty())return;
	vector<int> ee(n, n);
	for (int j = 0; j < sz(vvo); j++) {
		for (int i = 0; i < n; i++) {
			if (findp(i) == vvo[j])ee[i] = -1;
		}
	}
	ee[u] = -1;
	if (sz(vvo) > 1) {
		if (!chk(ee))return;
	}
	int l = 0, r = int(vvo.size()) - 1 - (sz(vvo) > 1), id = (sz(vvo) > 1 ? int(vvo.size())-1 : -1);
	while (l <= r) {
		int m = (l + r) >> 1;
		vector<int> e(n, n);
		for (int j = 0; j <= m; j++) {
			for (int i = 0; i < n; i++) {
				if (findp(i) == vvo[j])e[i] = -1;
			}
		}
		e[u] = -1;
		if (chk(e)) {
			id = m;
			r = m-1;
		} else {
			l = m+1;
		}
	}
	if (~id) {
		merge(u, vvo[id]);
	} else {
		return;
	}
	vector<int> xx;
	for (int i = id+1; i < sz(vvo); i++) {
		xx.push_back(vvo[i]);
	}
	soly(u, xx);
}
 
void dfs(int u) {
	vector<int> vvo;
	for (auto &v : bck[u]) {
		if (findp(v) != findp(u))vvo.push_back(findp(v));
	}
	sort(vvo.begin(), vvo.end());
	vvo.erase(unique(vvo.begin(), vvo.end()), vvo.end());
	soly(u, vvo);
	for (auto &v : tr[u]) {
		if (chk2(u, v)) {
			merge(u, v);
		}
		dfs(v);
	}
}

void init2(int u, int pr) {
	vis[u] = 1;
	for (auto &v : adj2[u]) {
		if (vis[v])continue;
		dep[v] = (dep[u] ^ 1);
		init2(v, u);
	}
}

vector<int> nw(vector<int> x, int u) {
	vector<int> reti;
	for (auto &i : x) {
		if (i == u)continue;
		reti.push_back(i);
	}
	return reti;
}

void doyi() {
	for (int i = 0; i < n; i++) {
		vector<int> cnd;
		for (auto &j : fo) {
			if (fnd[j])continue;
			cnd.push_back(j);
		}
		while (!cnd.empty()) {
			if (sz(cnd) > 1) {
				vector<int> ee(n, n);
				for (auto &j : so) {
					ee[j] = i;
				}
				for (int j = 0; j < sz(cnd); j++) {
					for (auto &jj : nds[cnd[j]]) {
						ee[jj] = -1;
					}
				}
				if (!chk(ee))break;
			}
			int id = (sz(cnd) > 1 ? sz(cnd) - 1 : -1), l = 0, r = sz(cnd) - 1 - (sz(cnd) > 1);
			while (l <= r) {
				int m = (l + r) >> 1;
				vector<int> e(n, n);
				for (auto &j : so) {
					e[j] = i;
				}
				for (int j = 0; j <= m; j++) {
					for (auto &jj : nds[cnd[j]]) {
						e[jj] = -1;
					}
				}
				if (chk(e)) {
					id = m;
					r = m-1;
				} else {
					l = m+1;
				}
			}
			if (id == -1)break;
			fnd[cnd[id]] = true;
			for (int j = 0; j < n; j++) {
				if (findp(j) == cnd[id]) {
					ret[j] = i;
				}
			}
			vector<int> xx;
			for (int j = id+1; j < sz(cnd); j++) {
				xx.push_back(cnd[j]);
			}
			cnd = xx;
		}
	}
}

std::vector<int> find_colours(int NH, std::vector<int> X, std::vector<int> Y) {
    n = NH;
	fo.clear();
	so.clear();
    ret = vector<int> (n, 0);
    for (int i = 0; i < n; i++) {
      p[i] = i;
      sz[i] = 1;
	  adj2[i].clear();
	  adj57[i].clear();
	  fnd[i] = false;
	  nds[i].clear();
	  tr[i].clear();
	  bck[i].clear();
	  vis[i] = 0;
    }
    for (int i = 0; i < X.size(); i++) {
      int u = X[i], v = Y[i];
      adj57[u].push_back(v);
      adj57[v].push_back(u);
    }
	mmo = X.size();
	init(0, 0);
	dfs(0);
	bool ff = true;
    for (int i = 0; i < n; i++) {
      ret[i] = findp(i);
	  ff &= (findp(i) == findp(0));
    }
	if (ff) {
		for (int i = 0; i < n; i++) {
			vector<int> e(n, n);
			e[0] = -1;
			e[adj57[0][0]] = i;
			if (chk(e)) {
				for (int j = 0; j < n; j++) {
					ret[j] = i;
				}
				break;
			}
		}
		return ret;
	}
	return ret;
	for (int i = 0; i < n; i++) {
		nds[findp(i)].push_back(i);
		for (auto &v : adj57[i]) {
			if (findp(i) == findp(v))continue;
			adj2[findp(i)].push_back(findp(v));
			adj2[findp(v)].push_back(findp(i));
		}
		vis[i] = 0;
		dep[i] = 0;
	}
	init2(findp(0), -1);
	for (int i = 0; i < n; i++) {
		if (findp(i) != i)continue;
		if (dep[i])fo.push_back(i);
		else so.push_back(i);
	}
	doyi();
	swap(fo, so);
	for (int i = 0; i < n; i++) {
		dep[i] ^= 1;
	}
	doyi();
    return ret;
}

Compilation message

sphinx.cpp: In function 'std::vector<int> find_colours(int, std::vector<int>, std::vector<int>)':
sphinx.cpp:234:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  234 |     for (int i = 0; i < X.size(); i++) {
      |                     ~~^~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Partially correct 1 ms 336 KB Partially correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 336 KB #experiments: 2
2 Correct 1 ms 512 KB #experiments: 1
3 Partially correct 1 ms 336 KB Partially correct
4 Correct 1 ms 336 KB #experiments: 3
# Verdict Execution time Memory Grader output
1 Partially correct 1 ms 336 KB Partially correct
2 Correct 1 ms 336 KB #experiments: 2
3 Correct 1 ms 512 KB #experiments: 1
4 Partially correct 1 ms 336 KB Partially correct
5 Correct 1 ms 336 KB #experiments: 3
6 Correct 1 ms 336 KB #experiments: 74
7 Partially correct 2 ms 336 KB Partially correct
8 Partially correct 1 ms 336 KB Partially correct
9 Partially correct 1 ms 484 KB Partially correct
10 Partially correct 1 ms 336 KB Partially correct
11 Partially correct 1 ms 336 KB Partially correct
12 Partially correct 1 ms 336 KB Partially correct
13 Partially correct 1 ms 336 KB Partially correct
14 Correct 2 ms 336 KB #experiments: 64
15 Partially correct 6 ms 336 KB Partially correct
16 Partially correct 5 ms 336 KB Partially correct
17 Partially correct 6 ms 336 KB Partially correct
18 Partially correct 6 ms 336 KB Partially correct
19 Partially correct 7 ms 592 KB Partially correct
20 Partially correct 5 ms 336 KB Partially correct
21 Partially correct 3 ms 336 KB Partially correct
22 Partially correct 2 ms 336 KB Partially correct
23 Partially correct 3 ms 336 KB Partially correct
24 Partially correct 2 ms 336 KB Partially correct
25 Partially correct 3 ms 336 KB Partially correct
26 Partially correct 2 ms 508 KB Partially correct
27 Partially correct 1 ms 336 KB Partially correct
28 Partially correct 1 ms 336 KB Partially correct
29 Partially correct 3 ms 336 KB Partially correct
30 Partially correct 4 ms 336 KB Partially correct
31 Partially correct 9 ms 336 KB Partially correct
32 Partially correct 5 ms 528 KB Partially correct
33 Correct 3 ms 336 KB #experiments: 78
34 Partially correct 3 ms 336 KB Partially correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 336 KB #experiments: 2
2 Correct 1 ms 512 KB #experiments: 1
3 Partially correct 1 ms 336 KB Partially correct
4 Correct 1 ms 336 KB #experiments: 3
5 Correct 1 ms 336 KB #experiments: 74
6 Partially correct 2 ms 336 KB Partially correct
7 Partially correct 1 ms 336 KB Partially correct
8 Partially correct 1 ms 484 KB Partially correct
9 Partially correct 1 ms 336 KB Partially correct
10 Partially correct 1 ms 336 KB Partially correct
11 Partially correct 1 ms 336 KB Partially correct
12 Partially correct 1 ms 336 KB Partially correct
13 Partially correct 6 ms 528 KB Partially correct
14 Partially correct 6 ms 528 KB Partially correct
15 Partially correct 10 ms 336 KB Partially correct
16 Partially correct 6 ms 508 KB Partially correct
17 Partially correct 9 ms 800 KB Partially correct
18 Partially correct 7 ms 336 KB Partially correct
19 Partially correct 6 ms 336 KB Partially correct
20 Correct 14 ms 336 KB #experiments: 383
21 Partially correct 6 ms 336 KB Partially correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 336 KB #experiments: 2
2 Correct 1 ms 512 KB #experiments: 1
3 Partially correct 1 ms 336 KB Partially correct
4 Correct 1 ms 336 KB #experiments: 3
5 Correct 2 ms 336 KB #experiments: 64
6 Partially correct 6 ms 336 KB Partially correct
7 Partially correct 5 ms 336 KB Partially correct
8 Partially correct 6 ms 336 KB Partially correct
9 Partially correct 6 ms 336 KB Partially correct
10 Partially correct 7 ms 592 KB Partially correct
11 Partially correct 5 ms 336 KB Partially correct
12 Partially correct 3 ms 336 KB Partially correct
13 Partially correct 213 ms 1940 KB Partially correct
14 Partially correct 358 ms 1360 KB Partially correct
15 Partially correct 471 ms 1816 KB Partially correct
16 Partially correct 500 ms 2024 KB Partially correct
17 Partially correct 509 ms 1716 KB Partially correct
18 Partially correct 397 ms 1948 KB Partially correct
19 Partially correct 342 ms 1868 KB Partially correct
20 Correct 106 ms 1416 KB #experiments: 309
21 Partially correct 156 ms 1608 KB Partially correct
# Verdict Execution time Memory Grader output
1 Partially correct 1 ms 336 KB Partially correct
2 Correct 1 ms 336 KB #experiments: 2
3 Correct 1 ms 512 KB #experiments: 1
4 Partially correct 1 ms 336 KB Partially correct
5 Correct 1 ms 336 KB #experiments: 3
6 Correct 1 ms 336 KB #experiments: 74
7 Partially correct 2 ms 336 KB Partially correct
8 Partially correct 1 ms 336 KB Partially correct
9 Partially correct 1 ms 484 KB Partially correct
10 Partially correct 1 ms 336 KB Partially correct
11 Partially correct 1 ms 336 KB Partially correct
12 Partially correct 1 ms 336 KB Partially correct
13 Partially correct 1 ms 336 KB Partially correct
14 Correct 2 ms 336 KB #experiments: 64
15 Partially correct 6 ms 336 KB Partially correct
16 Partially correct 5 ms 336 KB Partially correct
17 Partially correct 6 ms 336 KB Partially correct
18 Partially correct 6 ms 336 KB Partially correct
19 Partially correct 7 ms 592 KB Partially correct
20 Partially correct 5 ms 336 KB Partially correct
21 Partially correct 3 ms 336 KB Partially correct
22 Partially correct 2 ms 336 KB Partially correct
23 Partially correct 3 ms 336 KB Partially correct
24 Partially correct 2 ms 336 KB Partially correct
25 Partially correct 3 ms 336 KB Partially correct
26 Partially correct 2 ms 508 KB Partially correct
27 Partially correct 1 ms 336 KB Partially correct
28 Partially correct 1 ms 336 KB Partially correct
29 Partially correct 3 ms 336 KB Partially correct
30 Partially correct 4 ms 336 KB Partially correct
31 Partially correct 9 ms 336 KB Partially correct
32 Partially correct 5 ms 528 KB Partially correct
33 Correct 3 ms 336 KB #experiments: 78
34 Partially correct 3 ms 336 KB Partially correct
35 Partially correct 6 ms 528 KB Partially correct
36 Partially correct 6 ms 528 KB Partially correct
37 Partially correct 10 ms 336 KB Partially correct
38 Partially correct 6 ms 508 KB Partially correct
39 Partially correct 9 ms 800 KB Partially correct
40 Partially correct 7 ms 336 KB Partially correct
41 Partially correct 6 ms 336 KB Partially correct
42 Correct 14 ms 336 KB #experiments: 383
43 Partially correct 6 ms 336 KB Partially correct
44 Partially correct 213 ms 1940 KB Partially correct
45 Partially correct 358 ms 1360 KB Partially correct
46 Partially correct 471 ms 1816 KB Partially correct
47 Partially correct 500 ms 2024 KB Partially correct
48 Partially correct 509 ms 1716 KB Partially correct
49 Partially correct 397 ms 1948 KB Partially correct
50 Partially correct 342 ms 1868 KB Partially correct
51 Correct 106 ms 1416 KB #experiments: 309
52 Partially correct 156 ms 1608 KB Partially correct
53 Partially correct 36 ms 568 KB Partially correct
54 Partially correct 59 ms 612 KB Partially correct
55 Partially correct 60 ms 616 KB Partially correct
56 Partially correct 74 ms 628 KB Partially correct
57 Partially correct 88 ms 908 KB Partially correct
58 Partially correct 81 ms 848 KB Partially correct
59 Partially correct 94 ms 1140 KB Partially correct
60 Partially correct 84 ms 920 KB Partially correct
61 Partially correct 7 ms 336 KB Partially correct
62 Partially correct 6 ms 336 KB Partially correct
63 Partially correct 6 ms 336 KB Partially correct
64 Partially correct 62 ms 596 KB Partially correct
65 Partially correct 59 ms 596 KB Partially correct
66 Partially correct 81 ms 864 KB Partially correct
67 Partially correct 67 ms 868 KB Partially correct
68 Partially correct 85 ms 628 KB Partially correct
69 Partially correct 86 ms 848 KB Partially correct
70 Partially correct 82 ms 624 KB Partially correct
71 Partially correct 101 ms 636 KB Partially correct
72 Partially correct 31 ms 560 KB Partially correct
73 Partially correct 45 ms 564 KB Partially correct
74 Partially correct 69 ms 600 KB Partially correct
75 Partially correct 72 ms 604 KB Partially correct
76 Partially correct 79 ms 872 KB Partially correct
77 Partially correct 90 ms 884 KB Partially correct
78 Partially correct 118 ms 648 KB Partially correct
79 Partially correct 107 ms 920 KB Partially correct
80 Partially correct 108 ms 664 KB Partially correct
81 Partially correct 113 ms 660 KB Partially correct
82 Partially correct 75 ms 960 KB Partially correct
83 Partially correct 523 ms 1548 KB Partially correct
84 Partially correct 408 ms 1616 KB Partially correct
85 Correct 53 ms 728 KB #experiments: 466
86 Partially correct 72 ms 1352 KB Partially correct