Problem 平衡树 Treap

题目大意

  维护一个数列,支持两种操作。

  操作1:添加一个数x。

  操作2:询问不超过x的最大的数。

解题分析

  尝试了一下用指针来写splay,感觉写起来还是比较流畅的,不过用指针的时候还是需要注意一些小细节,要防止对空指针进行赋值。

  之后继续把指针版splay的各种功能补齐吧,最后写成模板的形式,方便以后使用。(= =树套树的话是不是只能用模板的形式叻。)

  ps:感觉已经好久没有写博文了,应该是我太懒了吧,还是应该每天写写题,发发博文也算是对自己的一种激励吧,也能把一些心得体会记下来。立个flag:以后每天发一篇博文。

参考程序

 #include <bits/stdc++.h>
using namespace std; struct node{
int val;
node *left,*right,*father;
node(int val_=,node* father_=NULL,node* left_=NULL,node* right_=NULL)
{
val=val_; father=father_; left=left_; right=right_;
}
}*rt; void search(node *now)
{
cout<<now<<" "<<now->val<<" "<<now->left<<" "<<now->right<<" "<<now->father<<endl;
if (now->left) search(now->left);
if (now->right) search(now->right);
} void pushup(node *x)
{
} void right(node* x,node* &rt)
{
node *y=x->father,*z=y->father;
if (y==rt) rt=x;
else if (z->left==y) z->left=x; else z->right=x; //需要判断是左右孩子
x->father=z; y->father=x; if (x->right) x->right->father=y; //防止对空指针进行操作
y->left=x->right; x->right=y;
pushup(y); pushup(x);
} void left(node* x,node* &rt)
{
node *y=x->father,*z=y->father;
if (y==rt) rt=x;
else if (z->left==y) z->left=x; else z->right=x;
x->father=z; y->father=x; if (x->left) x->left->father=y;
y->right=x->left; x->left=y;
pushup(y); pushup(x);
} void splay(node* x,node* &rt)
{
while (x!=rt)
{
node *y=x->father, *z=y->father;
if (z==NULL)
{
if (x==y->left) right(x,rt);
else left(x,rt);
}
else
{
if (y==z->left)
if (x==y->left) { right(y,rt); right(x,rt); }
else { left(x,rt); right(x,rt); }
else
if (x==y->right) { left(y,rt); left(x,rt); }
else { right(x,rt); left(x,rt); }
}
}
} void insert(int val,node* &now,node *last)
{
if (now==NULL)
{
now=new node(val,last);
splay(now,rt);
return;
}
if (val < now->val) insert(val,now->left,now); else //else还是要加的 返回的时候树的形态已经改变了
if (val > now->val) insert(val,now->right,now); else
if (val == now->val) return;
} int find(int val,node *x)
{
int res=-<<;
while (x!=NULL)
{
if (x->val>val) x=x->left;
else
{
res=max(res,x->val);
x=x->right;
}
}
return res; } int main()
{
int n;
rt=NULL;
scanf("%d",&n);
for (int i=;i<=n;i++)
{
char s[]; int x;
scanf("%s%d",s,&x);
if (s[]=='I') insert(x,rt,NULL); else cout<<find(x,rt)<<endl;
}
}

Hihocoder 1325 (splay)的更多相关文章

  1. Hihocoder 1333 (splay)

    Problem 平衡树 splay2 题目大意 维护一个序列,支持四种操作: 操作1:添加一个数,编号为x,权值为y. 操作2:删除编号在区间[x,y]内的数. 操作3:将编号在区间[x,y]内的数的 ...

  2. Hihocoder 1329(splay)

    Problem 平衡树 Splay 题目大意 维护一个数列,支持三种操作. 操作1:添加一个数x. 操作2:询问不超过x的最大的数. 操作三:删除大小在区间[a,b]内的数. 解题分析 和上一题相比, ...

  3. 【BZOJ3506】排序机械臂(Splay)

    [BZOJ3506]排序机械臂(Splay) 题面 神TMBZOJ没有题面,感谢SYC的题面 洛谷的题面也不错 题解 对于每次旋转的物体 显然可以预处理出来 现在只要模拟旋转操作就行了 至于在哪里放标 ...

  4. 【BZOJ1500】【NOI2005】维修数列(Splay)

    [BZOJ1500][NOI2005]维修数列(Splay) 题面 不想再看见这种毒瘤题,自己去BZOJ看 题解 Splay良心模板题 真的很简单 我一言不发 #include<iostream ...

  5. 【BZOJ1862】[ZJOI2006]游戏排名系统 (Splay)

    [BZOJ1862][ZJOI2006]游戏排名系统 (Splay) 题面 BZOJ 洛谷 题解 双倍经验题

  6. 【BZOJ1056】[HAOI2008]排名系统(Splay)

    [BZOJ1056][HAOI2008]排名系统(Splay) 题面 BZOJ 洛谷 题解 \(Splay\)随便维护一下就好了,至于名字什么的,我懒得手写哈希表了,直接哈希之后拿\(map\)压. ...

  7. 【BZOJ2329】括号修复(Splay)

    [BZOJ2329]括号修复(Splay) 题面 BZOJ 洛谷 题解 本来想着用线段树来写 但是有一个区间翻转 所以不能用线段树了,就只能用平衡树 然后直接\(Splay\)就好了 注意一下几个标记 ...

  8. P3391 【模板】文艺平衡树(Splay)新板子

    P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...

  9. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...

随机推荐

  1. 思维+multiset ZOJ Monthly, July 2015 - H Twelves Monkeys

    题目传送门 /* 题意:n个时刻点,m次时光穿梭,告诉的起点和终点,q次询问,每次询问t时刻t之前有多少时刻点是可以通过两种不同的路径到达 思维:对于当前p时间,从现在到未来穿越到过去的是有效的值,排 ...

  2. E - Cheap Kangaroo(求多个数的最大公约数)

    Description There are N kangaroos going out to eat at an Indian restaurant. The ith kangaroo wants t ...

  3. UE编辑器编译和运行java设置

    工具原料: UE编辑器 1点击“高级”,再点击“工具配置”. 2点击“插入”,在“菜单项”名称上输入“编译java程序”,在“命令行”里输入“javac %n%e”,在工作目录上填“%p”. 3切换到 ...

  4. C# 事件与委托(转载)

    委托的定义 delegate 是 C# 中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate 类能够拥有一个方法的签名(signature),并且它"只 ...

  5. 流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较

    1.流式套接字 使用这种套接字时,数据在客户端是顺序发送的,并且到达的顺序是一致的.比如你在客户端先发送1,再发送2,那么在服务器端的接收顺序是先接收到1,再接收到2,流式套接字是可靠的,是面向连接的 ...

  6. 【Python精华】100个Python练手小程序

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...

  7. [转]MVC之 自定义过滤器(Filter)

    本文转自:http://www.cnblogs.com/kissdodog/archive/2013/01/21/2869298.html 一.自定义Filter 自定义Filter需要继承Actio ...

  8. [转]position:fixed; 在IE9下无效果的问题

    本文转自:http://www.cnblogs.com/xinwang/archive/2013/04/06/3002384.html 平常DIV+CSS布局时,position属性一般用absoul ...

  9. android studio 的Error:No such property: packageApplicationTask for class: com.android.build.gradle.internal.variant.ApkVariantOutputData解决方法

    出现这个原因是安装了jrebel热部署插件,在projectStructure中的projec选项中,android 插件源仓会有热部署的配置.将jcenter后的配置全部删除就可以 注:本人只安装了 ...

  10. 如何解决数据库中,数字+null=null

    如何解决数据库中,数字+null=null 我使用SQLServer,做一个 update 操作,累计一个数.在数据库中,为了方便,数据库中这个字段我设为允许为空,并且设置了默认值为 0 .但是在新增 ...