树状数组套平衡树 TLE,是常数问题吗
查看原帖
树状数组套平衡树 TLE,是常数问题吗
464004
ZepX_D楼主2024/5/14 10:26
#include <bits/stdc++.h>

using namespace std;

const int N = 1e6+5;
int n,m,rt[N],v[N<<5],ls[N<<5],rs[N<<5],siz[N<<5],a[N],cnt;

void pushup(int i)
{siz[i] = siz[ls[i]]+siz[rs[i]]+1;}

void split(int i,int k,int &x,int &y)
{
	if(!i) return (void)(x = y = 0);
	if(v[i] <= k) x = i,split(rs[i],k,rs[i],y),pushup(x);
	else y = i,split(ls[i],k,x,ls[i]),pushup(y);
}

mt19937 rnd(time(0));

int merge(int x,int y)
{
	if(!x || !y) return x|y;
	int rd = rnd()%(siz[x]+siz[y]);
	if(rd < siz[x]) {rs[x] = merge(rs[x],y);pushup(x);return x;}
	else {ls[y] = merge(x,ls[y]),pushup(y);return y;}
}

int New(int k)
{siz[++cnt] = 1;v[cnt] = k;return cnt;}

void ins(int i,int k)
{
	int x,y;split(rt[i],k,x,y);
	rt[i] = merge(merge(x,New(k)),y);
}

void add(int i,int a,int b)
{
	while(i <= n)
	{
		int x,y,z;split(rt[i],a,x,y);split(x,a-1,x,z);
		rt[i] = merge(merge(x,merge(ls[z],rs[z])),y);
		ins(i,b);
		i += i&-i;
	}
}

int rk(int i,int k)
{
	int x,y,ans;split(rt[i],k,x,y);
	ans = siz[x];rt[i] = merge(x,y);
	return ans;
}

int Q(int l,int r,int k)
{
	int sum = 0;
	while(r) sum += rk(r,k),r -= r&-r;
	while(l) sum -= rk(l,k),l -= l&-l;
	return sum;
}

int main()
{
	cin >> n >> m;
	for (int i = 1;i <= n;i++)
		cin >> a[i],add(i,0,a[i]);
	while(m--)
	{
		char ch;int l,r,k;cin >> ch >> l >> r;
		if(ch == 'Q')
		{
			cin >> k;
			int L = 0,R = 1e9;
			while(L < R)
			{
				int mid = (L+R)>>1;
				if(Q(l-1,r,mid) >= k) R = mid;
				else L = mid+1;
			}
			cout << L << '\n';
		}
		else add(l,a[l],r),a[l] = r;
	}
	return 0;
}
2024/5/14 10:26
加载中...