hdu1890 splay维护区间翻转
这题的建模有点不太一样,是按结点横坐标赋予键值的
同时每次rotate和splay时都要注意下往上往下更新
/*
先建立好splay tree,将结点按num/输入顺序排序,遍历时每次将当前结点提到根节点,输出其在splay树中排第几个
然后rev左子树,最后remove
*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#include<algorithm>
#define maxn 100005
struct A{
int num,id;
bool operator < (const A &a) const {
if(num==a.num) return id<a.id;
return num<a.num;
}
}a[maxn];
int pre[maxn],ch[maxn][],size[maxn],keys[maxn],tot,root,n;
int rev[maxn];
inline void pushup(int r){
size[r]=size[ch[r][]]+size[ch[r][]]+;
}
void update(int r){//就是交换r的两个子区间
if(!r) return;
else {
swap(ch[r][],ch[r][]);
rev[r]^=;
}
}
inline void pushdown(int r){
if(rev[r]){//把左右子树rev
update(ch[r][]);
update(ch[r][]);
rev[r]=;
}
}
inline void newnode(int &r,int fa,int key){
r=key;
pre[r]=fa;
ch[r][]=ch[r][]=;
size[r]=;
keys[r]=key;
rev[r]=;
}
void build(int &r,int L,int R,int fa){
if(L>R) return;
int m=L+R>>;
newnode(r,fa,m);
build(ch[r][],L,m-,r);
build(ch[r][],m+,R,r);
pushup(r);
}
void init(){
root=tot=;
ch[root][]=ch[root][]=;
size[root]=;
rev[root]=;
build(root,,n,);
}
//rotate操作只会改变r,fa,ch[r][kind]三个结点
void rotate(int x,int kind){
int fa=pre[x];
pushdown(fa);
pushdown(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(fa);
pushup(x);
}
void splay(int r,int goal){
pushdown(r);
while(pre[r]!=goal){
if(pre[pre[r]]==goal){
pushdown(pre[r]);
pushdown(r);
rotate(r,ch[pre[r]][]==r);
}
else {
pushdown(pre[pre[r]]);
pushdown(pre[r]);
pushdown(r);
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);
}
void remove(){//删掉根节点
if(ch[root][]==){
root=ch[root][];
pre[root]=;
}
else {
pushdown(root);
int tmp=ch[root][];
while(ch[tmp][])
pushdown(tmp),tmp=ch[tmp][];
splay(tmp,root);
ch[tmp][]=ch[root][];
pre[ch[root][]]=tmp;
root=tmp;
pre[root]=;
pushup(root);
}
} int main(){
while(scanf("%d",&n) && n){
init();
for(int i=;i<=n;i++)
scanf("%d",&a[i].num),a[i].id=i;
sort(a+,a++n);
for(int i=;i<n;i++){
splay(a[i].id,);//按权值大小遍历点
update(ch[root][]);//逆转区间
printf("%d ",i+size[ch[root][]]);//输出结点在当前伸展树中排的序号
remove();
}
printf("%d\n",n);
}
return ;
}
hdu1890 splay维护区间翻转的更多相关文章
- bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2202 Solved: 1226[Submit][Sta ...
- BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6881 Solved: 4213[Submit][Sta ...
- 「Splay」区间翻转
传送门:>Here< 解法分析 用splay来维护这个序列. 一直没有搞明白的是,这里的splay的节点究竟维护的是什么?是权值吗?肯定不是,因为区间是会翻转的,如果维护权值的话很快平衡树 ...
- 【模板】文艺平衡树(Splay) 区间翻转 BZOJ 3223
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 N,M<= ...
- 文艺平衡树 lg3391(splay维护区间入门)
splay是支持区间操作的,先做这道题入个门 大多数操作都和普通splay一样,就不多解释了,只解释一下不大一样的操作 #include<bits/stdc++.h> using name ...
- splay(1区间翻转区间最值与区间修改)
bzoj1251权限题 题目点这里,你懂得 直接上板子,这个要好好体会 操作是最经典的. #include <algorithm> #include <iostream> #i ...
- Splay(区间翻转) 模板
洛谷:P3391 [模板]文艺平衡树(Splay) #include<cstdio> #include<iostream> #include<algorithm> ...
- 洛谷P3165 [CQOI2014]排序机械臂 Splay维护区间最小值
可以将高度定义为小数,这样就完美的解决了优先级的问题. Code: #include<cstdio> #include<algorithm> #include<cstri ...
- hdu-1890-Robotic Sort splay区间翻转
题意: 依次找第i大的数下标pos[i],然后将区间[i,pos[i]]翻转 分析: splay树区间翻转 // File Name: ACM/HDU/1890.cpp // Author: Zlbi ...
随机推荐
- JavaSE学习总结(二)——Java语言基础
一.Java程序预览 Java的语法与C非常类似,这里先使用几个非常简单的程序以点带面来区分C语Java的区分再细讲每个知识点.该文仅针对有编程基础的朋友参考. 1.1.Hello World 创建j ...
- JS 中函数名后面加与不加括号的区别
a.onmouseover = fn1; a.onmouseout = fn2; function fn1(){ div.className = "erweima show"; } ...
- 挖洞姿势:特殊的上传技巧,绕过PHP图片转换实现远程代码执行(RCE)
我使用了一个特殊的图片上传技巧,绕过PHP GD库对图片的转换处理,最终成功实现了远程代码执行. 事情是这样的.当时我正在测试该网站上是否存在sql注入漏洞,不经意间我在网站个人页面发现了一个用于上传 ...
- javascript 学习1
1.javaScript允许对任意数据类型做比较,如boolean与number,false==0//true false === 0//false == 比较:自动转换数据类型进行比较,很多时候得到 ...
- 日志的使用-log4j
1,首先添加对log4j-core-2.6.2.jar,log4j-api-2.6.2.jar的引用. https://files.cnblogs.com/files/renjing/log4j.zi ...
- android HttpClient将数据提交到服务器
1.HttpClient 使用方式 public static String loginByClientGet(String username,String password) { try { //打 ...
- 数据库之MySQL存储过程
一.参考文献 https://www.oschina.net/translate/create-and-call-mysql-stored-procedure-database-sql-example ...
- [BJWC2011]最小三角形(分治+最近点对)
题面:BJWC2011 最小三角形 \(solution:\) 昨天才学完平面最近点对,今天就要求平面最近的三个点,显然不是巧合. 仔细一思考,我们用来求平面最近点对的方法不就可以用到三个点上吗? 就 ...
- idea的起步配置
工欲善其事,必先利其器 1.安装 https://www.jetbrains.com/idea/download/#section=windows 可以选择不同平台的安装包,版本一般Ultimate, ...
- 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...