平衡树28分求调,插入函数老是re,悬赏关注1
  • 板块P1801 黑匣子
  • 楼主deepdark
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/9/15 23:21
  • 上次更新2023/10/27 11:29:13
查看原帖
平衡树28分求调,插入函数老是re,悬赏关注1
105082
deepdark楼主2022/9/15 23:21
#include<iostream>
#include<cstdlib>
#include <algorithm>
using namespace std;
const int maxn=2500000;
int son[maxn][2],cnt[maxn],siz[maxn],ord[maxn];
int val[maxn];
int rt=0,sz=0;

void pu(int x){
	siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];
}


void rot(int &r,int f){//f=0 左旋 ,=1右旋
	int ii=son[r][!f];
	son[r][!f]=son[ii][f];
	son[ii][f]=r;
	r=ii;
	pu(r);
	pu(ii);
}



void ins(int &r,int x){
	if(!r){
		r=++sz;
		siz[r]=cnt[r]=1;
		ord[r]=rand();
		val[r]=x;
		return;
	}
	
	if(x==val[r]){
		cnt[x]++;
		siz[r]++;
		return;
	}else{
		if(x>val[r]){
			ins(son[r][1],x);
		    if(ord[son[r][1]]>ord[r]){
		    	rot(r,0);
			}
		
		}
		if(x<val[r]){
			ins(son[r][0],x);
			if(ord[son[r][0]]>ord[r]){
				rot(r,1);
			}
		}
		
		
	}
	
	pu(r);
	return;
}


int findnum( int rt,int x){//查询给定排名的元素
	if(!rt){
		return 0;
	}
	if(x>siz[son[rt][0]]+cnt[rt]){
	  return	findnum(son[rt][1],x-siz[son[rt][0]]-cnt[rt]);
	}
		
	if(x<=siz[son[rt][0]]){
			return findnum(son[rt][0],x);
		}
	
	return val[rt];	
		
		
	
	
	
}

int main(){

	
	int n,m;
	int n1[200005];
	int m1[200005];
	int ii=0,root=0,t=1;
	cin>>m>>n;
	
	for(int i=1;i<=m;i++){
		cin>>m1[i];
	}
	for(int i=1;i<=n;i++){
		cin>>n1[i];
	}
	
	for(int i=1;i<=m;i++){
		ins(root,m1[i]);
		while(n1[t]==i){
			ii++;
			cout<<findnum(root,ii)<<endl;
			
			t++;
		}
	}
	
	
	
	
	
	
	
	
	
	
	return 0;
}
2022/9/15 23:21
加载中...