这题的建模有点不太一样,是按结点横坐标赋予键值的

同时每次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维护区间翻转的更多相关文章

  1. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2202  Solved: 1226[Submit][Sta ...

  2. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6881  Solved: 4213[Submit][Sta ...

  3. 「Splay」区间翻转

    传送门:>Here< 解法分析 用splay来维护这个序列. 一直没有搞明白的是,这里的splay的节点究竟维护的是什么?是权值吗?肯定不是,因为区间是会翻转的,如果维护权值的话很快平衡树 ...

  4. 【模板】文艺平衡树(Splay) 区间翻转 BZOJ 3223

    您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 N,M<= ...

  5. 文艺平衡树 lg3391(splay维护区间入门)

    splay是支持区间操作的,先做这道题入个门 大多数操作都和普通splay一样,就不多解释了,只解释一下不大一样的操作 #include<bits/stdc++.h> using name ...

  6. splay(1区间翻转区间最值与区间修改)

    bzoj1251权限题 题目点这里,你懂得 直接上板子,这个要好好体会 操作是最经典的. #include <algorithm> #include <iostream> #i ...

  7. Splay(区间翻转) 模板

    洛谷:P3391 [模板]文艺平衡树(Splay) #include<cstdio> #include<iostream> #include<algorithm> ...

  8. 洛谷P3165 [CQOI2014]排序机械臂 Splay维护区间最小值

    可以将高度定义为小数,这样就完美的解决了优先级的问题. Code: #include<cstdio> #include<algorithm> #include<cstri ...

  9. hdu-1890-Robotic Sort splay区间翻转

    题意: 依次找第i大的数下标pos[i],然后将区间[i,pos[i]]翻转 分析: splay树区间翻转 // File Name: ACM/HDU/1890.cpp // Author: Zlbi ...

随机推荐

  1. python 数据类型 datatype

    python  数据类型 datatype 列表list 元组tuple 集合set 字典dictionary 字符串string 一.列表list list :python的一种数据类型.是可变的, ...

  2. GO语言的进阶之路-Golang字符串处理以及文件操作

    GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...

  3. VBScript常用函数

    VBScript常用函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1.Abs函数 Option Explicit '@author :yinzhengjie 'blog:ht ...

  4. sublime 将打字内容放在屏幕中央

    在settings user里添加一句: "scroll_past_end": true

  5. web4.0基本配置

    const path = require('path');//引入路径包 const HWP = require('html-webpack-plugin');//引入自动产出html包 const ...

  6. dubbo集群服务下一台服务挂了对服务调用的影响

    一.问题描述:项目中2台dubbo服务给移动端提供查询接口,移动端反应说查询时而很快(秒刷),时而很慢(4-5秒). 二.问题分析: 1.问题猜想:网络不稳定原因导致,但是切换公司wifi和手机4G, ...

  7. python - str和repr方法:

    # python 内置__str__()和__repr__()方法: #显示自定制 # 示例1 # a = 123 # print(a.__str__()) # 示例2 class Test(): d ...

  8. block循环引用

    block里边会有循环引用的风险,它可能对外部一个变量出现强引用,所以需要判断里边是否有循环引用,通过dealloc方法(销毁当前控制器.或销毁要测试的变量),判断是否循环引用.主要在block 里边 ...

  9. java的一维数组

    数组的基础知识: 数组一旦创建,它的的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 初始化数组的方法: 复制数组的方法: 1.使用循环语句逐个地复制数组的元素 2.使用System ...

  10. Struts2自定义拦截器处理全局异常

    今天在整理之前的项目的时候想着有的action层没有做异常处理,于是想着自定义拦截器处理一下未拦截的异常. 代码: package cn.xm.exam.action.safeHat; import ...