整体二分求调,输出全是0?
查看原帖
整体二分求调,输出全是0?
1405718
JoyLosingK楼主2024/11/29 11:41
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N = 1e5 + 5;
struct Query {
	int x, y, k, op, id;
} q[N << 1], ql[N << 1], qr[N << 1];
struct node {
	int val, id;
} p[N << 1];
inline bool cmp(node a, node b) {
	return a.val < b.val;
}
int ans[N], n, m, a[N], v[N], t[N << 1];
char u[4];
inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
	for (; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);
	return x * f;
}
inline int lb(int x) {
	return x & (-x);
}
inline void add(int x, int y) {
	for (; x <= n; x += lb(x)) t[x] += y;
}
inline int sum(int x) {
	int res = 0;
	for (; x; x -= lb(x)) res += t[x];
	return res;
}
void slove(int l, int r, int L, int R) {
	if (l > r || L > R) return;
	int cl = 0, cr = 0, m = (l + r) >> 1;
	if (l == r) {
		for (int i = L; i <= R; i++)
			if (q[i].op == 1) ans[q[i].id] = v[l];
		return;
	}
	for (int i = L; i <= R; i++)
		if (q[i].op == 1) {
			int t = sum(q[i].y) - sum(q[i].x - 1);
			if (q[i].k <= t) ql[++cl] = q[i];
			else q[i].k -= t, qr[++cr] = q[i];
		} else {
			if (q[i].y <= m) add(q[i].x, q[i].k), ql[++cl] = q[i];
			else qr[++cr] = q[i];
		}
	for (int i = 1; i <= cl; i++) if (ql[i].op == 0) add(ql[i].x, -ql[i].k);
	for (int i = 1; i <= cl; i++) q[L + i - 1] = ql[i];
	for (int i = 1; i <= cr; i++) q[L + i + cl + -1] = qr[i];
	slove(l, m, L, L + cl - 1), slove(m + 1, r, L + cl, R);
}
int main() {
	ios::sync_with_stdio(0), cout.tie(0);
	n = read(), m = read();
	for (int i = 1; i <= n; i++) p[i] = (node) {
		read(), i
	};
	sort(p + 1, p + n + 1, cmp);
	for (int i = 1; i <= n; i++) a[p[i].id] = i, v[i] = p[i].val;
	for (int i = 1; i <= m; i++) {
		scanf("%s", u);
		if (u[0] == 'Q') q[i].x = read(), q[i].y = read(), q[i].k = read(),
			                     q[i].id = i, q[i].op = 1;
		else q[i].x = read(), q[i].y = read(), q[i].k = 0,
			         q[i].id = i, q[i].op = 0;
	}
	slove(1, N << 1, 1, m);
	for (int i = 1; i <= m; i++)
		if (q[i].op == 1) cout << ans[i] << endl;
	return 0;
}
2024/11/29 11:41
加载中...