30 分代码:
#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;
}
100 分代码:
#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