为啥权值线段树内存要开到1e6
查看原帖
为啥权值线段树内存要开到1e6
1219010
shadow_leader楼主2025/1/29 21:44
#include<iostream>

using namespace std;

const int N = 1e6 + 10;
const long long int Max_val = 1e10 + 10;

int tr[4 * N];
int ls[4 * N], rs[4 * N];
int cnt = 0;

int n,x,root;
void push_up(int p)
{
	tr[p] = tr[ls[p]] + tr[rs[p]];
}
void insert(int &p,long long  int l,long long  int r,long long int k,long long int val)
{
	if (!p)p = ++cnt;

	if (l == r)
	{
		tr[p] += val;
		return;
	}
	long long int mid = (l + r) >> 1;
	if (k <= mid)insert(ls[p], l, mid, k, val);
	else insert(rs[p], mid + 1, r, k, val);
	push_up(p);
}

long long int kth(int p,long long  int l, long long int r,long long  int k)
{
	if (l == r)return l;
	long long int mid = (l + r) >> 1;
	if (k <= tr[ls[p]])return kth(ls[p], l, mid, k);
	return kth(rs[p], mid + 1, r, k-tr[ls[p]]);
}

int main()
{
	cin >> n;
	long long int step = 1;
	for (int i = 1; i <= n;i++)
	{
		cin >> x;
		insert(root, 0, Max_val,x,1);
		if (i % 2 != 0)
		{
			cout << kth(root, 0, Max_val,step)<<endl;
			step++;
		}
	}
}
2025/1/29 21:44
加载中...