QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#799204#7010. Rikka with A Long Colour PaletteLongvuAC ✓1997ms31588kbC++233.0kb2024-12-05 02:17:182024-12-05 02:17:18

Judging History

This is the latest submission verdict.

  • [2024-12-05 02:17:18]
  • Judged
  • Verdict: AC
  • Time: 1997ms
  • Memory: 31588kb
  • [2024-12-05 02:17:18]
  • Submitted

answer

/**
 *    author:  longvu
 *    created: 12/05/24 00:15:29
**/
#include<bits/stdc++.h>

using namespace std;

#define int long long
#define sz(x) ((int)x.size())
#define all(x) (x).begin(), (x).end()
const int INF = numeric_limits<int>::max();
const int nax = (int)(2010001);
const int mod = 1e9 + 7;

template<class X, class Y>
bool maximize(X& x, const Y y) {
	if (y > x) {x = y; return true;}
	return false;
}
template<class X, class Y>
bool minimize(X& x, const Y y) {
	if (y < x) {x = y; return true;}
	return false;
}

#define NL 2 * si
#define NR 2 * si + 1

struct Segment_tree {
	int seg[4 * nax];
	void build(int si, int sl, int sr) {
		if (sl == sr) {
			seg[si] = 0;
			return;
		}
		int mid = (sl + sr) >> 1;
		build(NL, sl, mid);
		build(NR, mid + 1, sr);
		seg[si] = min(seg[NL], seg[NR]);
	}

	void update(int si, int sl, int sr, int idx, int val) {
		if (sl > idx || sr < idx) {
			return;
		}
		if (sl == sr) {
			seg[si] = val;
			return;
		}
		int mid = (sl + sr) >> 1;
		update(NL, sl, mid, idx, val);
		update(NR, mid + 1, sr, idx, val);
		seg[si] = min(seg[NL], seg[NR]);
	}

	int get(int si, int sl, int sr) {
		if (sl == sr) {
			return sl;
		}
		int mid = (sl + sr) >> 1;
		if (!seg[NL]) {
			return get(NL, sl, mid);
		}
		return get(NR, mid + 1, sr);
	}
};

int L[nax], R[nax], anstr[nax];
vector<int> memo[nax];
Segment_tree IT;
int32_t main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int tt;
	cin >> tt;
	while (tt--) {
		int n, k;
		cin >> n >> k;
		vector<int> value = { -INF};
		for (int i = 1; i <= n; ++i) {
			cin >> L[i] >> R[i];
			value.push_back(L[i]);
			value.push_back(R[i]);
		}
		sort(all(value));
		value.resize(unique(all(value)) - value.begin());
		for (int i = 1; i < sz(value); ++i) {
			memo[i].clear();
		}
		for (int i = 1; i <= n; ++i) {
			L[i] = lower_bound(all(value), L[i]) - value.begin();
			R[i] = lower_bound(all(value), R[i]) - value.begin();
			memo[L[i]].push_back(i);
			memo[R[i]].push_back(-i);
		}
		IT.build(1, 1, k + 1);
		for (int i = 1; i <= n; ++i) {
			anstr[i] = -1;
		}
		set<int> cur;
		int ans = 0;
		for (int i = 1; i + 1 < sz(value); ++i) {
			for (auto z : memo[i]) {
				if (z <= -1) {
					if (anstr[-z] == -1) {
						cur.erase(-z);
					} else {
						IT.update(1, 1, k + 1, anstr[-z], 0);
					}
				} else {
					cur.insert(z);
				}
			}
			while (IT.get(1, 1, k + 1) <= k && !cur.empty()) {
				int z = IT.get(1, 1, k + 1);
				anstr[*cur.begin()] = z;
				cur.erase(cur.begin());
				IT.update(1, 1, k + 1, z, 1);
			}
			// cout << value[i] << " " << IT.get(1, 1, k + 1) << '\n';
			if (IT.get(1, 1, k + 1) == k + 1) {
				ans += value[i + 1] - value[i];
			}
		}
		for (int i = 1; i <= n; ++i) {
			if (anstr[i] == -1) {
				anstr[i] = 1;
			}
		}
		cout << ans << '\n';
		for (int i = 1; i <= n; ++i) {
			cout << anstr[i];
			if (i < n) {
				cout << " ";
			}
		}
		cout << '\n';
	}
	return 0;
}

这程序好像有点Bug,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 10036kb

input:

1
3 2
1 5
2 4
3 6

output:

3
1 2 2

result:

ok 1 cases

Test #2:

score: 0
Accepted
time: 42ms
memory: 9768kb

input:

1000
100 2
22 75
26 45
72 81
29 47
2 97
25 75
82 84
17 56
2 32
28 37
39 57
11 18
6 79
40 68
16 68
40 63
49 93
10 91
55 68
31 80
18 57
28 34
55 76
21 80
22 45
11 67
67 74
4 91
34 35
65 80
21 95
1 52
25 31
2 53
22 96
89 99
7 66
2 32
33 68
75 92
10 84
28 94
12 54
9 80
21 43
51 92
20 97
7 25
17 67
38 10...

output:

99
1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
99
1 2 1 1 1 1 1 2 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 ...

result:

ok 1000 cases

Test #3:

score: 0
Accepted
time: 1567ms
memory: 31588kb

input:

910
2000 1
291106515 907601188
257183002 580226984
677669535 703754379
578360426 581095542
555843963 776993944
590501585 787712383
268406144 715107805
67868779 956936247
805517214 820489184
673778237 728344625
320030940 533725999
412875077 899787237
376585734 712537132
203142903 420447884
58970816 3...

output:

999533742
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

result:

ok 910 cases

Test #4:

score: 0
Accepted
time: 1997ms
memory: 15632kb

input:

1000
2000 200000
114320346 414198300
865005596 959003090
308399397 989829253
20993741 74598817
703749014 929597776
326260003 367629651
500954265 989504336
465349215 518791173
33679837 905990625
847419333 879685651
285496458 697635762
845139062 964850697
235259972 953405425
872309480 898530420
302629...

output:

0
366 13 792 71 65 346 364 793 123 68 750 52 655 39 35 231 358 735 810 552 238 317 147 383 282 21 687 886 317 181 839 28 153 257 95 463 196 116 591 319 940 584 379 728 122 244 484 599 428 609 696 537 591 928 587 166 37 639 298 260 171 20 264 46 902 377 313 786 745 433 853 496 268 177 838 394 220 2 2...

result:

ok 1000 cases