码迷,mamicode.com
首页 > 其他好文 > 详细

treap

时间:2016-07-04 13:45:03      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

bzoj3224:普通平衡树,照着模板打$_$。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
	int x=0;char c=getchar();bool f=true;
	while(!isdigit(c)){	if(c==‘-‘) f=false;c=getchar();	}
	while(isdigit(c)) x=x*10+c-‘0‘,c=getchar();
	return f?x:-x;
}
struct data{
	int l,r,v,size,rnd,w;
}t[100005];
int size,root,ans,n;
void update(int x){
	t[x].size=t[t[x].l].size+t[t[x].r].size+t[x].w;
}
void lturn(int &x){
	int tmp=t[x].r;t[x].r=t[tmp].l;t[tmp].l=x;
	t[tmp].size=t[x].size;update(x);x=tmp;
}
void rturn(int &x){
	int tmp=t[x].l;t[x].l=t[tmp].r;t[tmp].r=x;
	t[tmp].size=t[x].size;update(x);x=tmp;
}
void insert(int &k,int x){
	if(k==0){
		size++;k=size;
		t[k].size=t[k].w=1;t[k].v=x;t[k].rnd=rand();return ;
	}
	t[k].size++;
	if(t[k].v==x) t[k].w++;
	else if(t[k].v<x){
		insert(t[k].r,x);if(t[t[k].r].rnd<t[k].rnd) lturn(k);
	}else{
		insert(t[k].l,x);if(t[t[k].l].rnd<t[k].rnd) rturn(k);
	}
}
void del(int &k,int x){
	if(k==0) return ;
	if(t[k].v==x){
		if(t[k].w>1) {
			t[k].w--;t[k].size--;return ;
		}
		if(t[k].l*t[k].r==0) k=t[k].l+t[k].r;
		else if(t[t[k].l].rnd<t[t[k].r].rnd) rturn(k),del(k,x);
		else lturn(k),del(k,x);
	}else if(x>t[k].v) t[k].size--,del(t[k].r,x);
	else t[k].size--,del(t[k].l,x);
}
int queryrank(int k,int x){
	if(k==0) return 0;
	if(t[k].v==x) return t[t[k].l].size+1;
	else if(t[k].v>x) return queryrank(t[k].l,x);
	else return t[t[k].l].size+t[k].w+queryrank(t[k].r,x);
}
int querynum(int k,int x){
	if(k==0) return 0;
	if(x<=t[t[k].l].size) return querynum(t[k].l,x);
	else if(x>t[t[k].l].size+t[k].w) return querynum(t[k].r,x-t[t[k].l].size-t[k].w);
	else return t[k].v;
}
void querypro(int k,int x){
	if(k==0) return ;
	if(t[k].v<x) ans=k,querypro(t[k].r,x);
	else querypro(t[k].l,x);
}
void querysub(int k,int x){
	if(k==0) return ;
	if(t[k].v>x) ans=k,querysub(t[k].l,x);
	else querysub(t[k].r,x);
}
int main(){
	int n=read();
	rep(i,n){
		int p=read(),x=read();
		if(p==1) insert(root,x);
		else if(p==2) del(root,x);
		else if(p==3) printf("%d\n",queryrank(root,x));
		else if(p==4) printf("%d\n",querynum(root,x));
		else if(p==5) ans=0,querypro(root,x),printf("%d\n",t[ans].v);
		else ans=0,querysub(root,x),printf("%d\n",t[ans].v);
	}
	return 0;
}

  

treap

标签:

原文地址:http://www.cnblogs.com/fighting-to-the-end/p/5639987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!