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. Akka源码分析-Akka-Streams-GraphStage

    上一篇博客中我们介绍了ActorMaterializer的一小部分源码,其实分析的还是非常简单的,只是初窥了Materializer最基本的初始化过程及其涉及的基本概念.我们知道在materializ ...

  2. Sql 主键设置

    1.开发数据库时常用命名规范 1>.使用不包含数字的单数表名,如果必要的话可以增加模块名前缀. 2>.对于主键的命名,使用表名+ID的形式. 3>.作为外键的列的名字应该与它们所对应 ...

  3. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Overlapping Rectangles

    There are nn rectangles on the plane. The problem is to find the area of the union of these rectangl ...

  4. 水题 CodeForces 137A Postcards and photos

    题目传送门 /* 水! */ #include <cstdio> #include <cstring> #include <algorithm> using nam ...

  5. .Net MVC 与WebApi ActionFilterAttribute 区别

    首先我们来看下 这两个ActionFilterAttribute 的命名空间区别的: 可以看出mvc 引用的是System.Web.Mvc,webapi 引用的是System.Web.Http.Fil ...

  6. Git学习笔记(2)-创建仓库

    一.Git简介 1.Git是什么 Git是分布式版本控制系统 2.Git有什么特点 (1)Git是分布式的SCM,SVN是集中式的 (2)Git每个历史版本存储完整的文件,SVN存储文件差异 (3)G ...

  7. Quartz.Net学习笔记(2)-简介

    一.Quartz.Net是什么 1.来源 Quartz.Net是一个开源的作业调度框架: 2.下载地址 官网地址:http://www.quartz-scheduler.net/documentati ...

  8. 151. [USACO Dec07] 建造路径

    ★★   输入文件:roads.in   输出文件:roads.out   简单对比 时间限制:1 s   内存限制:128 MB 译 by CmYkRgB123 描述 Farmer John 刚刚得 ...

  9. FTP初始化文件.netrc使用技巧[转发]

    FTP初始化文件.netrc使用技巧 FTP(文件传输)和E-mail(电子邮件).Telnet(远程登录)一样,是 Internet的三大主要功能之一.因为使用频繁,用户往往会遇到各种 各样的问题, ...

  10. vue2.0路由(跳转和传参)经典介绍

    声明式 <router-link :to="...">编程式router.push(...) router.push('home')                 / ...