splay初步

  • 模板题

    指针的狂欢,写的要飞起来了,yooo~

    bzoj3223文艺平衡树

      区间翻转

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define inf 0x3f3f3f3f
 4 #define maxn 100005
 5 struct node{
 6     node *fa,*s[2];
 7     int key,size,mark;
 8     node(){fa=s[0]=s[1]=NULL;key=mark=0;size=1;}
 9     node(int _key){fa=s[0]=s[1]=NULL;key=_key;size=1;}
10     bool getlr(){return fa->s[1]==this;}
11     node *link(int w,node *p){s[w]=p;if(p)p->fa=this;return this;}
12     void update(){size=1+(s[0]?s[0]->size:0)+(s[1]?s[1]->size:0);}
13     void push_down(){
14         if(mark){
15             if(s[0])s[0]->mark^=1;
16             if(s[1])s[1]->mark^=1;
17             swap(s[0],s[1]);
18             mark^=1;
19         }
20     }
21 }*root,data[maxn],*laji=data;
22 void rot(node *p){
23     node *q=p->fa->fa;
24     p->getlr()?p->link(0,p->fa->link(1,p->s[0])):p->link(1,p->fa->link(0,p->s[1]));
25     p->fa->update();
26     if(q)q->link(q->s[1]==p->fa,p);
27     else p->fa=NULL,root=p;
28 }
29 void splay(node *p,node *tar){
30     while(p->fa!=tar&&p->fa->fa!=tar)
31         p->getlr()==p->fa->getlr()?(rot(p->fa),rot(p)):(rot(p),rot(p));
32     if(p->fa!=tar)rot(p);
33     p->update();
34 }
35 void insert(int k){
36     node *p=root,*q=NULL;
37     while(p){p->push_down();q=p;p=p->s[p->key<k];}
38     p=new(laji++)node(k);
39     if(!q){root=p;return;}
40     q->link(q->key<k,p);q->update();splay(p,0);
41 }
42 node *findkth(int k){
43     node *p=root;
44     p->push_down();
45     int w=p->s[0]?p->s[0]->size:0;
46     while(w+1!=k){
47         if(k<=w)p=p->s[0];
48         else k-=w+1,p=p->s[1];
49         p->push_down();
50         w=p->s[0]?p->s[0]->size:0;
51     }
52     splay(p,0);return p;
53 }
54 void flip(int l,int r){
55     node *p=findkth(l);
56     node *q=findkth(r+2);
57     splay(p,q);
58     p->s[1]->mark^=1;
59 }
60 void print(node *p){
61     p->push_down();
62     if(p->s[0])print(p->s[0]);
63     if(p->key!=inf&&p->key!=-inf)printf("%d ",p->key);
64     if(p->s[1])print(p->s[1]);
65 }
66 int main(){
67     int n,m,a,b;
68     scanf("%d%d",&n,&m);
69     insert(-inf);insert(inf);
70     for(int i=1;i<=n;i++)
71         insert(i);
72     for(int i=1;i<=m;i++){
73         scanf("%d%d",&a,&b);
74         flip(a,b);
75     }
76     print(root);
77     return 0;
78 }

    bzoj1503郁闷的出纳员

      终于完成了treap的遗愿

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 100005
 4 #define inf 0x3f3f3f3f
 5 struct node{
 6     node *fa,*s[2];
 7     int key,size;
 8     node(){fa=s[0]=s[1]=0;size=1;key=0;}
 9     node(int _key){fa=s[0]=s[1]=0;size=1;key=_key;}
10     bool getlr(){return fa->s[1]==this;}
11     node *link(int w,node *p){s[w]=p;if(p)p->fa=this;return this;}
12     void update(){size=1+(s[0]?s[0]->size:0)+(s[1]?s[1]->size:0);}
13 }*root,data[maxn],*laji=data;
14
15 void rot(node *p){
16     node *q=p->fa->fa;
17     p->getlr()?p->link(0,p->fa->link(1,p->s[0])):p->link(1,p->fa->link(0,p->s[1]));
18     p->fa->update();
19     if(q)q->link(q->s[1]==p->fa,p);
20     else {p->fa=0;root=p;}
21 }
22 void splay(node *p,node *tar){
23     while(p->fa!=tar&&p->fa->fa!=tar)
24         p->getlr()==p->fa->getlr()?(rot(p->fa),rot(p)):(rot(p),rot(p));
25     if(p->fa)rot(p);
26     p->update();
27 }
28 void insert(int k){
29     node *p=root,*q=NULL;
30     while(p){q=p;p=p->s[p->key<k];}
31     p=new(laji++) node(k);
32     if(!q){root=p;return;}
33     q->link(q->key<k,p);
34     q->update();
35     splay(p,0);
36
37 }
38 node *findkth(int k){
39     node *p=root;
40     int w=p->s[0]?p->s[0]->size:0;
41     while(w+1!=k){
42         if(w>=k)p=p->s[0];
43         else{p=p->s[1];k-=w+1;}
44         w=p->s[0]?p->s[0]->size:0;
45     }
46     splay(p,0);return p;
47 }
48 int main(){
49     int n,lim,x;
50     char op[5];
51     insert(-inf);insert(inf);
52     scanf("%d%d",&n,&lim);
53     int add=0,num=0;
54     for(int i=1;i<=n;i++){
55         scanf("%s%d",op,&x);
56         if(op[0]==‘I‘){
57             if(x>=lim)insert(x-add);
58         }
59         else if(op[0]==‘A‘)add+=x;
60         else if(op[0]==‘S‘){
61             add-=x;
62             insert(lim-add);
63             num+=root->s[0]?root->s[0]->size-1:0;
64             root=root->s[1];
65             root->fa=NULL;
66             insert(-inf);
67         }
68         else{
69             if(root->size-2<x)printf("-1\n");
70             else printf("%d\n",findkth(root->size-x)->key+add);
71         }
72     }
73     printf("%d\n",num);
74     return 0;
75 }
76 

  • 老爷题

    bzoj1500

时间: 2024-11-05 13:49:02

splay初步的相关文章

【算法详解】splay的初步了解

qwq表示最近感受到了不停课的鸭梨啊,好难搞啊……算法太难学了……我好菜啊qwq 其实半个多月前就可以写这篇文章,不过由于时间紧张没写emmmmmm,不扯闲言乱语了,如果有什么写的不好的地方凑活一下吧2333333333 splay是一种可以使树的最大深度尽可能的维持在logn级别的一种数据结构,当然splay的平衡确实不是非常好,但是它胜在代码量和思维难度小(像我这种菜鸡学个splay就快gg了),适合于算法竞赛,它中文名又叫伸展树,这也体现了它除平衡外的另一种特性——便于分裂和合并,这也可以

【BZOJ3786】星系探索 DFS序+Splay

[BZOJ3786]星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. 我们定义依赖关系如下:若星球a的依赖星球是b,则有星球a依赖星球b.此外,依赖关系具有传递性,即若星球a依赖星球b,星球b依赖星球c,则有星球a依赖星球c. 对于这个神秘的星系中,小C初步探究了它的性质,发现星球之间的依赖关系是无环的.并且从星球a出发只

【BZOJ-3786】星系探索 Splay + DFS序

3786: 星系探索 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 647  Solved: 212[Submit][Status][Discuss] Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. 我们定义依赖关系如下:若星球a的依赖星球是b,则有星球a依赖星球b.此外,依赖关系

bzoj 3786 星系探索 dfs+splay

[BZOJ3786]星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. 我们定义依赖关系如下:若星球a的依赖星球是b,则有星球a依赖星球b.此外,依赖关系具有传递性,即若星球a依赖星球b,星球b依赖星球c,则有星球a依赖星球c. 对于这个神秘的星系中,小C初步探究了它的性质,发现星球之间的依赖关系是无环的.并且从星球a出发只

bzoj3786星系探索 splay

3786: 星系探索 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1314  Solved: 425[Submit][Status][Discuss] Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球没有依赖星球. 我们定义依赖关系如下:若星球a的依赖星球是b,则有星球a依赖星球b.此外,依赖关

BZOJ 1861 [Zjoi2006]Book 书架 ——Splay

[题目分析] 模板题目. 首尾两个虚拟结点,十分方便操作. [代码] #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <set> #include <queue> #include <string> #include <iostream> #include

及其简短的Splay代码

#include <stdio.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <math.h> #include <iostream> #define inf 1000000000 using namespace std; #define getch() getchar() inline int F() {register int aa ,

BZOJ_1014_[JSOI2008]_火星人prefix_(Splay+LCP_Hash+二分)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1014 给出一个字符串,有修改,插入,以及询问LCP(i,j)的操作. 分析 LCP在白书上面有介绍,\(LCP(i,j)\)表示以第\(i\)位和以第\(j\)位开头的后缀的最长公共前缀. 先考虑没有插入和修改操作的问题.我们可以用基于Hash的LCP算法. 我们给每一个后缀一个Hash值.其中以第\(i\)为开头的后缀的Hash值为\(H[i]=H[i+1]x+s[i]\). 其中\(x\

初步了解CPU

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