treap20分求助
  • 板块P1801 黑匣子
  • 楼主woooooook
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/8/25 20:49
  • 上次更新2023/11/4 09:01:41
查看原帖
treap20分求助
353396
woooooook楼主2021/8/25 20:49

照着书上抄的,为什么20分啊QAQ

#include<bits/stdc++.h>
using namespace std;
const int N=200001;
struct node{
	int lc,rc,key,pri,cnt,siz;
	#define lc(x) t[x].lc
	#define rc(x) t[x].rc
	#define v(x) t[x].key
	#define p(x) t[x].pri
	#define c(x) t[x].cnt
	#define s(x) t[x].siz
}t[N];
int n,m,a[N],u,tmp,num,T,rt;
inline int read(){
	int f=1,x=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	return x*f;
}
inline void print(int x){
	if(x<0){putchar('-');print(-x);}
	else if(x>9){print(x/10);putchar(x%10+'0');}
	else putchar(x+'0');
}
inline void upd(const int &k){s(k)=s(lc(k))+s(rc(k))+c(k);}
inline void zig(int &k){
	int y=lc(k);
	lc(k)=rc(y);rc(y)=k;
	s(y)=s(k);upd(k);k=y;
}
inline void zag(int &k){
	int y=rc(k);
	rc(k)=lc(y);lc(y)=k;
	s(y)=s(k);upd(k);k=y;
}
inline void insert(int &k,const int &key){
	if(!k){
		k=++T;v(k)=key;p(k)=rand();
		c(k)=s(k)=1;lc(k)=rc(k)=0;
		return ;
	}
	else s(k)++;
	if(v(k)==key)c(k)++;
	else if(key<v(k)){
		insert(lc(k),key);
		if(p(lc(k))<p(k))zig(k);
	}
	else{
		insert(rc(k),key);
		if(p(rc(k))<p(k))zag(k);
	}
	return ;
}
inline int kth(int k){
	int x=rt;
	while(x){
		if(s(lc(x))<k&&s(lc(x))+c(x)>=k)return v(x);
		if(s(lc(x))>=k)x=lc(x);
		else k-=s(lc(x))+c(x),x=rc(x);
	}
	return 0;
}
int main(){
	//freopen("blackbox.in","r",stdin);
	//freopen("blackbox.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=m;i++){
		u=read();
		while(tmp<=u)insert(rt,a[++tmp]);
		print(v(kth(i))),putchar('\n');
	}
	return 0;
}
2021/8/25 20:49
加载中...