Submission #1199141


Source Code Expand

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)





template<int um> struct UF {
	vector<int> par; UF() { clear(); }
	int operator[](int x) { return par[x] == x ? x : par[x] = operator[](par[x]); }
	void operator()(int x, int y) { x = operator[](x); y = operator[](y); if (x != y) par[x] = y; }
	void clear() { par = vector<int>(um, 0); rep(i, 0, um) par[i] = i; }
};
int mod = 1000000007;
int add(int x, int y) { return (x += y) >= mod ? x - mod : x; }
int mul(int x, int y) { return 1LL * x * y % mod; }
int modpow(int a, long long b) {
	int ret = 1;
	while (b > 0) { if (b & 1) ret = 1LL * ret * a % mod; a = 1LL * a * a % mod; b >>= 1; }
	return ret;
}
int modinv(int a) { return modpow(a, mod - 2); }
int fac[201010], ifac[201010];
void initfac() {
	fac[0] = ifac[0] = 1;
	rep(i, 1, 201010) fac[i] = 1LL * i * fac[i - 1] % mod;
	rep(i, 1, 201010) ifac[i] = modinv(fac[i]);
}
//-----------------------------------------------------------------------------------
int N, X, Y, C[201010], W[201010];
UF<201010> uf;
void naive_merge() {
	rep(a, 0, N) rep(b, a + 1, N) {
		if (C[a] == C[b] && W[a] + W[b] <= X) uf(a, b);
		if (C[a] != C[b] && W[a] + W[b] <= Y) uf(a, b);
	}
}
//-----------------------------------------------------------------------------------
void optimized_merge() {
	map<int, vector<pair<int, int>>> color;
	rep(i, 0, N) color[C[i]].push_back({ W[i], i });
	for (auto& g : color) sort(g.second.begin(), g.second.end());

	// same color
	for (auto& g : color) {
		auto v = g.second;
		rep(i, 1, v.size()) if (v[0].first + v[i].first <= X) uf(v[0].second, v[i].second);
	}
	
	// different color
	vector<int> order;
	for (auto& g : color) order.push_back(g.first);
	sort(order.begin(), order.end(), [&](int a, int b) {
		return color[a][0].first < color[b][0].first;
	});
	rep(i, 0, N) { //color[order[0]][0] -> any
		auto p = color[order[0]][0];
		if (p.first + W[i] <= Y && order[0] != C[i]) uf(p.second, i);
	}
	if (2 <= order.size()) rep(i, 0, N) { //color[order[1]][0] -> any
		auto p = color[order[1]][0];
		if (p.first + W[i] <= Y && order[1] != C[i]) uf(p.second, i);
	}
}
//-----------------------------------------------------------------------------------
int count() {
	map<int, vector<int>> group;
	rep(i, 0, N) group[uf[i]].push_back(i);

	int res = 1;
	for (auto g : group) {
		auto v = g.second;
		int com = fac[v.size()];

		map<int, int> cnt;
		for (int i : v) cnt[C[i]]++;
		for (auto p : cnt) com = mul(com, ifac[p.second]);

		res = mul(res, com);
	}

	return res;
}
//-----------------------------------------------------------------------------------
int main() {
	initfac();
	cin >> N >> X >> Y;
	rep(i, 0, N) scanf("%d%d", &C[i], &W[i]);

	//naive_merge();
	optimized_merge();
	cout << count() << endl;
}

Submission Info

Submission Time
Task D - Colorful Balls
User hamayanhamayan
Language C++14 (GCC 5.4.1)
Score 1000
Code Size 2877 Byte
Status AC
Exec Time 1568 ms
Memory 25352 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:89:42: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  rep(i, 0, N) scanf("%d%d", &C[i], &W[i]);
                                          ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1000 / 1000
Status
AC × 3
AC × 57
Set Name Test Cases
Sample 00_example_01.txt, 00_example_02.txt, 00_example_03.txt
All 00_example_01.txt, 00_example_02.txt, 00_example_03.txt, 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, 37.txt, 38.txt, 39.txt, 40.txt, 41.txt, 42.txt, 43.txt, 44.txt, 45.txt, 46.txt, 47.txt, 48.txt, 49.txt, 50.txt, 51.txt, 52.txt, 53.txt, 54.txt
Case Name Status Exec Time Memory
00_example_01.txt AC 116 ms 2816 KB
00_example_02.txt AC 115 ms 2560 KB
00_example_03.txt AC 115 ms 2560 KB
01.txt AC 115 ms 2688 KB
02.txt AC 115 ms 2688 KB
03.txt AC 124 ms 3072 KB
04.txt AC 115 ms 2560 KB
05.txt AC 119 ms 2816 KB
06.txt AC 115 ms 2688 KB
07.txt AC 310 ms 8316 KB
08.txt AC 115 ms 2688 KB
09.txt AC 139 ms 4072 KB
10.txt AC 146 ms 4084 KB
11.txt AC 115 ms 2688 KB
12.txt AC 115 ms 2688 KB
13.txt AC 129 ms 3200 KB
14.txt AC 115 ms 2560 KB
15.txt AC 228 ms 6144 KB
16.txt AC 315 ms 12408 KB
17.txt AC 129 ms 3328 KB
18.txt AC 146 ms 5076 KB
19.txt AC 190 ms 8348 KB
20.txt AC 974 ms 19080 KB
21.txt AC 954 ms 20872 KB
22.txt AC 1016 ms 22408 KB
23.txt AC 961 ms 18940 KB
24.txt AC 980 ms 24328 KB
25.txt AC 976 ms 19464 KB
26.txt AC 976 ms 18940 KB
27.txt AC 996 ms 18940 KB
28.txt AC 1037 ms 18940 KB
29.txt AC 927 ms 20984 KB
30.txt AC 1001 ms 25352 KB
31.txt AC 1022 ms 18940 KB
32.txt AC 995 ms 20876 KB
33.txt AC 1020 ms 18940 KB
34.txt AC 1012 ms 17400 KB
35.txt AC 220 ms 10788 KB
36.txt AC 298 ms 10228 KB
37.txt AC 226 ms 10704 KB
38.txt AC 221 ms 10840 KB
39.txt AC 227 ms 10824 KB
40.txt AC 1218 ms 19960 KB
41.txt AC 1496 ms 20728 KB
42.txt AC 1528 ms 21324 KB
43.txt AC 1568 ms 22996 KB
44.txt AC 1546 ms 20852 KB
45.txt AC 1559 ms 24532 KB
46.txt AC 1506 ms 20724 KB
47.txt AC 205 ms 14520 KB
48.txt AC 236 ms 19640 KB
49.txt AC 220 ms 15928 KB
50.txt AC 894 ms 17764 KB
51.txt AC 919 ms 17172 KB
52.txt AC 217 ms 15316 KB
53.txt AC 214 ms 15188 KB
54.txt AC 214 ms 15572 KB