답안 #294738

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
294738 2020-09-09T09:01:35 Z _7_7_ Split the Attractions (IOI19_split) C++14
40 / 100
147 ms 14712 KB
#include "split.h"
#include <bits/stdc++.h>                                           
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
using namespace std;
using namespace __gnu_pbds;
 
//#define int long long
//#pragma GCC optimize("Ofast")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4")
 
 
#define file(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout);
#define fastio ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define all(x) x.begin(), x.end()
#define sz(s) (int)s.size()
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define s second
#define f first
 
 
 
 
typedef pair < long long, long long > pll;    
typedef pair < int, int > pii;  
typedef unsigned long long ull;         
typedef vector < pii > vpii;                                   	
typedef vector < int > vi;
typedef long double ldb;  
typedef long long ll;  
typedef double db;
 
typedef tree < int, null_type, less < int >, rb_tree_tag, tree_order_statistics_node_update > ordered_set;
 
const int inf = 1e9, maxn = 2e5 + 48, mod = 998244353, N = 1e5 + 112;
const int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}, block = 300;
const pii base = mp(1171, 3307), Mod = mp(1e9 + 7, 1e9 + 9);
const db eps = 1e-12, pi = acos(-1);
const ll INF = 1e18;

using namespace std;

int n, m, cnt[N], tin[N], tout[N], timer, par[N];
int A, B, C, a, b, c;
pair < int, pii > T;
vi g[N], res;

void dfs (int v) {
	tin[v] = ++timer;
	cnt[v] = 1;
	for (auto to : g[v])
		if (!cnt[to]) {
			dfs(to);   
			cnt[v] += cnt[to];
			par[to] = v;
		}

	tout[v] = timer;
}


bool upper (int v, int u) {
	return tin[v] <= tin[u] && tout[u] <= tout[v];
}


bool check (int v) {
	if ((!T.s.s && upper(T.s.f, v)) || (T.s.s && !upper(T.s.f, v)))
		return 0;
	return 1;
}

void dfs1 (int v, int c, int &x) {
	if (!x)
		return;

	--x;			
	res[v] = c;
	for (auto to : g[v])
		if (check(to) && !res[to]) 
			dfs1(to, c, x);		
}

void dfs2 (int v, int c, int &x) {
	if (!x)
		return;
	--x;
	res[v] = c;
	for (auto to : g[v])
		if (!res[to])
			dfs2(to, c, x);
}

vi solve (int r) {
	res.resize(n, 0);
	for (int i = 0; i < n; ++i)
		cnt[i] = 0;

	timer = 0;
	dfs(r);
	
	T = {inf, {inf, inf}};

	for (int i = 0; i < n; ++i) {
		if (cnt[i] >= a)
			T = min(T, mp(cnt[i], mp(i, 0)));
		if (n - cnt[i] >= a)
			T = min(T, mp(n - cnt[i], mp(i, 1)));
	}

	if (n - T.f < b)  
		return res;	
			
	int root = 0;
	while (!check(root))
		++root;
	int a1 = a, b1 = b;

	dfs1(root, B, b1);
	dfs2(!T.s.s ? T.s.f : par[T.s.f], A, a1);
	
	for (int i = 0; i < n; ++i)
		if (!res[i])
			res[i] = C;

	return res;

}


vi find_split(int _n, int _a, int _b, int _c, vi p, vi q) {
	n = _n;
	m = sz(p);
	for (int i = 0; i < m; ++i) {
		g[p[i]].pb(q[i]);
		g[q[i]].pb(p[i]);
	}
	
	A = 1, B = 2, C = 3;
	a = _a, b = _b, c = _c;

	if (a > b && a > c) {
	    swap(A, C);
		swap(a, c);      
	}
	
	if (b > a && b > c) {
		swap(b, c);      
		swap(B, C);
	}

	if (a > b) {
		swap(a, b);
		swap(A, B);
	}

	if (n > 2500)
		return solve(0);
	
	for (int i = 0; i < n; ++i) {
		vi v = solve(i);
		if (v[0])
			return v;
	}

	return solve(0);		
}

# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2816 KB ok, correct split
2 Correct 2 ms 2688 KB ok, correct split
3 Correct 2 ms 2688 KB ok, correct split
4 Correct 2 ms 2724 KB ok, correct split
5 Correct 2 ms 2688 KB ok, correct split
6 Correct 2 ms 2688 KB ok, correct split
7 Correct 109 ms 14456 KB ok, correct split
8 Correct 97 ms 13048 KB ok, correct split
9 Correct 120 ms 12536 KB ok, correct split
10 Correct 98 ms 14712 KB ok, correct split
11 Correct 127 ms 14652 KB ok, correct split
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2688 KB ok, correct split
2 Correct 2 ms 2688 KB ok, correct split
3 Correct 2 ms 2688 KB ok, correct split
4 Correct 133 ms 13176 KB ok, correct split
5 Correct 92 ms 9976 KB ok, correct split
6 Correct 95 ms 14584 KB ok, correct split
7 Correct 139 ms 12920 KB ok, correct split
8 Correct 147 ms 12280 KB ok, correct split
9 Correct 101 ms 9976 KB ok, correct split
10 Correct 65 ms 10352 KB ok, correct split
11 Correct 71 ms 10352 KB ok, correct split
12 Correct 66 ms 10352 KB ok, correct split
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2688 KB ok, correct split
2 Correct 94 ms 10104 KB ok, correct split
3 Correct 31 ms 5760 KB ok, correct split
4 Correct 2 ms 2688 KB ok, correct split
5 Correct 120 ms 11576 KB ok, correct split
6 Correct 106 ms 11384 KB ok, correct split
7 Correct 111 ms 11512 KB ok, correct split
8 Correct 103 ms 12024 KB ok, correct split
9 Correct 107 ms 11384 KB ok, correct split
10 Correct 24 ms 5248 KB ok, no valid answer
11 Correct 37 ms 6528 KB ok, no valid answer
12 Correct 77 ms 10228 KB ok, no valid answer
13 Correct 85 ms 10128 KB ok, no valid answer
14 Correct 63 ms 10352 KB ok, no valid answer
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2688 KB ok, correct split
2 Correct 2 ms 2720 KB ok, no valid answer
3 Correct 2 ms 2688 KB ok, correct split
4 Correct 2 ms 2688 KB ok, correct split
5 Correct 2 ms 2688 KB ok, correct split
6 Correct 3 ms 2688 KB ok, correct split
7 Correct 2 ms 2688 KB ok, correct split
8 Correct 2 ms 2688 KB ok, correct split
9 Correct 5 ms 2944 KB ok, correct split
10 Correct 4 ms 2944 KB ok, correct split
11 Correct 3 ms 2688 KB ok, correct split
12 Correct 4 ms 2944 KB ok, correct split
13 Correct 2 ms 2732 KB ok, correct split
14 Correct 2 ms 2688 KB ok, correct split
15 Correct 3 ms 2688 KB ok, correct split
16 Correct 3 ms 2688 KB ok, correct split
17 Correct 3 ms 2688 KB ok, correct split
18 Correct 2 ms 2688 KB ok, correct split
19 Correct 2 ms 2688 KB ok, correct split
20 Correct 3 ms 2816 KB ok, correct split
21 Correct 5 ms 2944 KB ok, correct split
22 Correct 5 ms 2944 KB ok, correct split
23 Correct 5 ms 2944 KB ok, correct split
24 Correct 4 ms 2944 KB ok, correct split
25 Correct 4 ms 2944 KB ok, correct split
26 Incorrect 111 ms 2944 KB jury found a solution, contestant did not
27 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2816 KB ok, correct split
2 Correct 2 ms 2688 KB ok, correct split
3 Correct 2 ms 2688 KB ok, correct split
4 Correct 2 ms 2724 KB ok, correct split
5 Correct 2 ms 2688 KB ok, correct split
6 Correct 2 ms 2688 KB ok, correct split
7 Correct 109 ms 14456 KB ok, correct split
8 Correct 97 ms 13048 KB ok, correct split
9 Correct 120 ms 12536 KB ok, correct split
10 Correct 98 ms 14712 KB ok, correct split
11 Correct 127 ms 14652 KB ok, correct split
12 Correct 2 ms 2688 KB ok, correct split
13 Correct 2 ms 2688 KB ok, correct split
14 Correct 2 ms 2688 KB ok, correct split
15 Correct 133 ms 13176 KB ok, correct split
16 Correct 92 ms 9976 KB ok, correct split
17 Correct 95 ms 14584 KB ok, correct split
18 Correct 139 ms 12920 KB ok, correct split
19 Correct 147 ms 12280 KB ok, correct split
20 Correct 101 ms 9976 KB ok, correct split
21 Correct 65 ms 10352 KB ok, correct split
22 Correct 71 ms 10352 KB ok, correct split
23 Correct 66 ms 10352 KB ok, correct split
24 Correct 2 ms 2688 KB ok, correct split
25 Correct 94 ms 10104 KB ok, correct split
26 Correct 31 ms 5760 KB ok, correct split
27 Correct 2 ms 2688 KB ok, correct split
28 Correct 120 ms 11576 KB ok, correct split
29 Correct 106 ms 11384 KB ok, correct split
30 Correct 111 ms 11512 KB ok, correct split
31 Correct 103 ms 12024 KB ok, correct split
32 Correct 107 ms 11384 KB ok, correct split
33 Correct 24 ms 5248 KB ok, no valid answer
34 Correct 37 ms 6528 KB ok, no valid answer
35 Correct 77 ms 10228 KB ok, no valid answer
36 Correct 85 ms 10128 KB ok, no valid answer
37 Correct 63 ms 10352 KB ok, no valid answer
38 Correct 2 ms 2688 KB ok, correct split
39 Correct 2 ms 2720 KB ok, no valid answer
40 Correct 2 ms 2688 KB ok, correct split
41 Correct 2 ms 2688 KB ok, correct split
42 Correct 2 ms 2688 KB ok, correct split
43 Correct 3 ms 2688 KB ok, correct split
44 Correct 2 ms 2688 KB ok, correct split
45 Correct 2 ms 2688 KB ok, correct split
46 Correct 5 ms 2944 KB ok, correct split
47 Correct 4 ms 2944 KB ok, correct split
48 Correct 3 ms 2688 KB ok, correct split
49 Correct 4 ms 2944 KB ok, correct split
50 Correct 2 ms 2732 KB ok, correct split
51 Correct 2 ms 2688 KB ok, correct split
52 Correct 3 ms 2688 KB ok, correct split
53 Correct 3 ms 2688 KB ok, correct split
54 Correct 3 ms 2688 KB ok, correct split
55 Correct 2 ms 2688 KB ok, correct split
56 Correct 2 ms 2688 KB ok, correct split
57 Correct 3 ms 2816 KB ok, correct split
58 Correct 5 ms 2944 KB ok, correct split
59 Correct 5 ms 2944 KB ok, correct split
60 Correct 5 ms 2944 KB ok, correct split
61 Correct 4 ms 2944 KB ok, correct split
62 Correct 4 ms 2944 KB ok, correct split
63 Incorrect 111 ms 2944 KB jury found a solution, contestant did not
64 Halted 0 ms 0 KB -