답안 #1053259

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1053259 2024-08-11T10:08:14 Z dozer 분수 공원 (IOI21_parks) C++17
45 / 100
1648 ms 127268 KB
#include "parks.h"
#include <bits/stdc++.h>
using namespace std;
#define sp " "
#define endl "\n"
#define fileio() freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout)
#define pb push_back
#define pii pair<int, int>
#define fastio() cin.tie(0), ios_base::sync_with_stdio(0)
#define st first
#define nd second
#define ll long long
#define LL node * 2
#define RR node * 2 + 1
#define N 300005


const int modulo = 1e9 + 7;
const ll INF = 2e18 + 7;


int par[N], sz[N], TOT;
pii rev[N];

int find(int node){
	if (par[node] == node) return node;
	return par[node] = find(par[node]);
}


void uni(int a, int b){
	a = find(a), b = find(b);
	if (a == b) return;
	TOT--;
	if (sz[a] < sz[b]) swap(a, b);
	par[b] = a;
	sz[a] += b;
}


int construct_roads(vector<int> x, vector<int> y) {
    if (x.size() == 1) {
		build({}, {}, {}, {});
	    return 1;
    }
    map<pii ,int> ind;
    int n = x.size();
    for (int i = 0; i < n; i++){
    	ind[{x[i], y[i]}] = i;
    	sz[i] = 1, par[i] = i;
    }

    vector<pii> dir = {{0, -2}, {-2, 0}, {0, 2}, {2, 0}};

    vector<pii> edges, b1, b2;
    map<pii, int> cnt;
    map<pii, set<int>> rev2;

    int cntr = 0;
    for (int i = 0; i < n; i++){
    	int a = x[i], b = y[i];
    	for (auto k : dir){
    		int c = a + k.st, d = b + k.nd;
    		if (ind.count({c, d}) && ind[{c, d}] > i){
    			int g = (a + c) / 2, h = (b + d) / 2;
    			pii f1, f2;
    			if (b == d){
    				f1 = {g, h + 1};
    				f2 = {g, h - 1};
    			}
    			else{
    				f1 = {g + 1, h};
    				f2 = {g - 1, h};
    			}
    			edges.pb({i, ind[{c, d}]});
    			b1.pb(f1);
    			b2.pb(f2);
    			rev2[f1].insert(cntr);
    			rev2[f2].insert(cntr);
    			cnt[f1]++;
    			cnt[f2]++;
    			cntr++;
    		}
    	}
    }

    queue<int> q;
    for (int i = 0; i < cntr; i++){
    	if (cnt[b1[i]] == 1 || cnt[b2[i]] == 1) q.push(i);
    }

 	vector<int> u, v, a, b;
    
    set<int> undone;

    for (int i = 0; i < cntr; i++) undone.insert(i);
    TOT = n;
	while(TOT > 1){
		 while(!q.empty()){
	    	int top = q.front();
	    	q.pop();
	    	undone.erase(top);
	    	
	    	pii todo = {-1, -1};
	    	if (cnt[b1[top]] == 1) todo = b1[top];
	    	else if (cnt[b2[top]] == 1) todo = b2[top];
	    	if (todo.st == -1) continue;

	    	a.pb(todo.st), b.pb(todo.nd);
	    	vector<pii> V = {b1[top], b2[top]};
	    	for (auto i : V){
	    		cnt[i]--;
	    		rev2[i].erase(top);
	    		if (rev2[i].size()){
	    			q.push(*rev2[i].begin());
	    		}
	    	}

	    	u.pb(edges[top].st);
	    	v.pb(edges[top].nd);
	    	uni(edges[top].st, edges[top].nd);
	    }	

	    if (TOT == 1) break;
	    vector<int> del;
	    for (auto i : undone){
	    	
	    }

	    auto it = undone.begin();
	    while(it != undone.end()){
	    	int i = *it;
	    	if (find(edges[i].st) == find(edges[i].nd)) it = undone.erase(it); 
	    	else if (cnt[b1[i]] == 0 && cnt[b2[i]] == 0) it = undone.erase(it);
	    	else break;
	    }

	    if (undone.empty()) break;
		int tmp = *undone.begin();
		cnt[b1[tmp]] = 1;
		q.push(tmp);
	}

	
	if (TOT == 1){
		build(u, v, a, b);
		return 1;
	}
   
   return 0;
}
/*

static void check(bool cond, string message) {
	if (!cond) {
		printf("%s\n", message.c_str());
		fclose(stdout);
		exit(0);
	}
}

static int n;
static bool build_called;
static int m;
static vector<int> _u, _v, _a, _b;

void build(vector<int> u, vector<int> v, vector<int> a, vector<int> b) {
	check(!build_called, "build is called more than once");
	build_called = true;
	m = u.size();
	check(int(v.size()) == m, "u.size() != v.size()");
	check(int(a.size()) == m, "u.size() != a.size()");
	check(int(b.size()) == m, "u.size() != b.size()");
	_u = u;
	_v = v;
	_a = a;
	_b = b;
}

int main() {
	fileio();
	assert(scanf("%d", &n) == 1);
	vector<int> x(n), y(n);
	for (int i = 0; i < n; i++) {
		assert(scanf("%d%d", &x[i], &y[i]) == 2);
	}
	fclose(stdin);

	build_called = false;
	const int possible = construct_roads(x, y);

	check(possible == 0 || possible == 1, "Invalid return value of construct_roads()");
	if (possible == 1) {
		check(build_called, "construct_roads() returned 1 without calling build()");
	} else {
		check(!build_called, "construct_roads() called build() but returned 0");
	}

	printf("%d\n", possible);
	if (possible == 1) {
		printf("%d\n", m);
		for (int j = 0; j < m; j++) {
			printf("%d %d %d %d\n", _u[j], _v[j], _a[j], _b[j]);
		}
	}
	fclose(stdout);
	return 0;
}*/

Compilation message

parks.cpp: In function 'int construct_roads(std::vector<int>, std::vector<int>)':
parks.cpp:126:16: warning: unused variable 'i' [-Wunused-variable]
  126 |      for (auto i : undone){
      |                ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 0 ms 2396 KB Output is correct
7 Correct 1 ms 2396 KB Output is correct
8 Correct 0 ms 2396 KB Output is correct
9 Correct 455 ms 63792 KB Output is correct
10 Correct 18 ms 8284 KB Output is correct
11 Correct 124 ms 34108 KB Output is correct
12 Correct 28 ms 10852 KB Output is correct
13 Correct 92 ms 27712 KB Output is correct
14 Correct 2 ms 2908 KB Output is correct
15 Correct 4 ms 3420 KB Output is correct
16 Correct 460 ms 63552 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 0 ms 2396 KB Output is correct
7 Correct 1 ms 2396 KB Output is correct
8 Correct 0 ms 2396 KB Output is correct
9 Correct 455 ms 63792 KB Output is correct
10 Correct 18 ms 8284 KB Output is correct
11 Correct 124 ms 34108 KB Output is correct
12 Correct 28 ms 10852 KB Output is correct
13 Correct 92 ms 27712 KB Output is correct
14 Correct 2 ms 2908 KB Output is correct
15 Correct 4 ms 3420 KB Output is correct
16 Correct 460 ms 63552 KB Output is correct
17 Correct 0 ms 2396 KB Output is correct
18 Correct 0 ms 2396 KB Output is correct
19 Incorrect 0 ms 2396 KB Edge between 0 and 5 appears more than once: appeared on positions 1 and 6
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 0 ms 2396 KB Output is correct
7 Correct 1 ms 2396 KB Output is correct
8 Correct 0 ms 2396 KB Output is correct
9 Correct 455 ms 63792 KB Output is correct
10 Correct 18 ms 8284 KB Output is correct
11 Correct 124 ms 34108 KB Output is correct
12 Correct 28 ms 10852 KB Output is correct
13 Correct 92 ms 27712 KB Output is correct
14 Correct 2 ms 2908 KB Output is correct
15 Correct 4 ms 3420 KB Output is correct
16 Correct 460 ms 63552 KB Output is correct
17 Correct 0 ms 2396 KB Output is correct
18 Correct 0 ms 2396 KB Output is correct
19 Incorrect 0 ms 2396 KB Edge between 0 and 5 appears more than once: appeared on positions 1 and 6
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 0 ms 2396 KB Output is correct
7 Correct 1 ms 2396 KB Output is correct
8 Correct 0 ms 2396 KB Output is correct
9 Correct 455 ms 63792 KB Output is correct
10 Correct 18 ms 8284 KB Output is correct
11 Correct 124 ms 34108 KB Output is correct
12 Correct 28 ms 10852 KB Output is correct
13 Correct 92 ms 27712 KB Output is correct
14 Correct 2 ms 2908 KB Output is correct
15 Correct 4 ms 3420 KB Output is correct
16 Correct 460 ms 63552 KB Output is correct
17 Correct 1 ms 2396 KB Output is correct
18 Correct 0 ms 2396 KB Output is correct
19 Correct 0 ms 2396 KB Output is correct
20 Correct 912 ms 94500 KB Output is correct
21 Correct 943 ms 94504 KB Output is correct
22 Correct 928 ms 94504 KB Output is correct
23 Correct 890 ms 108484 KB Output is correct
24 Correct 183 ms 18184 KB Output is correct
25 Correct 1108 ms 120360 KB Output is correct
26 Correct 1171 ms 120356 KB Output is correct
27 Correct 1163 ms 127012 KB Output is correct
28 Correct 1148 ms 127012 KB Output is correct
29 Correct 1141 ms 127088 KB Output is correct
30 Correct 1117 ms 127268 KB Output is correct
31 Correct 1 ms 2392 KB Output is correct
32 Correct 45 ms 9172 KB Output is correct
33 Correct 75 ms 10068 KB Output is correct
34 Correct 922 ms 94420 KB Output is correct
35 Correct 32 ms 7004 KB Output is correct
36 Correct 199 ms 25164 KB Output is correct
37 Correct 588 ms 48548 KB Output is correct
38 Correct 467 ms 39840 KB Output is correct
39 Correct 672 ms 55440 KB Output is correct
40 Correct 870 ms 72228 KB Output is correct
41 Correct 1165 ms 86380 KB Output is correct
42 Correct 1391 ms 100648 KB Output is correct
43 Correct 1 ms 2392 KB Output is correct
44 Correct 0 ms 2392 KB Output is correct
45 Correct 0 ms 2396 KB Output is correct
46 Correct 0 ms 2396 KB Output is correct
47 Correct 0 ms 2472 KB Output is correct
48 Correct 0 ms 2396 KB Output is correct
49 Correct 0 ms 2396 KB Output is correct
50 Correct 0 ms 2396 KB Output is correct
51 Correct 0 ms 2396 KB Output is correct
52 Correct 1 ms 2396 KB Output is correct
53 Correct 0 ms 2396 KB Output is correct
54 Correct 4 ms 3416 KB Output is correct
55 Correct 7 ms 3928 KB Output is correct
56 Correct 527 ms 53472 KB Output is correct
57 Correct 832 ms 79272 KB Output is correct
58 Correct 839 ms 79140 KB Output is correct
59 Correct 0 ms 2396 KB Output is correct
60 Correct 0 ms 2396 KB Output is correct
61 Correct 0 ms 2396 KB Output is correct
62 Correct 1113 ms 126644 KB Output is correct
63 Correct 1123 ms 126836 KB Output is correct
64 Correct 1173 ms 126072 KB Output is correct
65 Correct 10 ms 4188 KB Output is correct
66 Correct 22 ms 6236 KB Output is correct
67 Correct 494 ms 52900 KB Output is correct
68 Correct 884 ms 80420 KB Output is correct
69 Correct 1360 ms 106052 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 0 ms 2396 KB Output is correct
7 Correct 1 ms 2396 KB Output is correct
8 Correct 0 ms 2396 KB Output is correct
9 Correct 455 ms 63792 KB Output is correct
10 Correct 18 ms 8284 KB Output is correct
11 Correct 124 ms 34108 KB Output is correct
12 Correct 28 ms 10852 KB Output is correct
13 Correct 92 ms 27712 KB Output is correct
14 Correct 2 ms 2908 KB Output is correct
15 Correct 4 ms 3420 KB Output is correct
16 Correct 460 ms 63552 KB Output is correct
17 Correct 1069 ms 126764 KB Output is correct
18 Correct 1093 ms 125224 KB Output is correct
19 Correct 985 ms 94600 KB Output is correct
20 Correct 1442 ms 116004 KB Output is correct
21 Correct 1120 ms 110116 KB Output is correct
22 Correct 0 ms 2396 KB Output is correct
23 Correct 124 ms 18000 KB Output is correct
24 Correct 74 ms 12612 KB Output is correct
25 Correct 343 ms 38704 KB Output is correct
26 Correct 757 ms 65976 KB Output is correct
27 Correct 589 ms 56884 KB Output is correct
28 Correct 862 ms 72484 KB Output is correct
29 Correct 1090 ms 85284 KB Output is correct
30 Correct 1305 ms 98808 KB Output is correct
31 Correct 1648 ms 112152 KB Output is correct
32 Correct 1641 ms 123044 KB Output is correct
33 Correct 1121 ms 126804 KB Output is correct
34 Correct 14 ms 4988 KB Output is correct
35 Correct 28 ms 7020 KB Output is correct
36 Correct 585 ms 57116 KB Output is correct
37 Correct 980 ms 85724 KB Output is correct
38 Correct 1484 ms 113704 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 0 ms 2396 KB Output is correct
7 Correct 1 ms 2396 KB Output is correct
8 Correct 0 ms 2396 KB Output is correct
9 Correct 455 ms 63792 KB Output is correct
10 Correct 18 ms 8284 KB Output is correct
11 Correct 124 ms 34108 KB Output is correct
12 Correct 28 ms 10852 KB Output is correct
13 Correct 92 ms 27712 KB Output is correct
14 Correct 2 ms 2908 KB Output is correct
15 Correct 4 ms 3420 KB Output is correct
16 Correct 460 ms 63552 KB Output is correct
17 Correct 0 ms 2396 KB Output is correct
18 Correct 0 ms 2396 KB Output is correct
19 Incorrect 0 ms 2396 KB Edge between 0 and 5 appears more than once: appeared on positions 1 and 6
20 Halted 0 ms 0 KB -