求助RE,本地AC提交只有50pts,树状数组套主席树
查看原帖
求助RE,本地AC提交只有50pts,树状数组套主席树
206258
SDNetFriend楼主2021/7/31 08:21

空间开得也够,下载样例也能跑出来,但一交就RE,只有50pts

https://www.luogu.com.cn/record/54605084

交了一页了,救救孩子

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define rint register int
#define lint int
#define ldouble long double
using namespace std;
inline lint read(){
	char c;lint res=0,f=1;
	while(c=getchar(),!isdigit(c))if(c=='-')f*=-1;
	while(isdigit(c))res=res*10+c-'0',c=getchar();
	return f*res;
}
const lint N=1e5+10,A=1e9;
lint ls[N*400],rs[N*400],sum[N*400],cnt=0;
class wst{
	public:
		lint root;
		void upd(lint &u,lint l,lint r,lint num,lint v){
			if(l>num||r<num)return;
			if(!u)u=++cnt;
			if(l==r&&l==num){
				sum[u]+=v;
				return;
			}
			lint mid=l+r>>1;
			if(num<=mid)upd(ls[u],l,mid,num,v);
			else upd(rs[u],mid+1,r,num,v);
			sum[u]=sum[ls[u]]+sum[rs[u]];
		}
		inline void upd(lint num,lint v){upd(root,1,A,num,v);}
		lint query(lint u,lint l,lint r,lint lt,lint rt){
			if(!u||l>rt||r<lt)return 0;
			if(lt<=l&&r<=rt)return sum[u];
			lint mid=l+r>>1;
			return query(ls[u],l,mid,lt,rt)+query(rs[u],mid+1,r,lt,rt);
		}
		inline lint query(lint lt,lint rt){return query(root,1,A,lt,rt);}
};
lint n,m,a[N];
wst st[N*4];
void build(lint u,lint lt,lint rt){
	for(rint i=lt;i<=rt;++i)
		st[u].upd(a[i],1);
	if(lt!=rt){
		lint mid=lt+rt>>1;
		build(u<<1,lt,mid);
		build(u<<1|1,mid+1,rt);
	}
}
void update(lint u,lint l,lint r,lint x,lint num){
	if(l>x||r<x)return;
	st[u].upd(a[x],-1);
	st[u].upd(num,1);
	if(l!=r){
		lint mid=l+r>>1;
		update(u<<1,l,mid,x,num);
		update(u<<1|1,mid+1,r,x,num);
	}
}
lint qsum(lint u,lint l,lint r,lint lt,lint rt,lint num){
	if(l>rt||r<lt)return 0;
	if(lt<=l&&r<=rt){
		lint res=st[u].query(1,num-1);
		return res;
	}
	lint mid=l+r>>1;
	return qsum(u<<1,l,mid,lt,rt,num)+qsum(u<<1|1,mid+1,r,lt,rt,num);
}
lint solve(lint lt,lint rt,lint k){
	lint l=0,r=A+1,mid;
	while(l!=r){
		mid=l+r>>1;
		lint res=qsum(1,1,n,lt,rt,mid);
		if(res<k)
			l=mid+1;
		else r=mid;
	}
	return l-1;
}
int main(){
//	freopen("P2617_11.in","r",stdin);
	n=read();
	m=read();
	for(rint i=1;i<=n;++i)
		a[i]=read();
	build(1,1,n);
	while(m--){
		char opt;
		cin>>opt;
		if(opt=='Q'){
			lint l=read(),r=read(),k=read();
			printf("%d\n",solve(l,r,k));
		}else if(opt=='C'){
			lint x=read(),y=read();
			update(1,1,n,x,y);
			a[x]=y;
		}
	}
	return 0;
}
2021/7/31 08:21
加载中...