呜呜呜,简单线段树上二分求条,已经 RE 了 7 发了
查看原帖
呜呜呜,简单线段树上二分求条,已经 RE 了 7 发了
1118614
I_Love_DS楼主2025/7/19 13:52
#include <bits/stdc++.h>

using namespace std;

const int N = 2000050;
int m = 500000;

int n, q;

struct must100pts {
	int mn, mx;
	must100pts() {}
	must100pts(int x, int y) {mn = x, mx = y;}
};

must100pts operator + (const must100pts &x, const must100pts &y) {
	return must100pts(min(x.mn, y.mn), max(x.mx, y.mx));
}

struct node {
	must100pts x;
	int tg;
} t[4 * N];

void maketag(int k, int z) {
	t[k].x.mn += z;
	t[k].x.mx += z;
	t[k].tg += z;
}

void pushup(int k) {
	t[k].x = t[k + k].x + t[k + k + 1].x;
}

void pushdown(int k) {
	if (!t[k].tg) return;
	maketag(k + k, t[k].tg);
	maketag(k + k + 1, t[k].tg);
	t[k].tg = 0;
}

void build(int k, int l, int r) {
	if (l == r) {
		t[k].x = must100pts(l, l);
		return;
	}
	int mid = (l + r) / 2;
	build(k + k, l, mid);
	build(k + k + 1, mid + 1, r);
	pushup(k);
}

void modify(int k, int l, int r, int x, int y, int z) {
	if (l == x && r == y) {
		maketag(k, z);
		return;
	}
	pushdown(k);
	int mid = (l + r) / 2;
	if (y <= mid) modify(k + k, l, mid, x, y, z);
	else if (x > mid) modify(k + k + 1, mid + 1, r, x, y, z);
	else modify(k + k, l, mid, x, mid, z), modify(k + k + 1, mid + 1, r, mid + 1, y, z);
	pushup(k);
}

int find(int k, int l, int r, int x) {
	if (l == r) return l;
	pushdown(k);
	int mid = (l + r) / 2, ans;
	if (x <= t[k + k].x.mx) ans = find(k + k, l, mid, x);
	else ans = find(k + k + 1, mid + 1, r, x);
	pushup(k);
	return ans;
}

int query(int k, int l, int r, int x) {
	if (l == r) return t[k].x.mn;
	pushdown(k);
	int mid = (l + r) / 2, ans;
	if (x <= mid) ans = query(k + k, l, mid, x);
	else ans = query(k + k + 1, mid + 1, r, x);
	pushup(k);
	return ans;
}

int main() {
	scanf("%d", &n);
	build(1, 1, m);
	for (int i = 1; i <= n; i++) {
		int l, r;
		scanf("%d%d", &l, &r);
		if (l > r) cout << "sb" << endl;
		if (t[1].x.mn > r || t[1].x.mx < l) continue;
		++r;
		int x, y;
		if (t[1].x.mn > l) x = 1;
		else x = find(1, 1, m, l);
		if (t[1].x.mx < r) y = m;
		else y = find(1, 1, m, r) - 1;
		if (x > y) cout << "sb" << endl;
		modify(1, 1, m, x, y, 1);
	}
	scanf("%d", &q);
	while (q--) {
		int x;
		scanf("%d", &x);
		printf("%d\n", query(1, 1, m, x));
	}
	return 0;
}

调过者给关注喵!!

2025/7/19 13:52
加载中...