splay区间反转练手题

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=;
int n,fa[N],ch[N][],val[N],siz[N],tot,pos[N],rt;
struct Node{
int id,v;
}a[N];
bool cmp1(Node x,Node y) {return x.v==y.v?x.id<y.id:x.v<y.v;}
bool cmp2(Node x,Node y) {return x.id<y.id;}
bool rev[N];
inline void pushup(int x) {siz[x]=siz[ch[x][]]+siz[ch[x][]]+;}
void pushdown(int x) {
if(rev[x]) {
swap(ch[x][],ch[x][]);
rev[ch[x][]]^=,rev[ch[x][]]^=;
rev[x]=;
}
}
int build(int f,int l,int r) {
if(l>r) return ;
int now=++tot,mid=l+r>>;
val[now]=a[mid].v;fa[now]=f;
pos[a[mid].v]=now;
ch[now][]=build(now,l,mid-);
ch[now][]=build(now,mid+,r);
pushup(now);
return now;
}
inline void rotate(int x) {
int f=fa[x],ff=fa[f];
pushdown(f);pushdown(x);
bool tag=ch[fa[x]][]==x;
ch[f][tag]=ch[x][tag^];
fa[ch[f][tag]]=f;
fa[f]=x;
ch[x][tag^]=f;
fa[x]=ff;
if(ff) ch[ff][f==ch[ff][]]=x;
pushup(f);pushup(x);
}
inline void splay(int x,int tar){
for(int f;(f=fa[x])!=tar;rotate(x)) if(fa[f]!=tar)rotate((x==ch[fa[x]][])==(f==ch[fa[f]][])?f:x);
if(!tar) rt=x;
}
int nxt(){
pushdown(rt);
int x=ch[rt][];
while(pushdown(x),ch[x][]) x=ch[x][];
return x;
}
int main() {
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i+].v),a[i+].id=i+;
a[].v=;a[n+].v=n+;//a[1].id=1,a[n+2].id=n+2;
sort(a+,a++n,cmp1);
for(int i=;i<=n+;i++) a[i].v=i-;
sort(a+,a++n,cmp2);
rt=build(,,n+);
for(int i=;i<=n;i++) {
int x=pos[i];splay(x,);
printf("%d ",siz[ch[x][]]);
x=nxt();
int y=pos[i-];
splay(y,);
splay(x,y);
rev[ch[x][]]^=;
}
}

robotic sort

[Cerc2007]robotic sort的更多相关文章

  1. [BZOJ1552][Cerc2007]robotic sort

    [BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...

  2. BZOJ 1552: [Cerc2007]robotic sort( splay )

    kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...

  3. 【BZOJ1552】[Cerc2007]robotic sort Splay

    [BZOJ1552][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N ...

  4. bzoj 1552: [Cerc2007]robotic sort

    1552: [Cerc2007]robotic sort Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1198  Solved: 457[Submit] ...

  5. 【bzoj1552/3506】[Cerc2007]robotic sort splay翻转,区间最值

    [bzoj1552/3506][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. ...

  6. 洛谷 P4402 BZOJ1552 / 3506 [Cerc2007]robotic sort 机械排序

    FHQ_Treap 太神辣 蒟蒻初学FHQ_Treap,于是来到了这道略显板子的题目 因为Treap既满足BST的性质,又满足Heap的性质,所以,对于这道题目,我们可以将以往随机出的额外权值转化为每 ...

  7. 【bzoj1552】[Cerc2007]robotic sort

    题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开的 ...

  8. [BZOJ1552] [Cerc2007] robotic sort (splay)

    Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. Output ...

  9. BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap

    题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...

随机推荐

  1. wait()方法写在while循环中可以在线程接到通知后再一次判断条件

    wait()方法写在while循环中可以在线程接到通知后再一次判断条件 synchronized public String pop() { String returnValue = "&q ...

  2. Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误

    这篇是计算机类的优质预售推荐>>>><Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误> 编辑推荐 纠错式学习,从"陷阱 ...

  3. oc25--私有变量私有方法

    // // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { @public int _a ...

  4. Android 重写onBackPressed()方法 遇到的问题

    1.resultCode的值一直为0 问题描述:AActivity调用startActivityForResult()方法,启动BActivity,然后在BActivity的onBackPressed ...

  5. 常见的DP优化类型

    常见的DP优化类型 1单调队列直接优化 如果a[i]单调增的话,显然可以用减单调队列直接存f[j]进行优化. 2斜率不等式 即实现转移方程中的i,j分离.b单调减,a单调增(可选). 令: 在队首,如 ...

  6. iOS网络开发工具集----字符串操作和时间操作

    一.字符串的操作方法 #pragma mark - 创建字符串 - (void)CreatString { // <1> 创建字符串 NSString *strS = @"Thi ...

  7. Coursera Algorithms week2 基础排序 练习测验: Intersection of two sets

    题目原文: Given two arrays a[] and b[], each containing n distinct 2D points in the plane, design a subq ...

  8. sql小计合计

    转自:http://www.jb51.net/article/18860.htm 这里介绍sql server2005里面的一个使用实例: CREATE TABLE tb(province nvarc ...

  9. E20170830-mk

    translation  n. 翻译; 译本; 转化; 转变; calculate  vt. 计算; 估计; 打算,计划; 旨在; erase  vt. 抹去; 清除; 擦掉;

  10. Python迭代器(斐波拉切数列实例)

    将一个容器通过iter()函数处理后,就变成了迭代器.迭代器有2个魔法方法__iter__.__next__,一个迭代器必须实现__iter__,这个方法实际上是返回迭代器本身(return self ...