输出出问题了,玄关
查看原帖
输出出问题了,玄关
544310
wuhupai楼主2023/12/6 19:46

因该很好调

#include <bits/stdc++.h>
using namespace std;
struct node{
	long long val,rd;
}p[200005];
long long T,x,y,rx,ry,rz,root,cnt=0;
long long son[200005][2],size[200005],siz[200005];
void push_up(long long p){
	size[p]=size[son[p][0]]+size[son[p][1]]+1;
}
long long add(long long x,long long y){
	cnt++;
	size[cnt]=siz[cnt]=y;
	p[cnt].val=x;
	p[cnt].rd=rand();
	return cnt;
}
void split(long long rt,long long key,long long &x,long long &y){
	if(!rt){
		x=y=0;
		return;
	}
	if(p[rt].val<=key){
		x=rt;
		split(son[rt][1],key,son[rt][1],y);
	}else{
		y=rt;
		split(son[rt][0],key,x,son[rt][0]);
	}
	push_up(rt);
}
long long merge(long long l,long long r){
	if(l==0||r==0) return l+r;
	if(p[l].rd<=p[r].rd){
		son[l][1]=merge(son[l][1],r);
		push_up(l);
		return l;
	}else{
		son[r][0]=merge(l,son[r][0]);
		push_up(r);
		return r;
	}
}
long long getrnk(long long x,long long k){
	while(true){
		//cout<<x<<" "<<k<<endl;
		long long l=size[son[x][0]]+1,r=size[son[x][0]]+siz[x];
		if(l<=k&&k<=r){
			return x;
		}else if(k>r){
			x=son[x][1];
			k-=r;
		}else x=son[x][0];
	}
}
void print(){
	cout<<"_______________________"<<endl;
	cout<<root<<endl;
	for(long long i=1;i<=cnt;i++){
		cout<<size[i]<<" ";
	}cout<<endl;
	for(long long i=1;i<=cnt;i++){
		cout<<son[i][0]<<" "<<son[i][1]<<endl;
	}
	cout<<"_______________________"<<endl;
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>T;
	while(T--){
		cin>>x>>y;
		split(root,x,rx,ry);
		root=merge(merge(rx,add(x,y)),ry);
		//print();
		cout<<p[getrnk(root,(size[root]+1)/2)].val<<"\n";
	}

	return 0;
}

2023/12/6 19:46
加载中...