为什么我权值线段树前驱后继不判不存在也AC了?
查看原帖
为什么我权值线段树前驱后继不判不存在也AC了?
716260
SegmentTree_楼主2024/9/26 21:20
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls(u) (tr[u].ls)
#define rs(u) (tr[u].rs)
#define sum(u) (tr[u].sum)
const int N = 5e5+5;
struct node{
	int ls, rs;
	int sum;
}tr[50000005];
int cnt = 0, root[N];
void add(int &u, int pre, int l, int r, int pos, int k){
	if (!u) u = ++cnt;
	tr[u] = tr[pre];
	if (l == r){
		sum(u) += k;
		if (sum(u) < 0) sum(u) = 0;
		return;
	}
	int mid = (l + r) >> 1;
	if (pos <= mid) add(ls(u), ls(pre), l, mid, pos, k);
	else add(rs(u), rs(pre), mid + 1, r, pos, k);
	sum(u) = sum(ls(u)) + sum(rs(u));
}
int kth(int u, int l, int r, int k){
	if (l == r) return l;
	int x = sum(ls(u));
	int mid = (l + r) >> 1;
	if (x >= k) return kth(ls(u), l, mid, k);
	else return kth(rs(u), mid + 1, r, k - x);
}
int query(int u, int l, int r, int ql, int qr){
	if (!u) return 0;
	if (ql <= l && r <= qr) return sum(u);
	int mid = (l + r) >> 1;
	if (qr <= mid) return query(ls(u), l, mid, ql, qr);
	else if (ql > mid) return query(rs(u), mid + 1, r, ql, qr);
	else return query(ls(u), l, mid, ql, mid) + query(rs(u), mid + 1, r, mid + 1, qr);
}
int qrank(int t, int x){
	return query(root[t], -1e9, 1e9, -1e9, x - 1) + 1;
}
int pre(int t, int x){
	return kth(root[t], -1e9, 1e9, query(root[t], -1e9, 1e9, -1e9, x - 1));
}
int suc(int t, int x){
	return kth(root[t], -1e9, 1e9, query(root[t], -1e9, 1e9, -1e9, x) + 1);
}
int main(){
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	int q;
	cin >> q;
	for (int now = 1;now <= q;now++){
		int t, op, x;
		cin >> t >> op >> x;
		if (op == 1){
			add(root[now], root[t], -1e9, 1e9, x, 1);
		}
		else if (op == 2){
			add(root[now], root[t], -1e9, 1e9, x, -1);
		}
		else if (op == 3){
			cout << qrank(t, x) << '\n';
			root[now] = root[t];
		}
		else if (op == 4){
			cout << kth(root[t], -1e9, 1e9, x) << '\n';
			root[now] = root[t];
		}
		else if (op == 5){
			cout << pre(t, x) << '\n';
			root[now] = root[t];
		}
		else{
			cout << suc(t, x) << '\n';
			root[now] = root[t];
		}
	}
	return 0;
} 
2024/9/26 21:20
加载中...