답안 #141084

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
141084 2019-08-06T15:52:39 Z DrumpfTheGodEmperor Rope (JOI17_rope) C++14
80 / 100
2500 ms 128516 KB
#include <bits/stdc++.h>
#define bp __builtin_popcountll
#define pb push_back
#define in(s) freopen(s, "r", stdin);
#define out(s) freopen(s, "w", stdout);
#define inout(s, end1, end2) freopen((string(s) + "." + end1).c_str(), "r", stdin),\
		freopen((string(s) + "." + end2).c_str(), "w", stdout);
#define fi first
#define se second
#define bw(i, r, l) for (int i = r - 1; i >= l; i--)
#define fw(i, l, r) for (int i = l; i < r; i++)
#define fa(i, x) for (auto i: x)
using namespace std;
typedef pair<int, int> ii;
const int mod = 1e9 + 7, inf = 1061109567;
const long long infll = 4557430888798830399;
const int N = 1e6 + 5;
int n, m, c[N], ans[N], cnt[N], curCnt[N];
vector<ii> v;
vector<int> app[N];
set<ii> s;
void removeColor(int color) {
	s.erase(s.lower_bound(ii(curCnt[color], color)));
//	cout << "Remove " << color << "\n";
	curCnt[color]--;
	s.insert(ii(curCnt[color], color));
}
void resetColor(int color) {
	if (curCnt[color] != cnt[color]) {
		s.erase(s.lower_bound(ii(curCnt[color], color)));
		curCnt[color] = cnt[color];
		s.insert(ii(curCnt[color], color));
	}
}
signed main() {
	#ifdef BLU
	in("blu.inp");
	#endif
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n >> m;
	fw (i, 0, n) cin >> c[i];
	//Pre - color the rope then fold. Folding can be done if segments of the same color, except the first
	//and last one are all of even length.
	memset(ans, 63, sizeof ans);
	memset(cnt, 0, sizeof cnt);
	fw (i, 0, n) cnt[c[i]]++;
	fw (i, 1, m + 1) s.insert(ii(cnt[i], i)), curCnt[i] = cnt[i];
	fw (i, 0, 2) {
		bool lastExcluded = 0;
		if (i == 0 && (n & 1)) lastExcluded = 1;
		if (i == 1 && !(n & 1)) lastExcluded = 1;
		//Fix the first segment one as either odd or even.
		fw (color, 1, m + 1) app[color].clear();
		v.clear();
		for (int j = i; j < n; j += 2) {
			if (j + 1 >= n) break;
			v.pb(ii(c[j], c[j + 1]));
		}
		fw (j, 0, v.size()) {
			app[v[j].fi].pb(j);
			if (v[j].se != v[j].fi) app[v[j].se].pb(j);
		}
		fw (j, 1, m + 1) {
			int totalCost = 0, cntExcluded = 0;
			//Find element with max cnt excluding all the pairs that color j appears in
			if (i == 1 && c[0] == j) {
				removeColor(c[0]);
				cntExcluded++;
			}
			if (lastExcluded && c[n - 1] == j) {
				removeColor(c[n - 1]);
				cntExcluded++;
			}
			fa (pairID, app[j]) {
				int cost = 0;
				if (v[pairID].fi != j || v[pairID].se != j) cost = 1;
				totalCost += cost;
				
				removeColor(v[pairID].fi);
				removeColor(v[pairID].se);
				
				cntExcluded += 2;
			}
			ii mostFrequentColor = *s.rbegin();
			int mxAppearances = mostFrequentColor.fi, cntIncluded = n - cntExcluded;
			//cntIncluded counts the number of cords included in group 2.
			totalCost += cntIncluded - mxAppearances;
//			cout << "the pair is: " << mostFrequentColor.fi << " " << mostFrequentColor.se << "\n";
//			cout << "mxApperances = " << mxAppearances << " cntIncluded = " << cntIncluded << "\n";
			ans[j] = min(ans[j], totalCost);
//			cout << "i = " << i << " ans[" << j << "] = " << totalCost << "\n";
			//Reset curCnt and the set.
			fa (pairID, app[j]) {
				resetColor(v[pairID].fi);
				resetColor(v[pairID].se);
			}
			resetColor(c[0]);
			resetColor(c[n - 1]);
		}
	}
	fw (color, 1, m + 1) cout << ans[color] << "\n";
	return 0;
}

Compilation message

rope.cpp: In function 'int main()':
rope.cpp:11:39: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define fw(i, l, r) for (int i = l; i < r; i++)
rope.cpp:59:7:
   fw (j, 0, v.size()) {
       ~~~~~~~~~~~~~~                   
rope.cpp:59:3: note: in expansion of macro 'fw'
   fw (j, 0, v.size()) {
   ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 31736 KB Output is correct
2 Correct 30 ms 31608 KB Output is correct
3 Correct 31 ms 31608 KB Output is correct
4 Correct 30 ms 31608 KB Output is correct
5 Correct 30 ms 31612 KB Output is correct
6 Correct 30 ms 31652 KB Output is correct
7 Correct 31 ms 31656 KB Output is correct
8 Correct 30 ms 31608 KB Output is correct
9 Correct 31 ms 31608 KB Output is correct
10 Correct 31 ms 31608 KB Output is correct
11 Correct 32 ms 31736 KB Output is correct
12 Correct 30 ms 31708 KB Output is correct
13 Correct 30 ms 31608 KB Output is correct
14 Correct 30 ms 31608 KB Output is correct
15 Correct 30 ms 31608 KB Output is correct
16 Correct 30 ms 31736 KB Output is correct
17 Correct 30 ms 31708 KB Output is correct
18 Correct 31 ms 31608 KB Output is correct
19 Correct 30 ms 31608 KB Output is correct
20 Correct 31 ms 31608 KB Output is correct
21 Correct 30 ms 31608 KB Output is correct
22 Correct 30 ms 31600 KB Output is correct
23 Correct 32 ms 31608 KB Output is correct
24 Correct 30 ms 31608 KB Output is correct
25 Correct 31 ms 31608 KB Output is correct
26 Correct 31 ms 31608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 31736 KB Output is correct
2 Correct 30 ms 31608 KB Output is correct
3 Correct 31 ms 31608 KB Output is correct
4 Correct 30 ms 31608 KB Output is correct
5 Correct 30 ms 31612 KB Output is correct
6 Correct 30 ms 31652 KB Output is correct
7 Correct 31 ms 31656 KB Output is correct
8 Correct 30 ms 31608 KB Output is correct
9 Correct 31 ms 31608 KB Output is correct
10 Correct 31 ms 31608 KB Output is correct
11 Correct 32 ms 31736 KB Output is correct
12 Correct 30 ms 31708 KB Output is correct
13 Correct 30 ms 31608 KB Output is correct
14 Correct 30 ms 31608 KB Output is correct
15 Correct 30 ms 31608 KB Output is correct
16 Correct 30 ms 31736 KB Output is correct
17 Correct 30 ms 31708 KB Output is correct
18 Correct 31 ms 31608 KB Output is correct
19 Correct 30 ms 31608 KB Output is correct
20 Correct 31 ms 31608 KB Output is correct
21 Correct 30 ms 31608 KB Output is correct
22 Correct 30 ms 31600 KB Output is correct
23 Correct 32 ms 31608 KB Output is correct
24 Correct 30 ms 31608 KB Output is correct
25 Correct 31 ms 31608 KB Output is correct
26 Correct 31 ms 31608 KB Output is correct
27 Correct 78 ms 33328 KB Output is correct
28 Correct 68 ms 33140 KB Output is correct
29 Correct 76 ms 33368 KB Output is correct
30 Correct 70 ms 33368 KB Output is correct
31 Correct 76 ms 33396 KB Output is correct
32 Correct 69 ms 33268 KB Output is correct
33 Correct 76 ms 33396 KB Output is correct
34 Correct 70 ms 33312 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 31736 KB Output is correct
2 Correct 30 ms 31608 KB Output is correct
3 Correct 31 ms 31608 KB Output is correct
4 Correct 30 ms 31608 KB Output is correct
5 Correct 30 ms 31612 KB Output is correct
6 Correct 30 ms 31652 KB Output is correct
7 Correct 31 ms 31656 KB Output is correct
8 Correct 30 ms 31608 KB Output is correct
9 Correct 31 ms 31608 KB Output is correct
10 Correct 31 ms 31608 KB Output is correct
11 Correct 32 ms 31736 KB Output is correct
12 Correct 30 ms 31708 KB Output is correct
13 Correct 30 ms 31608 KB Output is correct
14 Correct 30 ms 31608 KB Output is correct
15 Correct 30 ms 31608 KB Output is correct
16 Correct 30 ms 31736 KB Output is correct
17 Correct 30 ms 31708 KB Output is correct
18 Correct 31 ms 31608 KB Output is correct
19 Correct 30 ms 31608 KB Output is correct
20 Correct 31 ms 31608 KB Output is correct
21 Correct 30 ms 31608 KB Output is correct
22 Correct 30 ms 31600 KB Output is correct
23 Correct 32 ms 31608 KB Output is correct
24 Correct 30 ms 31608 KB Output is correct
25 Correct 31 ms 31608 KB Output is correct
26 Correct 31 ms 31608 KB Output is correct
27 Correct 78 ms 33328 KB Output is correct
28 Correct 68 ms 33140 KB Output is correct
29 Correct 76 ms 33368 KB Output is correct
30 Correct 70 ms 33368 KB Output is correct
31 Correct 76 ms 33396 KB Output is correct
32 Correct 69 ms 33268 KB Output is correct
33 Correct 76 ms 33396 KB Output is correct
34 Correct 70 ms 33312 KB Output is correct
35 Correct 178 ms 33400 KB Output is correct
36 Correct 177 ms 33396 KB Output is correct
37 Correct 178 ms 33396 KB Output is correct
38 Correct 176 ms 33400 KB Output is correct
39 Correct 182 ms 33396 KB Output is correct
40 Correct 146 ms 33524 KB Output is correct
41 Correct 147 ms 33652 KB Output is correct
42 Correct 138 ms 33392 KB Output is correct
43 Correct 136 ms 33524 KB Output is correct
44 Correct 149 ms 33520 KB Output is correct
45 Correct 150 ms 33652 KB Output is correct
46 Correct 139 ms 33392 KB Output is correct
47 Correct 137 ms 33400 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 31736 KB Output is correct
2 Correct 30 ms 31608 KB Output is correct
3 Correct 31 ms 31608 KB Output is correct
4 Correct 30 ms 31608 KB Output is correct
5 Correct 30 ms 31612 KB Output is correct
6 Correct 30 ms 31652 KB Output is correct
7 Correct 31 ms 31656 KB Output is correct
8 Correct 30 ms 31608 KB Output is correct
9 Correct 31 ms 31608 KB Output is correct
10 Correct 31 ms 31608 KB Output is correct
11 Correct 32 ms 31736 KB Output is correct
12 Correct 30 ms 31708 KB Output is correct
13 Correct 30 ms 31608 KB Output is correct
14 Correct 30 ms 31608 KB Output is correct
15 Correct 30 ms 31608 KB Output is correct
16 Correct 30 ms 31736 KB Output is correct
17 Correct 30 ms 31708 KB Output is correct
18 Correct 31 ms 31608 KB Output is correct
19 Correct 30 ms 31608 KB Output is correct
20 Correct 31 ms 31608 KB Output is correct
21 Correct 30 ms 31608 KB Output is correct
22 Correct 30 ms 31600 KB Output is correct
23 Correct 32 ms 31608 KB Output is correct
24 Correct 30 ms 31608 KB Output is correct
25 Correct 31 ms 31608 KB Output is correct
26 Correct 31 ms 31608 KB Output is correct
27 Correct 78 ms 33328 KB Output is correct
28 Correct 68 ms 33140 KB Output is correct
29 Correct 76 ms 33368 KB Output is correct
30 Correct 70 ms 33368 KB Output is correct
31 Correct 76 ms 33396 KB Output is correct
32 Correct 69 ms 33268 KB Output is correct
33 Correct 76 ms 33396 KB Output is correct
34 Correct 70 ms 33312 KB Output is correct
35 Correct 178 ms 33400 KB Output is correct
36 Correct 177 ms 33396 KB Output is correct
37 Correct 178 ms 33396 KB Output is correct
38 Correct 176 ms 33400 KB Output is correct
39 Correct 182 ms 33396 KB Output is correct
40 Correct 146 ms 33524 KB Output is correct
41 Correct 147 ms 33652 KB Output is correct
42 Correct 138 ms 33392 KB Output is correct
43 Correct 136 ms 33524 KB Output is correct
44 Correct 149 ms 33520 KB Output is correct
45 Correct 150 ms 33652 KB Output is correct
46 Correct 139 ms 33392 KB Output is correct
47 Correct 137 ms 33400 KB Output is correct
48 Correct 2076 ms 50916 KB Output is correct
49 Correct 2089 ms 50912 KB Output is correct
50 Correct 2064 ms 51024 KB Output is correct
51 Correct 1835 ms 50396 KB Output is correct
52 Correct 1626 ms 49116 KB Output is correct
53 Correct 1519 ms 50140 KB Output is correct
54 Correct 1383 ms 49108 KB Output is correct
55 Correct 1330 ms 49068 KB Output is correct
56 Correct 1285 ms 48608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 31736 KB Output is correct
2 Correct 30 ms 31608 KB Output is correct
3 Correct 31 ms 31608 KB Output is correct
4 Correct 30 ms 31608 KB Output is correct
5 Correct 30 ms 31612 KB Output is correct
6 Correct 30 ms 31652 KB Output is correct
7 Correct 31 ms 31656 KB Output is correct
8 Correct 30 ms 31608 KB Output is correct
9 Correct 31 ms 31608 KB Output is correct
10 Correct 31 ms 31608 KB Output is correct
11 Correct 32 ms 31736 KB Output is correct
12 Correct 30 ms 31708 KB Output is correct
13 Correct 30 ms 31608 KB Output is correct
14 Correct 30 ms 31608 KB Output is correct
15 Correct 30 ms 31608 KB Output is correct
16 Correct 30 ms 31736 KB Output is correct
17 Correct 30 ms 31708 KB Output is correct
18 Correct 31 ms 31608 KB Output is correct
19 Correct 30 ms 31608 KB Output is correct
20 Correct 31 ms 31608 KB Output is correct
21 Correct 30 ms 31608 KB Output is correct
22 Correct 30 ms 31600 KB Output is correct
23 Correct 32 ms 31608 KB Output is correct
24 Correct 30 ms 31608 KB Output is correct
25 Correct 31 ms 31608 KB Output is correct
26 Correct 31 ms 31608 KB Output is correct
27 Correct 78 ms 33328 KB Output is correct
28 Correct 68 ms 33140 KB Output is correct
29 Correct 76 ms 33368 KB Output is correct
30 Correct 70 ms 33368 KB Output is correct
31 Correct 76 ms 33396 KB Output is correct
32 Correct 69 ms 33268 KB Output is correct
33 Correct 76 ms 33396 KB Output is correct
34 Correct 70 ms 33312 KB Output is correct
35 Correct 178 ms 33400 KB Output is correct
36 Correct 177 ms 33396 KB Output is correct
37 Correct 178 ms 33396 KB Output is correct
38 Correct 176 ms 33400 KB Output is correct
39 Correct 182 ms 33396 KB Output is correct
40 Correct 146 ms 33524 KB Output is correct
41 Correct 147 ms 33652 KB Output is correct
42 Correct 138 ms 33392 KB Output is correct
43 Correct 136 ms 33524 KB Output is correct
44 Correct 149 ms 33520 KB Output is correct
45 Correct 150 ms 33652 KB Output is correct
46 Correct 139 ms 33392 KB Output is correct
47 Correct 137 ms 33400 KB Output is correct
48 Correct 2076 ms 50916 KB Output is correct
49 Correct 2089 ms 50912 KB Output is correct
50 Correct 2064 ms 51024 KB Output is correct
51 Correct 1835 ms 50396 KB Output is correct
52 Correct 1626 ms 49116 KB Output is correct
53 Correct 1519 ms 50140 KB Output is correct
54 Correct 1383 ms 49108 KB Output is correct
55 Correct 1330 ms 49068 KB Output is correct
56 Correct 1285 ms 48608 KB Output is correct
57 Execution timed out 2559 ms 128516 KB Time limit exceeded
58 Halted 0 ms 0 KB -