30->100 灵异 FHQ 求助
查看原帖
30->100 灵异 FHQ 求助
793625
Pink_Cut_Tree楼主2024/3/16 21:02

3030 分代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
#define ls(x) lson[x]
#define rs(x) rson[x]
int n;
int rt,tot,tmp,m;
string s;
int lson[N],rson[N],pri[N],num[N],siz[N];
void pushup(int u){
	siz[u]=siz[ls(u)]+siz[rs(u)]+1;
}
void split(int u,int &x,int &y,int val){
	if(!u){
		x=y=0; return;
	}
	if(num[u]<=val){
		x=u,split(rs(u),rs(x),y,val);
	}
	else{
		y=u,split(ls(u),x,ls(y),val);
	}
	pushup(u);
}
int merge(int x,int y){
	if(!x||!y){
		return x+y;
	}
	if(pri[x]>pri[y]){
		rs(x)=merge(rs(x),y);
		pushup(x);
		return x;
	}
	ls(y)=merge(x,ls(y));
	pushup(y);
	return y;
}
int make_new(int x){
	tot++;
	ls(tot)=rs(tot)=0;
	pri[tot]=rand();
	num[tot]=x;
	siz[tot]=1;
	return tot;
}
void ins(int x){
	int l,r;
	split(rt,l,r,x);
	l=merge(l,make_new(x));
	rt=merge(l,r);
}
int kth(int u,int k){
	int Siz=siz[ls(u)]+1;
	if(Siz==k){
		return num[u];
	}
	if(Siz<k){
		return kth(rs(u),k-Siz);
	}
return kth(ls(u),k);
}
int main(){
	cin.tie(0)->sync_with_stdio(0);
	srand(time(0));
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>tmp;
		ins(tmp);
	} 
	cin>>m;
	while(m--){
		cin>>s;
		if(s=="add"){
			n++;
			cin>>tmp;
			ins(tmp);
		}
		else{
			if(n&1){
				cout<<kth(rt,n/2+1)<<"\n";
			}
			else{
				cout<<min(kth(rt,n/2),kth(rt,n/2+1))<<"\n";
			}
		}
	}
return 0;
}

100100 分代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
#define ls(x) lson[x]
#define rs(x) rson[x]
int n;
int rt,tot,tmp,m;
string s;
int lson[N],rson[N],pri[N],num[N],siz[N];
void pushup(int u){
	siz[u]=siz[ls(u)]+siz[rs(u)]+1;
}
void split(int u,int &x,int &y,int val){
	if(!u){
		x=y=0; return;
	}
	if(num[u]<=val){
		x=u,split(rs(u),rs(x),y,val);
	}
	else{
		y=u,split(ls(u),x,ls(y),val);
	}
	pushup(u);
}
int merge(int x,int y){
	if(!x||!y){
		return x+y;
	}
	if(pri[x]>pri[y]){
		rs(x)=merge(rs(x),y);
		pushup(x);
		return x;
	}
	ls(y)=merge(x,ls(y));
	pushup(y);
	return y;
}
int make_new(int x){
	tot++;
	ls(tot)=rs(tot)=0;
	pri[tot]=rand();
	num[tot]=x;
	siz[tot]=1;
	return tot;
}
void ins(int x){
	int l,r;
	split(rt,l,r,x);
	l=merge(l,make_new(x));
	rt=merge(l,r);
}
int kth(int u,int k){
	int Siz=siz[ls(u)]+1;
	if(Siz==k){
		return num[u];
	}
	if(Siz<k){
		return kth(rs(u),k-Siz);
	}
return kth(ls(u),k);
}
int main(){
	cin.tie(0)->sync_with_stdio(0);
	srand(time(0));
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>tmp;
		ins(tmp);
	} 
	cin>>m;
	while(m--){
		cin>>s;
		if(s=="add"){
			n++;
			cin>>tmp;
			ins(tmp);
		}
		else{
			if(n&1){
				cout<<kth(rt,n/2+1)<<"\n";
			}
			else{
				cout<<min(kth(rt,n/2),kth(rt,n/2+1))<<"\n";
			}
		}
	}
return 0;
}

这之间的差别仅存在于

const int N=1e5+5;
//or
const int N=1e6+5;

请问是为什么?

语言:C++20 -O2

2024/3/16 21:02
加载中...