poj2828 伸展树模拟
用伸展树模拟插队比线段树快乐3倍。。
但是pojT了。别的oj可以过,直接贴代码.
每次更新时,找到第pos个人,splay到根,然后作为新root的左子树即可
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 200005
using namespace std; int pre[maxn],ch[maxn][],num[maxn],key[maxn],size[maxn],tot,root;
void init(){
tot=root=;
pre[root]=ch[root][]=ch[root][]=num[root]=key[root]=size[root]=;
}
void newnode(int &r,int fa,int k,int val){
r=++tot;
ch[r][]=ch[r][]=;
num[r]=val;
key[r]=k;
pre[r]=fa;
size[root]=;
}
void pushup(int r){
size[r]=size[ch[r][]]+size[ch[r][]]+;
}
void rotate(int x,int kind){
int fa=pre[x];
ch[fa][!kind]=ch[x][kind];
pre[ch[x][kind]]=fa;
if(pre[fa])
ch[pre[fa]][ch[pre[fa]][]==fa]=x;
pre[x]=pre[fa];
pre[fa]=x;
ch[x][kind]=fa;
pushup(x);pushup(fa);
}
void splay(int r,int goal){
while(pre[r]!=goal){
if(pre[pre[r]]==goal) rotate(r,ch[pre[r]][]==r);
else {
int fa=pre[r];
int kind=ch[pre[fa]][]==fa;//????????
if(ch[fa][kind]==r){
rotate(r,!kind);
rotate(r,kind);
}
else {
rotate(fa,kind);
rotate(r,kind);
}
}
}
if(goal==) root=r;
pushup(r);pushup(root);
}
void Treavel(int x)
{
if(x)
{
Treavel(ch[x][]);
printf("结点%2d:左儿子 %2d 右儿子 %2d 父结点 %2d size=%2d,key=%2d \n",x,ch[x][],ch[x][],pre[x],size[x],key[x]);
Treavel(ch[x][]);
}
}
void debug()
{
printf("root:%d\n",root);
Treavel(root);
}
void Treval(int r){
if(r){
if(ch[r][]) Treval(ch[r][]);
printf("%d ",num[r]);
if(ch[r][]) Treval(ch[r][]);
}
}
void getth(int pos){
int r=root;
while(size[ch[r][]]+!=pos){
if(size[ch[r][]]+<pos)
pos-=size[ch[r][]]+,r=ch[r][];
else r=ch[r][];
}
splay(r,);
}
void insert(int pos,int val){//??
if(root==) {
newnode(root,,pos,val);
return;
}
else if(pos==){
int r=root;
while(ch[r][])
r=ch[r][];
newnode(ch[r][],r,pos,val);
splay(ch[r][],);
return;
}
else {
getth(pos);
int oldroot=root;
newnode(root,,pos,val);
ch[root][]=ch[oldroot][];
pre[ch[root][]]=root;
ch[oldroot][]=;
pushup(oldroot);
ch[root][]=oldroot;
pre[oldroot]=root;
pushup(root);
}
} int main(){
int n,pos,num;
while(scanf("%d",&n)==){
init();
for(int i=;i<=n;i++){
scanf("%d%d",&pos,&num);
insert(pos,num);
debug();
}
Treval(root);
puts("");
}
return ;
}
poj2828 伸展树模拟的更多相关文章
- hdu3436 splaytree树模拟队列+离散化缩点
数据较大,需要先把每个top不会操作到的段缩成一个点,记录其开始和结束的位置,和top能操作到的点一起建立一颗伸展树模拟 然后就是普通的队列模拟操作 /* 不会被top操作到的区间就缩点 通过spla ...
- Hdu3487-Play with Chain(伸展树分裂合并)
Problem Description YaoYao is fond of playing his chains. He has a chain containing n diamonds on it ...
- Poj3468-A Simple Problem with Integers(伸展树练练手)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- hdu4453-Looploop(伸展树)
题目有很多图,不好粘贴..... 题意:给出N个数和K1,K2的值,最开始指针指向第一个数,有6种操作 add x : 给前K2个数都增加x reverse : 翻转前K1个数 insert x : ...
- 【BBST 之伸展树 (Splay Tree)】
最近“hiho一下”出了平衡树专题,这周的Splay一直出现RE,应该删除操作指针没处理好,还没找出原因. 不过其他操作运行正常,尝试用它写了一道之前用set做的平衡树的题http://codefor ...
- BZOJ 1269 文本编辑器editor(伸展树)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=1269 思路 伸展树(\(\text{splay}\))功能比较齐全的模板,能较好的体现 \( ...
- 伸展树的基本操作——以【NOI2004】郁闷的出纳员为例
前两天老师讲了伸展树……虽然一个月以前自己就一直在看平衡树这一部分的书籍,也仔细地研读过伸展树地操作代码,但是就是没写过程序……(大概也是在平衡树的复杂操作和长代码面前望而生畏了)但是今天借着老师布置 ...
- HYSBZ 1500 维修数列(伸展树模板)
题意: 题解:典型伸展树的题,比较全面. 我理解的伸展树: 1 伸展操作:就是旋转,因为我们只需保证二叉树中序遍历的结果不变,所以我们可以旋转来保持树的平衡,且旋转有左旋与右旋.通过这种方式保证不会让 ...
- 【bzoj1251】序列终结者(伸展树)
[bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...
随机推荐
- 利用bootstrap-datetimepicker实日历插件
由于项目中需要获取一个时间值,手动输入的话比较Low,这里引用了bootstrap-datetimepicker模块来实现. 1.首先,下载该模块并引用.(官网:http://www.bootcss. ...
- xen 配置vm 跟随xen server一起启动
查看Xen Server 信息 (1)查看pool信息 [root@xenserver-243 ~]# xe pool-list uuid ( RO) : e29037aa-0dca-f95a-193 ...
- Linux记录-自动删除几天前的日志文件
#!/bin/sh DDIR=/usr/local/appserver/tomcat_risk/logs/risk_manage find $DDIR -mtime +30 -name "* ...
- C#中子线程操作主线程中窗体上控件的方法
Demo this.listView1.Visible = true; this.listView1.BeginUpdate();this.listView1.EndUpdate(); //结束数据处 ...
- 矩阵乘法np.dot()及np.multipy()区别
1. 线性代数中矩阵乘法: np.dot() import numpy as np # 2 x 3 matrix1 = np.array([[1, 2, 3], [4, 5, 6]]) # 3 ...
- ps知识集锦
1.工具箱 移动工具 [V]矩形.椭圆选框工具 [M]套索.多边形套索.磁性套索 [L]快速选择工具.魔棒工具 [W] 裁剪.透视裁剪.切片.切片选择工具 [C]吸管.颜色取样器.标尺.注释.12 ...
- 逆向安全基础之IDA使用简介
转载:http://m.blog.csdn.net/ilnature2008/article/details/54912854 IDA简介 IDA是业界一个功能十分强大的反汇编工具,是安全渗透人员进行 ...
- 虚拟树研究-CheckBox初步判断只能在第一列
//虚拟树研究-CheckBox初步判断只能在第一列 procedure TWindowsXPForm.XPTreeInitNode(Sender: TBaseVirtualTree; ParentN ...
- MySQL或MariaDB忘记root密码
当我们忘记数据库密码时,我们可以通过如下来修改! 编辑配置文件(提前最好进行备份) 然后重启服务 systemctl restart mariadb 或者 systemctl restart mysq ...
- Jetson tk1 安装 Intel 7260 无线网卡驱动
Jseton TK1上没有集成的无线网卡,开发板上有一个mini pci-e接口,可以插入Intel 7260这款继承了wifi和蓝牙功能的无线网卡: 该网卡实物如下图,在淘宝和Amazon上都可以买 ...