• treap数组版


    然而就是将指针的地方换成int引用

    就是存个代码

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<ctime>
    using namespace std;
    struct node
    {
    	int val;
    	int yuk;
    	int siz;
    	int key;
    	int ch[2];
    };
    node t[501000];
    int tail;
    int cmp(int now,int val)
    {
    	if(t[now].val==val)	return -1;
    	return t[now].val > val ? 0 : 1 ;
    }
    void sum(int &now)
    {
    	t[now].siz=t[t[now].ch[0]].siz+t[t[now].ch[1]].siz+t[now].yuk;
    	return ;
    }
    void rotato(int &now,int base)
    {
    	int k=t[now].ch[base^1];
    	t[now].ch[base^1]=t[k].ch[base];
    	t[k].ch[base]=now;
    	sum(now);	sum(k);
    	now=k;
    }
    int New(int val)
    {
    	++tail;
    	t[tail].ch[0]=t[tail].ch[1]=0;
    	t[tail].siz=1;t[tail].yuk=1;
    	t[tail].val=val;
    	t[tail].key=rand();
    	return tail;
    }
    void init()
    {
    	t[0].val=0;t[0].yuk=0;
    	t[0].key=-1;
    	t[0].ch[0]=t[0].ch[1]=0;
    	srand(time(NULL));
    	return ;
    }
    void insert(int &now,int val)
    {
    	if(now==0){now=New(val);return ;}
    	int dir=cmp(now,val);
    	if(dir==-1){t[now].yuk+=1;t[now].siz+=1;return ;}
    	insert(t[now].ch[dir],val);
    	if(t[t[now].ch[dir]].key>t[now].key)	rotato(now,dir^1);
    	sum(now);
    }
    void del(int &now,int val)
    {
    	int dir=cmp(now,val);
    	if(dir==-1)
    		if(t[now].yuk>1){t[now].siz-=1,t[now].yuk-=1;return;}
    		else
    		{
    			if(t[now].ch[1]&&t[now].ch[0])
    			{
    				int nxt= t[t[now].ch[0]].key > t[t[now].ch[1]].key ? 0 : 1;
    				rotato(now,nxt^1);
    				del(t[now].ch[nxt^1],val);
    				sum(now);return ;
    			}
    			if(t[now].ch[1]){now=t[now].ch[1];sum(now);return ;}
    			else {now=t[now].ch[0];sum(now);return ;}
    		}
    	del(t[now].ch[dir],val);sum(now);
    	return;
    }
    int nxt(int now,int val)
    {
    	if(!now)	return 0x7fffffff;
    	if(t[now].val>val)
    		return min(t[now].val,nxt(t[now].ch[0],val));
    	else
    		return nxt(t[now].ch[1],val);
    }
    int pre(int now,int val)
    {
    	if(!now)	return -0x7fffffff;
    	if(t[now].val<val)
    		return max(t[now].val,pre(t[now].ch[1],val));
    	else	
    		return pre(t[now].ch[0],val);
    }
    int find(int &now,int val)
    {
    	int dir=cmp(now,val);
    	if(dir==-1)	return t[t[now].ch[0]].siz+1;
    	return find(t[now].ch[dir],val) + ( dir ? t[t[now].ch[0]].siz + t[now].yuk : 0);
    }
    int kth(int &now,int k)
    {
    	if(t[t[now].ch[0]].siz<k&&t[t[now].ch[0]].siz+t[now].yuk>=k)
    		return t[now].val;
    	if(k<=t[t[now].ch[0]].siz)
    		return kth(t[now].ch[0],k);
    	else
    		return kth(t[now].ch[1],k-t[t[now].ch[0]].siz-t[now].yuk);
    }
    int root;
    void visit(int now)
    {
    	if(!now)
    		return ;
    	visit(t[now].ch[0]);
    	printf("%d ",t[now].val);
    	visit(t[now].ch[1]);
    	return ;
    }
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	int a,b;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d%d",&a,&b);
    		switch(a)
    		{
    			case 1:insert(root,b);break;
    			case 2:del(root,b);break;
    			case 3:printf("%d
    ",find(root,b));break;
    			case 4:printf("%d
    ",kth(root,b));break;
    			case 5:insert(root,b);printf("%d
    ",pre(root,b));del(root,b);break;
    			case 6:insert(root,b);printf("%d
    ",nxt(root,b));del(root,b);break;
    		}
    		//visit(root);printf("
    ");
    	}
    }
    
  • 相关阅读:
    nginx+vue刷新404
    java-Object类的解析(持续更新)
    Python源码学习(六)-PyCodeObject初探
    经典算法之不定方程问题
    MySql中的视图的概念及应用
    数据结构之 折半插入排序
    mahout算法源码分析之Itembased Collaborative Filtering实战
    【Android】为Android虚拟机创建SDCard
    30个酷毙的交互式网站(HTML5+CSS3)
    项目总结——也谈svn版本库迁移
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/9164293.html
Copyright © 2020-2023  润新知