rt,以前写过权值splay,后来区间平衡树写多了忘了qwq。
然后想用类似区间平衡树的方式来写权值平衡树,结果TLE。
想问一下是我的写法有问题,还是这代码本身时间复杂度就不对。
感激不尽\kk
代码如下:
#include<bits/stdc++.h>
//#define int long long
using namespace std;
namespace fast_IO {
#define IOSIZE 100000
int precision=3,POW[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};char ibuf[IOSIZE],obuf[IOSIZE],*p1=ibuf,*p2=ibuf,*p3=obuf;
#ifdef ONLINE_JUDGE
#define getchar() ((p1==p2)and(p2=(p1=ibuf)+fread(ibuf,1,IOSIZE,stdin),p1==p2)?(EOF):(*p1++))
#define putchar(x) ((p3==obuf+IOSIZE)&&(fwrite(obuf,p3-obuf,1,stdout),p3=obuf),*p3++=x)
#define isdigit(ch) (ch>47&&ch<58)
#define isspace(ch) (ch<33)
#endif
template<typename T>inline T read(){T s=0;int w=1;char ch;while(ch=getchar(),!isdigit(ch)&&(ch!=EOF))if(ch==45)w=-1;if(ch==EOF)return 0;while(isdigit(ch))s=s*10+ch-48,ch=getchar();return s*w;}template<typename T>inline bool read(T&s){s=0;int w=1;char ch;while(ch=getchar(),!isdigit(ch)&&(ch!=EOF))if(ch==45)w=-1;if(ch==EOF)return 0;while(isdigit(ch))s=s*10+ch-48,ch=getchar();return s*=w,1;}inline bool read(char&s){while(s=getchar(),isspace(s));return 1;}inline bool read(char*s){char ch;while(ch=getchar(),isspace(ch));if(ch==EOF)return 0;while(!isspace(ch))*s++=ch,ch=getchar();*s='\000';return 1;}template<typename T>inline void print(T x){if(x<0)putchar(45),x=-x;if(x>9)print(x/10);putchar(x%10+48);}inline void print(char x){putchar(x);}inline void print(char*x){while(*x)putchar(*x++);}inline void print(const char*x){for(int i=0;x[i];i++)putchar(x[i]);}inline bool read(std::string&s){s="";char ch;while(ch=getchar(),isspace(ch));if(ch==EOF)return 0;while(!isspace(ch))s+=ch,ch=getchar();return 1;}inline void print(std::string x){for(int i=0,n=x.size();i<n;i++)putchar(x[i]);}inline bool read(bool&b){char ch;while(ch=getchar(),isspace(ch));b=ch^48;return 1;}inline void print(bool b){putchar(b+48);}inline bool read(double&x){int a=0,b=0;char ch=getchar();bool f=0;while(ch<48||ch>57){if(ch==45)f=1;ch=getchar();}while(47<ch&&ch<58){a=(a<<1)+(a<<3)+(ch^48);ch=getchar();}if(ch!=46){x=f?-a:a;return 1;}ch=getchar();while(47<ch&&ch<58){b=(b<<1)+(b<<3)+(ch^48),ch=getchar();}x=b;while(x>1)x/=10;x=f?-a-x:a+x;return 1;}inline void print(double x){if(x<0){putchar(45),x=-x;}x=round((long double)x*POW[precision])/POW[precision],print((long long)x),putchar(46),x-=(long long)(x);for(int i=1;i<=precision;i++)x*=10,putchar(x+48),x-=(int)x;}template<typename T,typename...T1>inline int read(T& a,T1&...other){return read(a)+read(other...);}template<typename T,typename...T1>inline void print(T a,T1...other){print(a),print(other...);}struct Fast_IO{~Fast_IO(){fwrite(obuf,p3-obuf,1,stdout);}}io;template<typename T>Fast_IO& operator>>(Fast_IO&io,T&b){return read(b),io;}template<typename T>Fast_IO& operator<<(Fast_IO&io,T b){return print(b),io;}
#define cout io
#define cin io
#define endl '\n'
}using namespace fast_IO;
namespace TYX_YNXK{
#define il inline
#define bl bool
#define ll long long
#define vd void
#define N 100005
#define INF 0x3f3f3f3f
int n,rt,tot;
struct node{
int fa,son[2],cnt,v,sz;
node(int a1=0,int a2=0,int a3=0,int a4=0,int a5=0,int a6=0){
fa=a1,son[0]=a2,son[1]=a3,cnt=a4,v=a5,sz=a6;
}
}t[N];
#define get(k) (k==t[t[k].fa].son[1])
il vd pushup(int k){
t[k].sz=t[t[k].son[0]].sz+t[k].cnt+t[t[k].son[1]].sz;
}
il vd pushdown(int k){
return;
}
il vd clear(int k){
t[k]=node();
}
il int neww(int v){
int k=++tot;
t[k].v=v;
t[k].cnt=t[k].sz=1;
return k;
}
il vd rotate(int k){
int f=t[k].fa,ff=t[f].fa,w=get(k);
t[f].son[w]=t[k].son[w^1];
if(t[k].son[w^1]) t[t[k].son[w^1]].fa=f;
t[k].son[w^1]=f;
t[f].fa=k,t[k].fa=ff;
if(ff) t[ff].son[f==t[ff].son[1]]=k;
pushup(f),pushup(k);
}
il vd splay(int k,int tp=0){
for(;t[k].fa!=tp;rotate(k)) if(t[t[k].fa].fa!=tp) rotate((get(t[k].fa)==get(k))?(t[k].fa):(k));
if(!tp) rt=k;
}
il int find_num(int v,int k=rt){
while(1){
pushdown(k);
if(v==t[k].v) return k;
if(v<t[k].v){
if(!t[k].son[0]) return k;
k=t[k].son[0];
}
else{
if(!t[k].son[1]) return k;
k=t[k].son[1];
}
}
}
il int find_rank(int v,int k=rt){
while(1){
pushdown(k);
if(v<=t[t[k].son[0]].sz) k=t[k].son[0];
else{
v-=t[t[k].son[0]].sz+1;
if(!v) return k;
k=t[k].son[1];
}
}
}
il int pre(int v,int k=rt){
int pos;
while(k){
if(v>t[k].v) pos=k,k=t[k].son[1];
else k=t[k].son[0];
}
return pos;
}
il int nxt(int v,int k=rt){
int pos;
while(k){
if(v<t[k].v) pos=k,k=t[k].son[0];
else k=t[k].son[1];
}
return pos;
}
int opt,x;
signed main(){
cin>>n;
t[rt=neww(-INF)].son[1]=neww(INF);
t[t[rt].son[1]].fa=rt;
pushup(rt);
while(n--){
cin>>opt>>x;
switch(opt){
case 1:{
int l=pre(x),r=nxt(x);
// cout<<t[l].v<<' '<<t[r].v<<'\n';
splay(l),splay(r,l);
if(t[r].son[0]){
t[t[r].son[0]].cnt++;
splay(t[r].son[0]);
}else{
t[r].son[0]=neww(x);
t[t[r].son[0]].fa=r;
splay(t[r].son[0]);
}
break;
}
case 2:{
int l=pre(x),r=nxt(x);
splay(l),splay(r,l);
if(t[t[r].son[0]].cnt>1){
t[t[r].son[0]].cnt--;
splay(t[r].son[0]);
}else{
t[r].son[0]=0;
}
break;
}
case 3:{
int k=pre(x);
splay(k);
cout<<t[k].sz-t[t[k].son[1]].sz<<'\n';
break;
}
case 4:{
int k=find_rank(x+1);
cout<<t[k].v<<'\n';
splay(k);
break;
}
case 5:{
int k=pre(x);
cout<<t[k].v<<'\n';
splay(k);
break;
}
case 6:{
int k=nxt(x);
cout<<t[k].v<<'\n';
splay(k);
break;
}
}
}
return 0;
}
}
signed main(){
TYX_YNXK::main();
return 0;
}