权值线段树,MLE最后一个点,求调
查看原帖
权值线段树,MLE最后一个点,求调
667180
Assassin_HG楼主2024/3/10 19:08
#include<bits/stdc++.h>
const int maxn = 1e5 + 5;
using namespace std;
int opt[maxn], a[maxn], b[maxn], n, m, sum[maxn << 2];
int ls(int rt) {
	return rt << 1;
}
int rs(int rt) {
	return rt << 1 | 1;
}
void modify(int rt, int l, int r, int x, int d) {
	if (l == r) {
		sum[rt] += d;
		return;
	}
	int mid = (l + r) >> 1;
	if (x <= mid) {
		modify(ls(rt), l, mid, x, d);
	} else {
		modify(rs(rt), mid + 1, r, x, d);
	}
	sum[rt] = sum[ls(rt)] + sum[rs(rt)];
}
int ask1(int rt, int l, int r, int L, int R) {
	if (L <= l && r <= R) {
		return sum[rt];
	}
	int mid = (l + r) >> 1;
	int res = 0;
	if (L <= mid) {
		res += ask1(ls(rt), l, mid, L, R);
	}
	if (R >= mid + 1) {
		res += ask1(rs(rt), mid + 1, r, L, R);
	}
	return res;
}
int ask2(int rt, int l, int r, int x) {
	if (l == r) {
		return l;
	}
	int mid = (l + r) >> 1;
	int limit = sum[ls(rt)];
	if (limit >= x) {
		return ask2(ls(rt), l, mid, x);
	} else {
		return ask2(rs(rt), mid + 1, r, x - limit);
	}
}
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%d%d", &opt[i], &a[i]);
		b[++m] = a[i];
	}
	sort(b + 1, b + 1 + m);
	m = unique(b + 1, b + 1 + m) - 1 - b;
	for (int i = 1; i <= n; ++i) {
		int x = a[i];
		if (opt[i] != 4) {
			x = lower_bound(b + 1, b + 1 + m, x) - b;
		}
		if (opt[i] == 1) {
			modify(1, 1, n, x, 1);
		} else if (opt[i] == 2) {
			modify(1, 1, n, x, -1);
		} else if (opt[i] == 3) {
			printf("%d\n", ask1(1, 1, n, 1, x - 1) + 1);
		} else if (opt[i] == 4) {
			printf("%d\n", b[ask2(1, 1, n, x)]);
		} else if (opt[i] == 5) {
			printf("%d\n", b[ask2(1, 1, n, ask1(1, 1, n, 1, x - 1))]);
		} else if (opt[i] == 6) {
			printf("%d\n", b[ask2(1, 1, n, ask1(1, 1, n, 1, x) + 1)]);
		}
	}
	return 0;
}
2024/3/10 19:08
加载中...