萌新刚学整体二分,求助 5pts 的辣鸡代码
查看原帖
萌新刚学整体二分,求助 5pts 的辣鸡代码
298549
SIXIANG32楼主2023/2/5 16:30

rt,真的不知道哪里错了啊 QAQ 感觉所有地方写的都很正常/kk

#include <iostream>
#include <cstring>
#define MAXN 200000 
using namespace std;
int tr[MAXN + 10], n, m, tot;
int lowbit(int x) {return (x & (-x));}
void add(int pos, int val) {
	for(; pos <= n; pos += lowbit(pos))
		tr[pos] += val;
}
int query(int pos) {
	int rest = 0;
	while(pos) {
		rest += tr[pos];
		pos -= lowbit(pos);
	}
	return rest;
} 

//type = 0 query
//type = 1 insert
//type = 2 delete 
struct node {
	int type, val, l, r, ind;
	//For type = 0
	//[l, r] val ind = i
	//For type = 1/2
	// l val ind = i
} Q[MAXN * 2 + 10], qa[MAXN * 2 + 10], qb[MAXN * 2 + 10];
int ans[MAXN + 10], a[MAXN + 10];

void twofen(int l, int r, int s, int t) {
	if(l > r) return ;
	if(s == t) {
		for(int p = l; p <= r; p++)
			if(!Q[p].type)
				ans[Q[p].ind] = s;
		return ;
	}
	int mid = (s + t) >> 1, ta = 0, tb = 0;
	for(int p = l; p <= r; p++) {
		if(Q[p].type == 0) {
			int qr = query(Q[p].r) - query(Q[p].l - 1);
			if(qr >= Q[p].val) qa[++ta] = Q[p];
			else Q[p].val -= qr, qb[++tb] = Q[p];
		}
		else if(Q[p].type == 1) {
			if(Q[p].val <= mid) add(Q[p].l, 1), qa[++ta] = Q[p];
			else qb[++tb] = Q[p];
		}
		else if(Q[p].type == 2) {
			if(Q[p].val <= mid) add(Q[p].l, -1), qa[++ta] = Q[p];
			else qb[++tb] = Q[p];
		}
	}
	
	for(int p = l; p <= r; p++)
		if(Q[p].val <= mid)
			if(Q[p].type == 1) add(Q[p].l, -1);
			else if(Q[p].type == 2) add(Q[p].l, 1); 
	
	for(int p = l, i = 1; i <= ta; p++, i++) Q[p] = qa[i];
	for(int p = l + ta, i = 1; i <= tb; p++, i++) Q[p] = qb[i];
	twofen(l, l + ta - 1, s, mid);
	twofen(l + ta, r, mid + 1, t);
}
int main() {
	freopen("read.txt", "r", stdin);
	freopen("write.txt", "w", stdout);
	cin >> n >> m;
	for(int p = 1; p <= n; p++) {
		tot++;
		cin >> a[p], Q[tot].val = a[p];
		Q[tot].type = 1, Q[tot].l = p;
	}
	char opt;
	int qt = 0;
	for(int p = 1; p <= m; p++) {
		cin >> opt;
		if(opt == 'Q') {
			tot++;
			cin >> Q[tot].l >> Q[tot].r >> Q[tot].val;
			Q[tot].ind = ++qt, Q[tot].type = 0;
		}
		else {
			int rest; tot++;
			cin >> Q[tot].l >> rest;
			Q[tot].val = a[p];
			Q[tot].type = 2;
			
			tot++;
			Q[tot].l = Q[tot - 1].l, Q[tot].val = rest;
			Q[tot].type = 1, a[p] = rest;
		}
	}
	twofen(1, tot, 0, 1e9);
	for(int p = 1; p <= qt; p++)
		cout << ans[p] << endl;
}
2023/2/5 16:30
加载中...