WHY?MLE on #1 #2
查看原帖
WHY?MLE on #1 #2
928342
26946z2111楼主2024/12/18 22:24
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int n,root,cnt;
struct node{
	int l,r,size,same,v,imp;
}t[100005];
inline void zig(int &id){
	int ls=t[id].l;
	t[id].l=t[ls].r;
	t[ls].r=id;
	t[ls].size=t[id].size;
	t[id].size=t[t[id].l].size+t[t[id].r].size+t[id].same;
	id=ls;
}
inline void zag(int &id){
	int rs=t[id].r;
	t[id].r=t[rs].l;
	t[rs].l=id;
	t[rs].size=t[id].size;
	t[id].size=t[t[id].l].size+t[t[id].r].size+t[id].same;
	id=rs;
}
inline void insert(int &id,int x){
	if(!id){
		cnt++;
		id=cnt;
		t[id].v=x;
		t[id].imp=rand();
		t[id].size=t[id].same=1;
		return ;
	}
	t[id].size++;
	if(x==t[id].v)t[id].same++;
	else if(x>t[id].v){
		insert(t[id].r,x);
		if(t[t[id].r].imp<t[id].imp)zag(id);
	}
	else {
		insert(t[id].l,x);
		if(t[t[id].l].imp<t[id].imp)zig(id);
	}
}
inline void del(int &id,int x){
	if(t[id].v==x){
		if(t[id].same>1)t[id].same--;
		else if(!t[id].l||!t[id].r)id=t[id].l+t[id].r;
		else if(t[t[id].l].imp<t[t[id].r].imp)zig(id),del(id,x);
		else zag(id),del(id,x);
		return ;
	}
	t[id].size--;
	if(x>t[id].v)del(t[id].r,x);
	else del(t[id].l,x);
}
inline int lvl(int &id,int x){
	if(x==t[id].v)return t[t[id].l].size+1;
	if(x>t[id].v)return t[t[id].l].size+lvl(t[id].r,x)+t[id].same;
	else return lvl(t[id].l,x);
}
inline int flvl(int &id,int x){
//	cout<<id<<" "<<t[id].v<<" "<<t[t[id].l].size<<" "<<t[id].same<<endl;
	if(t[t[id].l].size<x&&x<=t[t[id].l].size+t[id].same)return t[id].v;
	if(x>t[t[id].l].size)return flvl(t[id].r,x-t[t[id].l].size-t[id].same);
	return flvl(t[id].l,x);
}
inline int fpre(int x){
	int id=root,mx=-INF;
	while(id){
		if(x>t[id].v)mx=t[id].v,id=t[id].r;
		else id=t[id].l;
	}
	return mx;
}
inline int fkth(int x){
	int id=root,mn=INF;
	while(id){
		if(x<t[id].v)mn=t[id].v,id=t[id].l;
		else id=t[id].r;
	}
	return mn;
}
inline void qread(int &x){
    x=0;
    register int ch=getchar(),flag=0;
    while(ch<'0'||ch>'9'){
        if(ch=='-')flag=1;
        ch =getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=10*x+ch-48;
        ch=getchar();
    }
    if(flag)x=-x;
}
int main(){
	qread(n);
	for(int i=1;i<=n;i++){
		int c,x;
		qread(c);
		qread(x);
		if(c==1){
			insert(root,x);
		}
		else if(c==2){
			del(root,x);
		}
		else if(c==3){
			printf("%d\n",lvl(root,x));
		}
		else if(c==4){
			printf("%d\n",flvl(root,x));
		}
		else if(c==5){
			printf("%d\n",fpre(x)==-INF?0:fpre(x));
		}
		else{
			printf("%d\n",fkth(x)==INF?0:fkth(x));
		}
	}
	return 0;
}

救救孩子吧!

2024/12/18 22:24
加载中...