求助,为什么srand(1)会wa3个点,srand(2) A了
查看原帖
求助,为什么srand(1)会wa3个点,srand(2) A了
514700
MicroSun/fendou楼主2023/11/19 10:01

从平衡树模板copy来的,寻思也没问题啊

// Problem: P3369 【模板】普通平衡树
// LuoguUID: 514700 
// LuoguUserName: MicroSun
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
int read(){
	int a=1,x=0;char ch=getchar();
	while(!isdigit(ch)&&ch!='-') ch=getchar();
	if(ch=='-') a=-1,ch=getchar();
	while(isdigit(ch)) x=x*10+ch-48,ch=getchar();
	return a*x;
}
void write(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+48);
}
const int N=1e5+10;
struct node{int ls,rs,key,pri,size;}t[N];
int cnt;
void newn(int x){t[++cnt]={0,0,x,rand(),1};}
void upd(int u){t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;}
void zag(int &u){//left rotate
	int k=t[u].rs;
	t[u].rs=t[k].ls;t[k].ls=u;
	t[k].size=t[u].size;
	upd(u);
	u=k;
}
void zig(int &u){//right rotate
	int k=t[u].ls;
	t[u].ls=t[k].rs;t[k].rs=u;
	t[k].size=t[u].size;
	upd(u);
	u=k;
}
void insert(int &u,int x){
	if(u==0) {newn(x);u=cnt;return;}
	t[u].size++;
	if(x>=t[u].key) insert(t[u].rs,x);
	else insert(t[u].ls,x);
	if(t[u].ls!=0&&t[u].pri>t[t[u].ls].pri) zig(u);
	if(t[u].rs!=0&&t[u].pri>t[t[u].rs].pri) zag(u);
	upd(u);
}
int rank(int u,int x){
	if(u==0) return 0;
	if(x>t[u].key) return t[t[u].ls].size+1+rank(t[u].rs,x);
	return rank(t[u].ls,x);
}
int trank(int u,int k){
	if(k==t[t[u].ls].size+1) return t[u].key;
	if(k>t[t[u].ls].size+1) return trank(t[u].rs,k-t[t[u].ls].size-1);
	return trank(t[u].ls,k);
}
int qq(int u,int x){// qq is qian_qv
	if(u==0) return 0;
	if(t[u].key>=x) return qq(t[u].ls,x);
	int tmp=qq(t[u].rs,x);
	if(tmp==0) return t[u].key;
	return tmp;
}
int hq(int u,int x){// hq is hou_qv
	if(u==0) return 0;
	if(t[u].key<=x) return hq(t[u].rs,x);
	int tmp=hq(t[u].ls,x);
	if(tmp==0) return t[u].key;
	return tmp;
}
int main(){
	srand(1);
	int s=0,n=read();
	insert(s,2147483647);
	insert(s,-2147483647);
	while(n--){
		int opt=read(),x=read();
		switch(opt){
			case 5: insert(s,x);break;
			case 1: write(rank(s,x));putchar('\n');break;
			case 2: write(trank(s,x+1));putchar('\n');break;
			case 3: write(qq(s,x));putchar('\n');break;
			case 4: write(hq(s,x));putchar('\n');break;
		}
	}
    return 0;
}
2023/11/19 10:01
加载中...