蒟蒻求助!AC代码开了O2直接变36分?!
查看原帖
蒟蒻求助!AC代码开了O2直接变36分?!
350314
wannacry_楼主2023/3/18 16:15

如题,代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int cnt=0;
struct node{
	int l,r,key,pri,size;
}t[N];
void pushup(int p){
	t[p].size=t[t[p].l].size+t[t[p].r].size+1;
}
void newnode(int d){
	cnt++;
	t[cnt].size=1;
	t[cnt].l=t[cnt].r=0;
	t[cnt].key=d;
	t[cnt].pri=rand();
}
void xuan(int &p,int d){
	int k;
	if(d==1){
		k=t[p].r;
		t[p].r=t[k].l;
		t[k].l=p;
	}
	else{
		k=t[p].l;
		t[p].l=t[k].r;
		t[k].r=p;
	}
	t[k].size=t[p].size;
	pushup(p);
	p=k;
}
void add(int &p,int d){
	if(p==0){
		newnode(d);
		p=cnt;
		return;
	}
	t[p].size++;
	if(d>=t[p].key) add(t[p].r,d);
	else add(t[p].l,d);
	if(t[p].l!=0&&t[p].pri>t[t[p].l].pri) xuan(p,0);
	if(t[p].r!=0&&t[p].pri>t[t[p].r].pri) xuan(p,1);
	pushup(p);
}
void del(int &p,int d){
	t[p].size--;
	if(t[p].key==d){
		if(t[p].l==0&&t[p].r==0){
			p=0;
			return;
		}
		if(t[p].l==0||t[p].r==0){
			p=t[p].l+t[p].r;
			return;
		}
		if(t[t[p].l].pri<t[t[p].r].pri){
			xuan(p,0);
			del(t[p].r,d);
			return;
		}
		else{
			xuan(p,1);
			del(t[p].l,d);
			return;
		}
	}
	if(t[p].key>=d) del(t[p].l,d);
	else del(t[p].r,d);
	pushup(p);
}
int Rank(int p,int d){
	if(p==0) return 0;
	if(d>t[p].key) return t[t[p].l].size+Rank(t[p].r,d)+1;
	return Rank(t[p].l,d);
}
int kth(int p,int d){
	if(d==t[t[p].l].size+1) return t[p].key;
	if(d>t[t[p].l].size+1) return kth(t[p].r,d-t[t[p].l].size-1);
	if(d<=t[t[p].l].size) kth(t[p].l,d);
}
int getqian(int p,int d){
	if(p==0) return 0;
	if(t[p].key>=d) return getqian(t[p].l,d);
	int tmp=getqian(t[p].r,d);
	if(tmp==0) return t[p].key;
	return tmp;
}
int gethou(int p,int d){
	if(p==0) return 0;
	if(t[p].key<=d) return gethou(t[p].r,d);
	int tmp=gethou(t[p].l,d);
	if(tmp==0) return t[p].key;
	return tmp;
}
int main(){
	//freopen("P3369_3.in","r",stdin);
	//freopen("111.out","w",stdout);
	//srand(time(NULL));
	int num=0,n;
	scanf("%d",&n);
	while(n--){
		int flag,d;
		scanf("%d%d",&flag,&d);
		if(flag==1) add(num,d);
		if(flag==2) del(num,d);
		if(flag==3) printf("%d\n",Rank(num,d)+1);
		if(flag==4) printf("%d\n",kth(num,d));
		if(flag==5) printf("%d\n",getqian(num,d));
		if(flag==6) printf("%d\n",gethou(num,d));
	}
	return 0;
}

交了十几次一会儿错一会儿对,才发现每次AC的时候没开O2

这氧是不是有毒啊

想知道原因

2023/3/18 16:15
加载中...