treap初步

  • 模板题

    bzoj3224普通平衡树

    功能齐全的模板题

 1 #include<bits/stdc++.h>
 2 #define maxn 100005
 3 struct node{
 4     int l,r,v,rnd,w,size;
 5 }tr[maxn];
 6 int root,size,ans;
 7 void update(int k){
 8     tr[k].size=tr[tr[k].l].size+tr[k].w+tr[tr[k].r].size;
 9 }
10 void lturn(int &k){
11     int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
12     tr[t].size=tr[k].size;update(k);k=t;
13 }
14 void rturn(int &k){
15     int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;
16     tr[t].size=tr[k].size;update(k);k=t;
17 }
18 void insert(int &k,int x){
19     if(!k){
20         k=++size;
21         tr[k].w=tr[k].size=1;tr[k].v=x;tr[k].rnd=rand();
22         return;
23     }
24     tr[k].size++;
25     if(x==tr[k].v)tr[k].w++;
26     else if(x>tr[k].v){
27         insert(tr[k].r,x);
28         if(tr[tr[k].r].rnd<tr[k].rnd)lturn(k);
29     }
30     else{
31         insert(tr[k].l,x);
32         if(tr[tr[k].l].rnd<tr[k].rnd)rturn(k);
33     }
34 }
35 void del(int &k,int x){
36     if(!k)return;
37     if(x==tr[k].v){
38         if(tr[k].w>1){
39             tr[k].w--;tr[k].size--;
40             return;
41         }
42         if(tr[k].l*tr[k].r==0)k=tr[k].l+tr[k].r;
43         else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd)
44             rturn(k),del(k,x);
45         else lturn(k),del(k,x);
46     }
47     else if(x>tr[k].v)tr[k].size--,del(tr[k].r,x);
48     else tr[k].size--,del(tr[k].l,x);
49 }
50 int query_rank(int k,int x){
51     if(!k)return 0;
52     if(x==tr[k].v)return tr[tr[k].l].size+1;
53     else if(x>tr[k].v)
54         return tr[tr[k].l].size+tr[k].w+query_rank(tr[k].r,x);
55     else return query_rank(tr[k].l,x);
56 }
57 int query_num(int k,int x){
58     if(!k)return 0;
59     if(x<=tr[tr[k].l].size)return query_num(tr[k].l,x);
60     else if(x>tr[tr[k].l].size+tr[k].w)return query_num(tr[k].r,x-tr[tr[k].l].size-tr[k].w);
61     else return tr[k].v;
62 }
63 void pro(int k,int x){
64     if(!k)return;
65     if(x>tr[k].v)ans=k,pro(tr[k].r,x);
66     else pro(tr[k].l,x);
67 }
68 void sub(int k,int x){
69     if(!k)return;
70     if(x<tr[k].v)ans=k,sub(tr[k].l,x);
71     else sub(tr[k].r,x);
72 }
73 int main(){
74     int n,opt,x;
75     scanf("%d",&n);
76     for(int i=1;i<=n;i++){
77         scanf("%d%d",&opt,&x);
78         if(opt==1)insert(root,x);
79         else if(opt==2)del(root,x);
80         else if(opt==3)printf("%d\n",query_rank(root,x));
81         else if(opt==4)printf("%d\n",query_num(root,x));
82         else if(opt==5){
83             pro(root,x);
84             printf("%d\n",tr[ans].v);
85         }
86         else{
87             sub(root,x);
88             printf("%d\n",tr[ans].v);
89         }
90     }
91     return 0;
92 }

    bzoj1588营业额统计

    找前驱和后继取较小值,然而数据有问题

 1
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 #define inf 0x3f3f3f3f
 5 #define maxn 1000005
 6 struct node{
 7     int l,r,v,rnd,w,size;
 8 }tr[maxn];
 9 int  yo,yoo,size,root;
10 void update(int k){
11     tr[k].size=tr[tr[k].l].size+tr[k].w+tr[tr[k].r].size;
12 }
13 void lturn(int &k){
14     int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
15     tr[t].size=tr[k].size;update(k);k=t;
16 }
17 void rturn(int &k){
18     int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;
19     tr[t].size=tr[k].size;update(k);k=t;
20 }
21 void insert(int &k,int x){
22     if(!k){
23         k=++size;
24         tr[k].w=tr[k].size=1;tr[k].v=x;tr[k].rnd=rand();
25         return;
26     }
27     tr[k].size++;
28     if(x==tr[k].v)tr[k].w++;
29     else if(x>tr[k].v){
30         insert(tr[k].r,x);
31         if(tr[tr[k].r].rnd<tr[k].rnd)lturn(k);
32     }
33     else{
34         insert(tr[k].l,x);
35         if(tr[tr[k].l].rnd<tr[k].rnd)rturn(k);
36     }
37 }
38 void pro(int k,int x){
39     if(!k)return;
40     if(x>=tr[k].v)yo=tr[k].v,pro(tr[k].r,x);
41     else pro(tr[k].l,x);
42 }
43 void sub(int k,int x){
44     if(!k)return;
45     if(x<=tr[k].v)yoo=tr[k].v,sub(tr[k].l,x);
46     else sub(tr[k].r,x);
47 }
48 int main(){
49     int n,ans,x;
50     scanf("%d%d",&n,&ans);
51     insert(root,ans);
52     if(ans<0)ans=-ans;
53     for(int i=2;i<=n;i++){
54         yo=-inf,yoo=inf;
55         //scanf("%d",&x);
56         if(scanf("%d",&x)==EOF)x=0;
57         pro(root,x);
58         sub(root,x);
59         ans+=min(x-yo,yoo-x);
60         insert(root,x);
61     }
62     printf("%d\n",ans);
63     return 0;
64 }

  • 坑B题&老爷题

    bzoj1503郁闷的出纳员

    本来想用treap瞎转删除区间,然而被老爷说乱搞,因为treap的旋转是用来维护堆性质的  

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 100005
 4 struct node{
 5     int l,r,v,rnd,w,size;
 6 }tr[maxn];
 7 int size,root;
 8 void update(int k){
 9     tr[k].size=tr[tr[k].l].size+tr[k].w+tr[tr[k].r].size;
10 }
11 void lturn(int &k){
12     int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
13     tr[t].size=tr[k].size;update(k);k=t;
14 }
15 void rturn(int &k){
16     int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;
17     tr[t].size=tr[k].size;update(k);k=t;
18 }
19 void insert(int &k,int x){
20     if(!k){
21         k=++size;
22         tr[k].w=tr[k].size=1;tr[k].v=x;tr[k].rnd=rand();
23         return;
24     }
25     tr[k].size++;
26     if(x==tr[k].v)tr[k].w++;
27     else if(x>tr[k].v){
28         insert(tr[k].r,x);
29         if(tr[tr[k].r].rnd<tr[k].rnd)lturn(k);
30     }
31     else{
32         insert(tr[k].l,x);
33         if(tr[tr[k].l].rnd<tr[k].rnd)rturn(k);
34     }
35 }
36 int del(int &k,int x){
37     int haha;
38     if(!k)return 0;
39     if(tr[k].v<x){
40         haha=tr[tr[k].l].size+tr[k].w;
41         k=tr[k].r;
42         return haha+del(k,x);
43     }
44     else{
45         haha=del(tr[k].l,x);
46         tr[k].size-=haha;
47         return haha;
48     }
49 }
50 int query(int k,int x){
51     if(x<=tr[tr[k].l].size)return query(tr[k].l,x);
52     else if(x>tr[tr[k].l].size+tr[k].w)return query(tr[k].r,x-tr[tr[k].l].size-tr[k].w);
53     else return tr[k].v;
54 }
55 int main(){
56     int n,lim,x,add=0,ans=0;
57     char op[5];
58     scanf("%d%d",&n,&lim);
59     for(int i=1;i<=n;i++){
60         scanf("%s%d",op,&x);
61         if(op[0]==‘I‘){
62             if(x>=lim)insert(root,x-add);
63         }
64         else if(op[0]==‘A‘)add+=x;
65         else if(op[0]==‘S‘){
66             add-=x;
67             ans+=del(root,lim-add);
68         }
69         else{
70             if(x>tr[root].size)printf("-1\n");
71             else printf("%d\n",query(root,tr[root].size-x+1)+add);
72         }
73     }
74     printf("%d\n",ans);
75     return 0;
76 }

时间: 2024-11-06 16:35:23

treap初步的相关文章

Treap

先推荐一篇文章和黄学长的代码http://hzwer.com/1712.html    https://wenku.baidu.com/view/c8c11e1e650e52ea55189887.html 黄学长的代码既不用指针又很短,真心推荐 Treap,顾名思义,Tree+Heap,它既满足二叉搜索树的性质,又满足堆的性质 对于二叉搜索树,如果我们把数有序加入,那么它的时间效率会退化成O(n). 我们引入一个随机数(即下文描述的修正值),使得随机数满足堆的性质(小根堆或大根堆,不一定要是完全

【贪心+Treap】BZOJ1691-[Usaco2007 Dec]挑剔的美食家

[题目大意] 有n头奶牛m种牧草,每种牧草有它的价格和鲜嫩度.每头奶牛要求它的牧草的鲜嫩度要不低于一个值,价格也不低于一个值.每种牧草只会被一头牛选择.问最少要多少钱? [思路] 显然的贪心,把奶牛和牧草都按照鲜嫩度由大到小排序,对于每奶牛把鲜嫩度大于它的都扔进treap,然后找出后继. 不过注意后继的概念是大于它且最小的,然而我们这里是可以等于的,所以应该是找cow[i].fresh-1的后继,注意一下…… 1 #include<iostream> 2 #include<cstdio&

初步了解CPU

了解CPU By JackKing_defier 首先说明一下,本文内容主要是简单说明CPU的大致原理,所需要的前提知识我会提出,但是由于篇幅我不会再详细讲解需要的其他基础知识.默认学过工科基础课. 一.总述 先从计算机的结构说起,在现代计算机中,CPU是核心,常常被比喻为人的大脑.现在的计算机都为“冯·诺依曼机”,“冯诺依曼机”的一个显著的特点就是由运算器.存储器.控制器.输入设备和输出设备组成.CPU是运算器和控制器合起来的统称,因为运算器和控制器在逻辑关系和电路结构上联系十分紧密,尤其在大

zerglurker的C语言教程004——指针初步讲解

在上次的教程里面,我提到了指针. 针对指针,这次我将简单的讲讲,后面我还会讲到--那个时候你应该有了相当的基础. 首先,先讲讲指针类型. 任何类型关键字后面加一个*符号,就会变成指针类型. 比如: char → char* 字符指针 int → int* 整数指针 double→double* 双精度指针 甚至还可以这样: char*→char** 字符指针的指针类型 →char*** 字符指针的指针的指针类型- 指针本质上是一个内存地址值,该内存地址上存放的是相关类型的数值.但是void*指针

1503: [NOI2004]郁闷的出纳员 Treap

1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 6263  Solved: 2190[Submit][Status] Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反之,如果心情不好,就可

nodejs,webpack安装以及初步运用

nodejs安装: 1.下载:https://nodejs.org/en/download/ 2.安装node-v6.11.3-x64.msi文件,直接默认安装(next--): 3.验证是否完成安装:cmd 进入后输入命令 node -v  回车能得到nodejs版本号: 输入node 回车再输入console.log('aaaaa') 回车能正常显示输出. 这表示nodejs安装成功. webpack安装: 1.npm安装:在f盘新建文件夹webpack,在webpack文件夹建文件夹dem

Github 的注册教程和初步使用体验

我叫许晴,是网工143的学生,学号是1413042064,兴趣包括手绘,看书和手游.学习过c++和汇编语言课程,但在编程方面没什么独立实践经验. 我的Githup用户名是 XQ123 .下面是我在github的注册流程及初步使用体验. 我先搜索github,试了好几次才进去官网,但是在手机客户端注册的话比较好进.这是网页注册的界面.使用名不能设成中文,只能使用数字.字母和特殊符号,不能以短横线开头.如果设置的用户名有重复的话也不能设置 如果设置的用户名已经有人使用的话,也是不能设置的. 然后就是

数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline __attri\ bute__( ( optimize( "-O2" ) ) ) Inline void read (int &now) { now = 0; register char word = getchar (); bool temp = false; while (wor

平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是将有向树的所有边看成无向边形成的树状图.树是一种递归的数据结构,所以我们研究树也是按照递归的方式去研究的. 2.什么是二叉树. 我们给出二叉树的递归定义如下: (1)空树是一个二叉树. (2)单个节点是一个二叉树. (3)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉