权值线段树MLE
  • 板块学术版
  • 楼主__frj
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/10/22 07:18
  • 上次更新2023/11/4 02:57:45
查看原帖
权值线段树MLE
89338
__frj楼主2021/10/22 07:18

普通平衡树模板那道题,我写了这个程序

然后它成功MLE on #12 了

求调QAQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define gc getchar
#define N 100007
using namespace std;

int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
int a[N],b[N],opt[N];
int ans[N*4];
int n;
void pushup(int p){
	ans[p]=ans[p*2+1]+ans[p*2];
}
void change(int p,int l,int r,int x,int dist){
	if(l==r){
		ans[p]+=dist;
		return;	
	} 
	int mid=(l+r)>>1;
	if(x<=mid) change(p*2,l,mid,x,dist); 
	else change(p*2+1,mid+1,r,x,dist);
	pushup(p);
	return; 
}
//L--l--mid---r---R
int query_id(int p,int l,int r,int L,int R){
	if(L<=l&&R>=r){
		return ans[p];
	}
	int mid=l+r>>1,sum=0;
	if(mid>=L) sum+=query_id(p*2,l,mid,L,R);
	if(mid<R) sum+=query_id(p*2+1,mid+1,r,L,R);
	return sum;
}
int query_num(int p,int l,int r,int x){
	if(l==r) return l;
	int mid=(l+r)/2;
	if(x<=ans[p*2]) return query_num(p*2,l,mid,x);
	else return query_num(p*2+1,mid+1,r,x-ans[p*2]); 
}
int idx[N];
int main(){
	n=read();
	for(int i=1;i<=n;i++){
		opt[i]=read();int x=read();
		if(opt[i]!=4) a[i]=x;
		b[i]=x;
	}
	sort(a+1,a+n+1);
	unique(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		if(opt[i]!=4) b[i]=lower_bound(a+1,a+n+1,b[i])-a;  
	} 
	for(int i=1;i<=n;i++){
		int op=opt[i];
		if(op==1) change(1,1,n,b[i],1);
		if(op==2) change(1,1,n,b[i],-1);
		if(op==3) printf("%d\n",query_id(1,1,n,1,b[i]-1)+1);
		if(op==4) printf("%d\n",a[query_num(1,1,n,b[i])]);
		if(op==5){
			int id=query_id(1,1,n,1,b[i]-1);
			printf("%d\n",a[query_num(1,1,n,id)]);
		}
		if(op==6){
			int id=query_id(1,1,n,1,b[i]);
			printf("%d\n",a[query_num(1,1,n,id+1)]);
		} 
	}
	return 0;
}

2021/10/22 07:18
加载中...