萌新fhq-treap TLE62pts求调
查看原帖
萌新fhq-treap TLE62pts求调
544310
wuhupai楼主2023/12/23 11:25

rt,不知道是代码的问题还是常数的问题

#include<bits/stdc++.h>
using namespace std;
struct node{
	int val,rd;
}p[100005];
int n,m,x,y,cnt=0,rx,ry,rz,ra,rb,root,gg;
int size[100005],son[100005][2],la[100005];
char op;
inline int read(){
    int X=0; bool flag=1; char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
    while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
    if(flag) return X;
    return ~(X-1);
}inline void write(int X){
    if(X<0) {X=~(X-1); putchar('-');}
    if(X>9) write(X/10);
    putchar(X%10+'0');
}
void push_up(int x){
	size[x]=size[son[x][0]]+size[son[x][1]]+1;
}
void push_down(int x){
	if(la[x]!=0){
		p[son[x][0]].val+=la[x];
		p[son[x][1]].val+=la[x];
		la[son[x][0]]+=la[x];
		la[son[x][1]]+=la[x];
		la[x]=0;
	}
}
int add(int x){
	cnt++;
	p[cnt].rd=rand();
	p[cnt].val=x;
	size[cnt]=1;
	return cnt;
}
void split(int rt,int key,int &x,int &y){
	if(!rt){
		x=y=0;
		return;
	}
	push_down(rt);
	if(p[rt].val<=key){
		x=rt;
		split(son[rt][1],key,son[rt][1],y);
	}else{
		y=rt;
		split(son[rt][0],key,x,son[rt][0]);
	}
	push_up(rt);
}
void split1(int rt,int siz,int &x,int &y){
	if(!rt){
		x=y=0;
		return;
	}
	push_down(rt);
	if(size[son[rt][0]]+1<=siz){
		x=rt;
		split1(son[rt][1],siz-(size[son[rt][0]]+1),son[rt][1],y);
	}else{
		y=rt;
		split1(son[rt][0],siz,x,son[rt][0]);
	}
	push_up(rt);
}
int merge(int l,int r){
	if(!l||!r){
		return l+r;
	}
	push_down(l),push_down(r);
	if(p[l].rd<p[r].rd){
		son[l][1]=merge(son[l][1],r);
		push_up(l);
		return l;
	}else{
		son[r][0]=merge(l,son[r][0]);
		push_up(r);
		return r;
	}
}
int getrnk(int x,int k){
	while(true){
		push_down(x);
		if((size[son[x][0]]+1)==k){
			return x;
		}else if((size[son[x][0]]+1)<k){
			k-=(size[son[x][0]]+1);
			x=son[x][1];
		}else x=son[x][0];
	}
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		x=read();
		split(root,x,rx,ry);
		root=merge(merge(rx,add(x)),ry);
	}
	while(m--){
		op=getchar();
		x=read(),y=read();
		if(op=='F'){
			split(root,y-1,rx,ry);
			split1(ry,min(x,size[ry]),ry,rz);
			la[ry]++;
			p[ry].val++;
			gg=p[getrnk(ry,size[ry])].val;
			split(ry,gg-1,ry,ra);
			split(rz,gg,rz,rb);
			root=merge(merge(merge(merge(rx,ry),rz),ra),rb);
		}else{
			split(root,x-1,rx,ry);
			split(ry,y,ry,rz);
			write(size[ry]);
			putchar('\n');
			root=merge(merge(rx,ry),rz);
		}
	}
	
	return 0;
}
2023/12/23 11:25
加载中...