玄关,线段树求调,32pts,只过了前4个点
查看原帖
玄关,线段树求调,32pts,只过了前4个点
623557
Leaper_lyc楼主2024/10/8 14:41
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
#define ls (p << 1)
#define rs (p << 1 | 1)
bool ans[N];
int n, m;
int a[N], b[N], cnt;
struct shoes {
	int s, d, id;
	bool operator<(const shoes ert) const {
		return s < ert.s;
	}
} pr[N];
int val[N];
vector <int> t[N];
struct node {
	int l, r, pre, suf, ans;
} tr[N << 2];
node pushup(node x, node y) {
	node tmp = {x.l, y.r, 0, 0, 0};
	if (x.r - x.l + 1 == x.pre) tmp.pre = x.pre + y.pre;
	else tmp.pre = x.pre;
	if (y.r - y.l + 1 == y.suf) tmp.suf = x.suf + y.suf;
	else tmp.suf = y.suf;
	tmp.ans = max(max(x.ans, y.ans), x.suf + y.pre);
	return tmp;
}
void build(int p, int l, int r) {
	if (l == r) return tr[p] = {l, r, 1, 1, 1}, void();
	int mid = (l + r) >> 1;
	build(ls, l, mid); build(rs, mid + 1, r);
	tr[p] = pushup(tr[ls], tr[rs]);
}
void update(int p, int l, int r, int id) {
	if (l == r) return tr[p] = {l, r, 0, 0, 0}, void();
	int mid = (l + r) >> 1;
	if (id <= mid) update(ls, l, mid, id);
	else update(rs, mid + 1, r, id);
	tr[p] = pushup(tr[ls], tr[rs]);
}
signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i], b[++cnt] = a[i];
	for (int i = 1; i <= m; i++)
		cin >> pr[i].s >> pr[i].d, pr[i].id = i, b[++cnt] = pr[i].s;
	sort(b + 1, b + cnt + 1), sort(pr + 1, pr + m + 1);
	for (int i = 1; i <= m; i++) {
		pr[i].s = lower_bound(b + 1, b + cnt + 1, pr[i].s) - b;
		val[i] = pr[i].s;
	}
	for (int i = 1, id; i <= n; i++) {
		a[i] = lower_bound(b + 1, b + cnt + 1, a[i]) - b;
		id = lower_bound(val + 1, val + m + 1, a[i]) - val;
		t[id].push_back(i);
	}
	build(1, 1, n);
	for (int i = 1; i <= m; i++) {
		for (auto j : t[i]) update(1, 1, n, j);
		if (tr[1].ans < pr[i].d) ans[pr[i].id] = true;
	}
	for (int i = 1; i <= m; i++) cout << ans[i] << '\n';
}
2024/10/8 14:41
加载中...