Submission #101946


Source Code Expand

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

int N;
int X[100000], Y[100000];
vector<int> Xs, Ys;

vector<int> Ycor[200002];
vector<pair<int, int> > ranges[200002]; //slice with X
vector<int> idxs[200002];

int uf[5000000];

int root(int p){
	return (uf[p] < 0) ? p : (uf[p] = root(uf[p]));
}

void join(int p, int q)
{
	p = root(p);
	q = root(q);
	if(p==q) return;
	uf[p] += uf[q];
	uf[q] = p;
}

bool intersect(pair<int, int> x, pair<int, int> y)
{
	return !(x.second <= y.first || y.second <= x.first);
}

void unify(int p, int q)
{
	int ip=0, iq=0;
	pair<int, int> r1, r2;

	for(;ip<ranges[p].size()&&iq<ranges[q].size();){
		r1 = ranges[p][ip];
		r2 = ranges[q][iq];
		if(intersect(r1, r2)){
			join(idxs[p][ip], idxs[q][iq]);
		}

		if(r1.second < r2.second){
			++ip;
		}else{
			++iq;
		}
	}
}

int main()
{
	scanf("%d", &N);
	for(int i=0;i<N;i++){
		scanf("%d%d", X+i, Y+i);
		Xs.push_back(X[i]);
		Xs.push_back(X[i]+1);
		Ys.push_back(Y[i]);
		Ys.push_back(Y[i]+1);
	}
	Xs.push_back(-2100000000);
	Xs.push_back(2100000000);
	Ys.push_back(-2100000000);
	Ys.push_back(2100000000);

	sort(Xs.begin(), Xs.end());
	sort(Ys.begin(), Ys.end());
	Xs.erase(unique(Xs.begin(), Xs.end()), Xs.end());
	Ys.erase(unique(Ys.begin(), Ys.end()), Ys.end());

	for(int i=0;i<N;i++){
		X[i] = lower_bound(Xs.begin(), Xs.end(), X[i]) - Xs.begin();
		//Y[i] = lower_bound(Ys.begin(), Ys.end(), Y[i]) - Ys.begin();
		Ycor[X[i]].push_back(Y[i]);
	}
	for(int i=0;i<Xs.size();i++){
		sort(Ycor[i].begin(), Ycor[i].end());

		int left = -2100000000;
		for(int j=0;j<Ycor[i].size();j++){
			int val = Ycor[i][j];
			if(left < val){
				ranges[i].push_back(make_pair(left, val)); //[left, val)
			}
			left = val + 1;
		}

		ranges[i].push_back(make_pair(left, 2100000000));
	}

	int bid = 0;
	for(int i=0;i<Xs.size();i++){
		for(int j=0;j<ranges[i].size();j++) idxs[i].push_back(bid++);
	}
	for(int i=0;i<bid;i++) uf[i] = -1;

	//join!!
	for(int i=1;i<Xs.size();i++){
		unify(i-1, i);
	}

	int ret = -1;
	for(int i=0;i<bid;i++) if(uf[i] < 0) ++ret;

	printf("%d\n", ret);

	return 0;
}

Submission Info

Submission Time
Task I - Topology
User Operasan
Language C++ (GCC 4.4.7)
Score 100
Code Size 2210 Byte
Status AC
Exec Time 272 ms
Memory 33936 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:56: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
./Main.cpp:58: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 50
Set Name Test Cases
All 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 4, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 5, 50, 6, 7, 8, 9
Case Name Status Exec Time Memory
1 AC 48 ms 14764 KB
10 AC 45 ms 14884 KB
11 AC 45 ms 14760 KB
12 AC 45 ms 14752 KB
13 AC 45 ms 14752 KB
14 AC 203 ms 23180 KB
15 AC 223 ms 24844 KB
16 AC 272 ms 33936 KB
17 AC 221 ms 24716 KB
18 AC 129 ms 19216 KB
19 AC 126 ms 19216 KB
2 AC 46 ms 14756 KB
20 AC 134 ms 19476 KB
21 AC 131 ms 19556 KB
22 AC 135 ms 19728 KB
23 AC 137 ms 19736 KB
24 AC 145 ms 19980 KB
25 AC 140 ms 19988 KB
26 AC 141 ms 20172 KB
27 AC 143 ms 20116 KB
28 AC 154 ms 20364 KB
29 AC 151 ms 20372 KB
3 AC 44 ms 14764 KB
30 AC 115 ms 17936 KB
31 AC 114 ms 17940 KB
32 AC 113 ms 18056 KB
33 AC 50 ms 15328 KB
34 AC 54 ms 15904 KB
35 AC 69 ms 16924 KB
36 AC 92 ms 18928 KB
37 AC 69 ms 16548 KB
38 AC 47 ms 14752 KB
39 AC 57 ms 15656 KB
4 AC 46 ms 14880 KB
40 AC 77 ms 17068 KB
41 AC 51 ms 15260 KB
42 AC 55 ms 15400 KB
43 AC 57 ms 15588 KB
44 AC 50 ms 15012 KB
45 AC 69 ms 16296 KB
46 AC 50 ms 15140 KB
47 AC 76 ms 16796 KB
48 AC 77 ms 16860 KB
49 AC 49 ms 15132 KB
5 AC 47 ms 14880 KB
50 AC 48 ms 15000 KB
6 AC 45 ms 14880 KB
7 AC 43 ms 14752 KB
8 AC 43 ms 14752 KB
9 AC 43 ms 14876 KB