QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#755248#964. Excluded MinHoochWA 2ms12068kbC++234.9kb2024-11-16 16:51:022024-11-16 16:51:03

Judging History

你现在查看的是最新测评结果

  • [2024-11-16 16:51:03]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:12068kb
  • [2024-11-16 16:51:02]
  • 提交

answer

#include <bits/stdc++.h>

using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;

constexpr int N = 5E5 + 5;

int n, q, a[N], ans[N];
std::vector<int> vec[N];

template<class Info, class Tag>
class LazySegmentTree {
public:
	int n;
	std::vector<Info> t;
	std::vector<Tag> tag;
	LazySegmentTree() {}
	LazySegmentTree(int _n) {
		init(_n, std::vector<Info>(n, {}));
	}
	LazySegmentTree(int _n, std::vector<Info> a) {
		init(_n, a);
	}
	void pull(int x) {t[x] = t[x * 2] + t[x * 2 + 1];}
	void init(int _n, std::vector<Info> a) {
		n = _n;
		t.assign((n + 1) << 2, {});
		tag.assign((n + 1) << 2, {});
		std::function<void(int, int, int)> build = [&](int x, int l, int r) {
			if (l == r) {
				t[x] = a[l];
				return ;
			}
			int mid = (l + r) / 2;
			build(x * 2, l, mid);
			build(x * 2 + 1, mid + 1, r);
			pull(x);
		} ;
		build(1, 1, n);
	}
	void apply(int x, Tag v) {
		t[x].apply(v);
		tag[x].apply(v);
	}
	void push(int x) {
		apply(x * 2, tag[x]);
		apply(x * 2 + 1, tag[x]);
		tag[x] = {};
	}
	void modify(int x, int l, int r, int L, int R, Tag v) {
		if (r < L || l > R) return ;
		if (l >= L && r <= R) return apply(x, v);
		int mid = (l + r) / 2; push(x);
		modify(x * 2, l, mid, L, R, v);
		modify(x * 2 + 1, mid + 1, r, L, R, v);
		pull(x);
	} ;
	void modify(int L, int R, Tag v) {modify(1, 1, n, L, R, v);}
	void modify(int pos, Tag v) {modify(pos, pos, v);}
	void change(int x, int l, int r, int pos, Info v) {
		if (l == r) return void(t[x] = v);
		int mid = (l + r) / 2; push(x);
		if (pos <= mid) change(x * 2, l, mid, pos, v);
		else change(x * 2 + 1, mid + 1, r, pos, v);
		pull(x);
	}
	void change(int pos, Info v) {change(1, 1, n, pos, v);}
	Info query(int x, int l, int r, int L, int R) {
		if (r < L || l > R) return {};
		if (l >= L && r <= R) return t[x];
		int mid = (l + r) / 2; push(x);
		return query(x * 2, l, mid, L, R) + query(x * 2 + 1, mid + 1, r, L, R);
	}
	Info query(int L, int R) {return query(1, 1, n, L, R);}
} ;
struct Tag {
	int tag = 0;
	void apply(const Tag &v) {tag += v.tag;}
} ;
struct Info {
	int max = -1E9, pos = 0;
	void apply(const Tag &v) {max += v.tag;}
} ;
Info operator+(Info a, Info b) {
	return (Info) {
		std::max(a.max, b.max),
		a.max > b.max ? a.pos : b.pos
	} ;
}

LazySegmentTree<Info, Tag> seg1, seg2;

struct Fenwick {
	int sum[N];
	void add(int x, int val) {for (; x <= n; x += x & -x) sum[x] += val;}
	int query(int x) {int res = 0; for (; x; x -= x & -x) res += sum[x]; return res;}
} fen;

struct Query {
	int l, r;
	int idx;
	bool operator<(const Query &p) const {
		return l == p.l ? r > p.r : l < p.l;
	}
} b[N];

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	std::cin >> n >> q;

	for (int i = 1; i <= n; ++i) {
		std::cin >> a[i];
		vec[a[i]].push_back(i);
	}

	for (int i = 1; i <= q; ++i) {
		std::cin >> b[i].l >> b[i].r;
		b[i].idx = i;
	}

	std::sort(b + 1, b + 1 + q);

	std::vector<Info> init(q + 1);
	int max = 0;
	std::set<std::array<int, 2>> pl, pr;
	for (int i = 1; i <= q; ++i) {
		if (max < b[i].r) {
			max = b[i].r;
			pl.insert({b[i].l, i});
			pr.insert({b[i].r, i});
			init[i].max = b[i].r - b[i].l + 1 - n;
		}
		init[i].pos = i;
	}
	seg1.init(q, init);

	for (int i = 1; i <= n; ++i) fen.sum[i] = (i & -i);

	for (int i = 1; i <= q; ++i) {
		if (init[i].max == -1E9) init[i].max = b[i].r;
		else init[i] = {};
		init[i].pos = i;
	}
	seg2.init(q, init);

	// for (int i = 1; i <= q; ++i) {
	// 	std::cerr << b[i].l << " " << b[i].r << " " << b[i].idx << "\n";
	// }

	for (int mex = n; mex >= 0; --mex) {
		// std::cerr << "mex : " << mex << "\n";
		while (seg1.query(1, q).max > 0) {
			int pos = seg1.query(1, q).pos;
			seg1.change(pos, (Info){(int)-1E9, pos});
			// std::cerr << "pos : " << pos << "!\n";
			auto it = pr.lower_bound({b[pos].r, pos});
			int tR = (it == pr.begin() ? 0 : (*std::prev(it))[0]);
			int nR = (std::next(it) == pr.end() ? n + 1 : (*std::next(it))[1]);
			// std::cerr << "tR : " << tR << " , nR : " << nR << "\n";
			ans[b[pos].idx] = mex + 1;
			pr.erase(it);
			pl.erase(pl.lower_bound({b[pos].l, pos}));
			while (true) {
				int np = seg2.query(pos + 1, nR - 1).pos;
				if (b[np].r > tR) {
					pl.insert({b[np].l, np});
					pr.insert({b[np].r, np});
					seg2.change(np, (Info){(int)-1E9, np});
					seg1.change(np, (Info){fen.query(b[np].r) - fen.query(b[np].l - 1) - mex, np});
					nR = np;
				} else break;
			}
		}
		seg1.modify(1, q, (Tag){1});
		for (auto i : vec[mex]) {
			fen.add(i, -1);
			auto itr = pr.lower_bound({i, 0});
			if (itr == pr.end()) continue;
			auto itl = pl.upper_bound({i, (int)1E9});
			if (itl == pl.begin()) continue;
			int r = (*std::prev(itl))[1], l = (*itr)[1];
			// std::cerr << "l : " << l << " , r : " << r << "\n";
			seg1.modify(l, r, (Tag){-1});
		}
	}

	for (int i = 1; i <= q; ++i) {
		std::cout << ans[i] << "\n";
	}

	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 11832kb

input:

3 3
0 0 2
1 3
2 3
3 3

output:

3
1
0

result:

ok 3 number(s): "3 1 0"

Test #2:

score: 0
Accepted
time: 2ms
memory: 12024kb

input:

3 2
1 2 2
1 2
1 3

output:

0
3

result:

ok 2 number(s): "0 3"

Test #3:

score: 0
Accepted
time: 2ms
memory: 12028kb

input:

10 10
3 0 3 3 9 7 9 6 0 7
3 3
9 9
4 6
1 9
3 4
2 4
7 10
3 7
5 7
2 7

output:

0
1
0
5
0
1
1
0
0
1

result:

ok 10 numbers

Test #4:

score: 0
Accepted
time: 2ms
memory: 11880kb

input:

10 10
3 0 0 0 5 1 1 1 2 1
1 2
8 8
5 7
1 7
2 2
1 5
5 6
4 6
3 10
6 8

output:

1
0
2
7
1
4
0
2
8
3

result:

ok 10 numbers

Test #5:

score: 0
Accepted
time: 0ms
memory: 12068kb

input:

100 100
15 82 7 39 63 55 64 99 71 63 32 99 67 94 3 43 15 75 45 55 53 4 35 36 15 40 82 20 62 43 6 83 27 95 27 45 98 44 35 98 39 7 17 32 76 7 40 16 40 63 13 8 22 27 11 12 61 14 19 45 100 97 90 88 22 59 25 63 4 25 65 16 22 92 84 44 99 66 89 26 93 97 35 97 92 1 32 40 97 97 78 43 7 12 23 53 61 74 33 90
1...

output:

68
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
48
0
0
0
0
0
0
0
0
0
0
0
0
0
28
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

result:

ok 100 numbers

Test #6:

score: 0
Accepted
time: 2ms
memory: 11744kb

input:

100 100
17 86 33 8 11 27 8 11 13 9 3 43 11 23 26 42 44 12 44 12 15 0 75 51 72 5 49 2 40 57 24 47 39 42 4 5 6 52 3 2 42 19 62 33 24 22 16 69 4 33 44 70 29 11 2 2 58 9 6 10 25 10 33 26 17 3 14 0 48 7 48 51 0 39 54 37 14 9 3 85 18 4 25 9 2 0 39 8 17 13 25 45 10 39 12 18 9 5 66 6
13 89
10 90
42 67
43 52...

output:

76
80
0
0
18
1
18
1
5
5
1
1
22
11
0
15
0
59
5
56
1
80
0
1
1
21
0
61
22
11
0
3
8
15
40
1
8
81
71
20
2
0
60
0
60
31
0
59
0
0
0
28
0
21
1
7
5
0
31
0
76
28
0
0
27
1
23
0
1
27
1
0
0
1
0
5
63
52
2
43
73
1
86
0
61
0
27
2
30
5
31
1
0
14
59
27
1
1
67
63

result:

ok 100 numbers

Test #7:

score: 0
Accepted
time: 2ms
memory: 11876kb

input:

100 100
6 1 1 5 13 11 35 5 3 2 0 4 0 9 1 2 3 3 19 1 7 9 7 11 7 8 10 18 28 17 31 2 4 8 2 3 3 2 22 4 9 4 7 2 9 15 8 2 3 19 5 24 3 10 11 5 9 20 8 4 11 10 18 9 13 34 5 34 2 9 24 6 21 16 6 12 26 2 2 2 6 11 2 14 3 8 2 12 2 19 8 3 18 23 5 21 23 8 4 0
44 67
25 74
24 79
59 73
4 81
42 66
48 55
15 38
35 63
16 ...

output:

22
50
56
0
78
23
0
22
29
24
38
37
17
57
0
6
0
58
52
4
64
44
0
37
75
75
34
89
0
4
0
12
39
0
0
69
53
14
38
13
36
30
0
7
46
83
28
6
44
22
40
50
24
26
36
49
0
0
6
49
27
78
0
37
11
49
16
50
25
30
37
58
64
28
62
36
0
52
0
95
34
4
50
17
0
27
44
0
0
21
44
66
69
0
39
25
0
2
63
0

result:

ok 100 numbers

Test #8:

score: -100
Wrong Answer
time: 2ms
memory: 12000kb

input:

100 100
0 1 0 1 0 1 1 1 0 2 1 1 2 0 1 1 0 3 0 0 0 0 0 0 0 0 1 2 2 0 0 0 0 1 0 0 1 2 0 0 1 0 0 3 0 1 0 0 3 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 2 0 0 0 4 0 1 1 0 1 0 2 2 0 0 1
41 53
31 36
78 99
60 86
1 67
3 92
89 92
60 70
42 56
42 46
39 84
40 66
9 27
75 78
33 94
17 53...

output:

13
6
22
27
67
90
2
11
15
5
46
27
19
4
62
37
84
35
53
4
47
95
55
63
24
39
22
51
67
21
55
36
24
16
33
74
4
16
63
81
41
14
3
54
6
40
36
33
29
32
14
60
13
17
73
44
34
2
14
79
59
13
75
72
31
10
22
57
23
37
74
2
6
6
38
5
4
62
66
22
33
0
23
21
12
54
75
6
8
16
37
36
3
53
63
18
67
60
31
19

result:

wrong answer 7th numbers differ - expected: '3', found: '2'