QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#114154#964. Excluded MinFISHER_WA 4ms30504kbC++143.6kb2023-06-21 10:45:252023-06-21 10:45:28

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-06-21 10:45:28]
  • 评测
  • 测评结果:WA
  • 用时:4ms
  • 内存:30504kb
  • [2023-06-21 10:45:25]
  • 提交

answer

#include <bits/stdc++.h>
#define PB push_back
#define EB emplace_back
using namespace std;
const int maxn = 500000, V = 500000;
int n, Q;
int a[maxn + 5];
int t[maxn + 5];
void modify(int x, int v) {
	for (; x <= n; x += x & (-x)) t[x] += v;
}
int query(int x) {
	int rs = 0;
	for (; x; x -= x & (-x)) rs += t[x];
	return rs;
}
int query(int l, int r) { return query(r) - query(l - 1); }
int ti;
namespace SEG1 {
int mx[4 * maxn + 5], tg[4 * maxn + 5];
inline void mark(int p, int v) { mx[p] += v, tg[p] += v; }
inline void pushdown(int p) {
	if (tg[p]) {
		mark(p << 1, tg[p]), mark(p << 1 | 1, tg[p]);
		tg[p] = 0;
	}
}
inline void pushup(int p) { mx[p] = max(mx[p << 1], mx[p << 1 | 1]); }
void ins(int p, int l, int r, int x, int v) {
	if (l == r) return mx[p] = v, void();
	pushdown(p);
	int mid = (l + r) / 2;
	if (mid >= x) ins(p << 1, l, mid, x, v);
	else ins(p << 1 | 1, mid + 1, r, x, v);
	pushup(p);
}
void modify(int p, int l, int r, int x, int y) {
	if (x <= l && r <= y) return mark(p, -1);
	pushdown(p);
	int mid = (l + r) / 2;
	if (mid >= x) modify(p << 1, l, mid, x, y);
	if (mid < y) modify(p << 1 | 1, mid + 1, r, x, y);
	pushup(p);
}
int find(int p, int l, int r) {
	if (l == r) return l;
	pushdown(p);
	int mid = (l + r) / 2;
	if (mx[p << 1] > ti) return find(p << 1, l, mid);
	return find(p << 1 | 1, mid + 1, r); 
}
} // namespace SEG1
struct item {
	int r, id;
	bool operator<(const item& b) const {
		if (r == b.r) return id > b.id;
		return r < b.r;
	}
};
namespace SEG2 {
item mx[4 * maxn + 5];
item find(int p, int l, int r, int x, int y) {
	if (x <= l && r <= y) return mx[p];
	int mid = (l + r) / 2;
	item rs{0, 0};
	if (mid >= x) rs = max(rs, find(p << 1, l, mid, x, y));
	if (mid < y) rs = max(rs, find(p << 1 | 1, mid + 1, r, x, y));
	return rs;
}
inline void pushup(int p) { mx[p] = max(mx[p << 1], mx[p << 1 | 1]); }
void ins(int p, int l, int r, int x, item v) {
	if (l == r) return mx[p] = v, void();
	int mid = (l + r) / 2;
	if (mid >= x) ins(p << 1, l, mid, x, v);
	else ins(p << 1 | 1, mid + 1, r, x, v);
	pushup(p);
}
} // namespace SEG2
set<item> sl, sr;
vector<int> L[maxn + 5];
struct Query {
	int l, r, id;
	bool operator<(const Query& b) const {
		if (l == b.l) return r > b.r;
		return l < b.l;
	}
} q[maxn + 5];
void ins(int x) {
	SEG1::ins(1, 1, Q, x, query(q[x].l, q[x].r));
	sl.insert({q[x].l, x}), sr.insert({q[x].r, x});
}
int ans[maxn + 5];
int main() {
	scanf("%d%d", &n, &Q);
	for (int i = 1, a; i <= n; i++) {
		scanf("%d", &a);
		L[a].PB(i);
		modify(i, 1);
	}
	for (int i = 1; i <= Q; i++) scanf("%d%d", &q[i].l, &q[i].r), q[i].id = i;
	sort(q + 1, q + Q + 1);
	memset(SEG1::mx, -1, sizeof(SEG1::mx));
	for (int i = 1, r = 0; i <= Q; i++) {
		if (q[i].r > r) {
			r = q[i].r;
			ins(i);
		} else SEG2::ins(1, 1, Q, i, {q[i].r, i});
	}
	for (ti = V; ~ti; ti--) {
		for (int x : L[ti + 1]) {
			modify(x, -1);
			auto ir = sr.lower_bound({x, (int)1E9}), il = sl.upper_bound({x, 0});
			if (ir == sr.end() || il == sl.begin()) continue;
			SEG1::modify(1, 1, Q, prev(il)->id, ir->id);
		}
		while (SEG1::mx[1] > ti) {
			int x = SEG1::find(1, 1, Q);
			SEG1::ins(1, 1, Q, x, -1E9);
			auto it = sr.find({q[x].r, x});
			int y = next(it) == sr.end() ? Q : next(it)->id, l = it == sr.begin() ? 0 : prev(it)->r;
			sl.erase({q[x].l, x}), sr.erase(it);
			while (x < y) {
				auto rs = SEG2::find(1, 1, Q, x, y);
				if (rs.r <= l) break;
				ins(y = rs.id);
				SEG2::ins(1, 1, Q, y, {0, 0});
			}
			ans[q[x].id] = ti + 1;
		}
	}
	for (int i = 1; i <= Q; i++) printf("%d\n", ans[i]);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 30504kb

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: 4ms
memory: 30324kb

input:

3 2
1 2 2
1 2
1 3

output:

0
3

result:

ok 2 number(s): "0 3"

Test #3:

score: -100
Wrong Answer
time: 0ms
memory: 30280kb

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
8
0
1
2
0
0
1

result:

wrong answer 4th numbers differ - expected: '5', found: '8'