动态开点权值线段树无法通过样例
查看原帖
动态开点权值线段树无法通过样例
735387
songtj楼主2022/10/22 15:45
R.T.\Large{\mathcal{R.T.}}

本蒟蒻的代码如下:

#include <bits/stdc++.h>
#define putb putchar(' ')
#define putn putchar('\n')
using namespace std;

const int MAXN = 1e6 * 3 + 10;

int n, cnt = 1, root = 1;

struct Node
{
	int val;
	int ls, rs;
} tr[MAXN];

template <typename _Ip>
inline void read(_Ip &x)
{
    char ch = getchar(), sgn = 0; x = 0;
    while (ch ^ '-' && !isdigit(ch)) ch = getchar();
    if (ch == '-') ch = getchar(), sgn = 1;
    while (isdigit(ch)) x = (x<<3)+(x<<1) + (ch^48), ch = getchar();
    if (sgn) x = -x;
}

template <typename _Op>
inline void write(_Op x)
{
	if (x < 0) putchar('-'), x = -x;
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}

inline void push_up(int p)
{
	tr[p].val = tr[tr[p].ls].val + tr[tr[p].rs].val;
}

inline void change(int &rot, int l, int r, int p, int v)
{
	if (!rot) rot = ++cnt;
	if (l == r)
	{
		tr[p].val += v;
		return;
	}
	int mid = (l+r) >> 1;
	if (p <= mid) change(tr[p].ls, l, mid, p, v);
	else change(tr[p].rs, mid+1, r, p, v);
	push_up(p);
}

inline int query(int p, int l, int r, int pl, int pr)
{
	if (!p) return 0;
	if (pl <= l && r <= pr)
	{
		return tr[p].val;
	}
	int mid = (l+r) >> 1, ans = 0;
	if (pl <= mid) ans += query(tr[p].ls, l, mid, pl, pr);
	if (mid < pr) ans += query(tr[p].rs, mid+1, r, pl, pr);
	return ans;
}

inline int kth(int p, int l, int r, int v)
{
	if (!p) return -1;
	if (l == r)
	{
		return l;
	}
	int mid = (l+r) >> 1;
	if (v <= tr[tr[p].ls].val) return kth(tr[p].ls, l, mid, v);
	else return kth(tr[p].rs, mid+1, r, v);
}

inline int pre(int x)
{
	int temp = query(1, -1e7, 1e7, -1e7, x-1);
	return kth(1, -1e7, 1e7, temp); 
}

inline int next(int x)
{
	int temp = query(1, -1e7, 1e7, -1e7, x) + 1;
	return kth(1, -1e7, 1e7, temp);
}

int main()
{
	read(n);
	for (int i = 1, op, x; i <= n; ++i)
	{
		read(op);read(x);
		//write(op);putb;write(x);putn;
		if (op == 1) {change(root, -1e7, 1e7, x, 1);}
		else if (op == 2) {change(root, -1e7, 1e7, x, -1);}
		else if (op == 3) {write(query(1, -1e7, 1e7, -1e7, x-1)+1);putn;}
		else if (op == 4) {write(kth(1, -1e7, 1e7, x));putn;}
		else if (op == 5) {write(pre(x));putn;}
		else if (op == 6) {write(next(x));putn;}
	}
	return 0;
}

平衡树的模板题怎么能用平衡树做呢?

2022/10/22 15:45
加载中...