非常垃圾的一道平衡树,结果被日了一天。很难受嗷嗷嗷

首先不得不说网上的题解让我这个本来就不熟悉平衡树的彩笔很难受——并不好理解。

还好Sinogi大佬非常的神,一眼就切掉了,而且用更加美妙的解法。

题意在操作时,就是第i次把编号为i-1和编号i的后继分别提到根和根的右儿子,根的右儿子的左子树打上翻转标记。

用外部数组记录原来高度第几大的在平衡树中编号是多少。就可以直接操作了。

注意有相同的高度,离散化时直接按高度第一关键字,编号第二关键字就行了。

还有每次splay要把根到当前节点都pushdown一遍。还有先pushdown再继续操作!包括判断有没有左右儿子!

可能只有我是傻逼吧

#include<bits/stdc++.h>
using namespace std;
const int N=;
inline int read(){
int r=,c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))
r=r*+c-'',c=getchar();
return r;
}
#define ls ch[x][0]
#define rs ch[x][1]
int ch[N][],siz[N],fa[N],rev[N],pos[N];
int rt,tot;
struct qwq{
int v,p;
}a[N];
bool cmpv(qwq p,qwq q){
if(p.v==q.v)return p.p<q.p;
return p.v<q.v;
}
bool cmpp(qwq p,qwq q){
return p.p<q.p;
}
void pp(int x){
siz[x]=siz[ls]+siz[rs]+;
}
void pd(int x){
if(rev[x]){
rev[x]=;
swap(ls,rs);
rev[ls]^=;rev[rs]^=;
}
}
int get(int x){
return x==ch[fa[x]][];
}
void rotate(int x){
int y=fa[x],z=fa[y],px=get(x),py=get(y);
int t=ch[x][px^];
ch[x][px^]=y;fa[y]=x;
ch[y][px]=t;fa[t]=y;
if(z)ch[z][py]=x;fa[x]=z;
pp(y);
}
int s[N];
void splay(int x,int lim){
int top=;
for(int i=x;i;i=fa[i])s[++top]=i;
for(int i=top;i;i--)pd(s[i]);
int y=fa[x];
while(y^lim){
if(fa[y]^lim)
rotate(get(x)==get(y)?y:x);
rotate(x);y=fa[x];
}
rt=!lim?x:rt;pp(x);
}
int nxt(){
pd(rt);int x=ch[rt][];
while(pd(x),ch[x][])x=ch[x][];
return x;
}
int build(int l,int r){
if(l>r)return ;
int mid=l+r>>,x=++tot;
ls=build(l,mid-);fa[ls]=x;
rs=build(mid+,r);fa[rs]=x;
pos[a[mid].v]=x;
pp(x);return x;
}
int main(){
int n=read();
a[].v=,a[n+].v=n+;
for(int i=;i<=n+;i++)
a[i].v=read(),a[i].p=i;
sort(a+,a+n+,cmpv);
for(int i=;i<=n+;i++)
a[i].v=i-;
sort(a+,a+n+,cmpp);
rt=build(,n+);
for(int i=;i<=n;i++){
int x=pos[i];splay(x,);
printf("%d",siz[ls]);if(i^n)printf(" ");
x=nxt();
int y=pos[i-];
splay(y,);splay(x,rt);
rev[ls]^=;
}
}

[bzoj1552][Cerc2007]robotic sort&&[bzoj3506][Cqoi2014]排序机械臂的更多相关文章

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

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

  2. bzoj3506 [Cqoi2014]排序机械臂

    bzoj3506 此题是一道比较简单的spaly题目. 用splay维护序列,将每个点排到对应的位置之后删除,这样比较容易区间翻转. 我的指针写法在洛谷上AC了,但在bzoj上RE. #include ...

  3. [BZOJ3506] [Cqoi2014] 排序机械臂 (splay)

    Description 同OJ1552 Input Output Sample Input Sample Output HINT Source Solution Q:哎不是同一道题吗为什么分两篇博客来 ...

  4. 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)

    点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...

  5. [BZOJ1552][Cerc2007]robotic sort

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

  6. 【BZOJ3506】排序机械臂(Splay)

    [BZOJ3506]排序机械臂(Splay) 题面 神TMBZOJ没有题面,感谢SYC的题面 洛谷的题面也不错 题解 对于每次旋转的物体 显然可以预处理出来 现在只要模拟旋转操作就行了 至于在哪里放标 ...

  7. Luogu P3165 [CQOI2014]排序机械臂

    先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...

  8. P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1​ ,并把左起第一个物品至 P1P_1P1 ...

  9. 洛谷P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...

随机推荐

  1. Struts_ActionWildcard_通配符配置

    使用通配符,将配置量降到最低 不过,一定要遵守“约定由于配置”的原则 struts2.xml <?xml version="1.0" encoding="UTF-8 ...

  2. C#中RichTextBox字体不统一(中英文)

    this.richTextBox1.Font = new System.Drawing.Font("微软雅黑", 12F);// new System.Drawing.Font(& ...

  3. Convolutional Neural Networks from deep learning (assignment 1 from week 1)

    Convolutional Neural Networks https://www.coursera.org/learn/convolutional-neural-networks/home/welc ...

  4. 种类并查集,TOJ(1706)

    题目链接:http://acm.tju.edu.cn/toj/showp1706.html 很类似Poj的一道帮派的问题,记得找到的可疑的关系,不要将集合刷新就可以了. 1706.   A Bug's ...

  5. CentOS6.5手动升级gcc4.8.2

    一.简易安装 操作环境 CentOS6.5 64bit,原版本4.4.7,不能支持C++11的特性~,希望升级到4.8.2 不能通过yum的方法升级,需要自己手动下载安装包并编译 本文记录了在Cent ...

  6. python-类对象以列表切片模式操作

    #类对象以列表切片模式操作 class Person: def __init__(self): self.cache=[] def __setitem__(self, key, value): #修改 ...

  7. 散度(Divergence)和旋度(Curl)

    原文链接 散度(Divergence) 散度的讨论应从向量和向量场说起.向量是数学中研究多维计算的基本概念.比如,速度可以分解为相互独立的分量,则速度就是一个多维的向量.假如空间中的每一个位置都有一个 ...

  8. YSlow的安装与说明文档

    yslow官网 http://yslow.org/ 很明显起这个名字是说why slow 为什么这么慢,理所当然是为当前网页进行检测 借百度的 什么是YSlow? YSlow是yahoo发布的一款基于 ...

  9. 解决windows下Composer因php_openssl扩展缺失而安装失败的问题

    Composer( https://getcomposer.org/ )是PHP下的一个依赖管理工具.你可以在你的项目中声明你所需要用到的类库,然后Composer会在项目中为你安装它们.如果你了解N ...

  10. 多线程, Thread类,Runnable接口

    多线程 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 单线程程序:即,若有多个任务只能依次执 ...