#6超时,萌新不会优化,求助
查看原帖
#6超时,萌新不会优化,求助
150611
mrozhx楼主2021/2/16 18:44

自己对拍答案是对的,纯超时问题

#include<bits/stdc++.h>
using namespace std;
int n,minn,rot=0,tot=0,sum=0;
struct node{
	int val,siz,tag,l,r;
}a[100100];
int newnode(int x){tot++;a[tot].val=x,a[tot].siz=1,a[tot].l=a[tot].r=a[tot].tag=0;return tot;}
void pushup(int x){a[x].siz=a[a[x].l].siz+a[a[x].r].siz+1;}
void pushdown(int x){a[x].val+=a[x].tag;a[a[x].l].tag+=a[x].tag;a[a[x].r].tag+=a[x].tag;a[x].tag=0;}
int merge(int x,int y){
	if(!x||!y) return x+y;
	if(rand()%(a[x].siz+a[y].siz)<=a[x].siz){
		pushdown(x);
		a[x].r=merge(a[x].r,y);
		pushup(x);
		return x;
	}
	else{
		pushdown(y);
		a[y].l=merge(x,a[y].l);
		pushup(y);
		return y;
	}
}
void split(int now,int k,int &atl,int &atr){
	if(!now){
		atl=atr=0;
		return;
	}
	pushdown(now);
	if(a[now].val<=k) split(a[now].r,k,a[atl=now].r,atr);
	else split(a[now].l,k,atl,a[atr=now].l);
	pushup(now);
}
int kth(int k){
	int now=rot;
	pushdown(now);
	while(a[a[now].l].siz+1!=k){
		if(a[a[now].l].siz<k) k-=(a[a[now].l].siz+1),now=a[now].r;
		else now=a[now].l;
		pushdown(now);
	}
	return a[now].val;
}
void print(int now){
	if(!now) return;
	print(a[now].l);
	printf("%d %d",a[now].val,a[now].tag);puts("");
	print(a[now].r);
}
int main(){
	int x,y,z;
	char kind;int k;
	scanf("%d%d",&n,&minn);
	for(int i=1;i<=n;i++){
		scanf("%s%d",&kind,&k);
		if(kind=='I'){
			if(k<minn) continue;
			split(rot,k,x,y);
			rot=merge(merge(x,newnode(k)),y);
		}
		else if(kind=='A'){
//			split(rot,minn-k-1,x,rot);
//			sum+=a[x].siz;
			a[rot].tag+=k;
		}
		else if(kind=='S'){
			split(rot,minn+k-1,x,rot);
			sum+=a[x].siz;
			a[rot].tag-=k;
		}
		else{
			k=a[rot].siz-k+1;
//			cout<<a[rot].siz<<" "<<k;
			if(k<1||a[rot].siz<k) puts("-1");
			else printf("%d",kth(k)),puts("");
		}
//		print(rot);puts("");
	}
	printf("%d",sum);
}
2021/2/16 18:44
加载中...