splay时间复杂度错误求助
查看原帖
splay时间复杂度错误求助
748694
yinianxingkong楼主2023/12/28 13:27

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;
}
2023/12/28 13:27
加载中...