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

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

还好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. ownCloud-9.1.1 (Ubuntu 16.04)

    平台: Ubuntu 类型: 虚拟机镜像 软件包: owncloud-9.1.1 commercial content management open-source owncloud storage ...

  2. Java 开发小常识

    从理论上来讲Java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么多理由来证明它确实占内存呢?两个字,陋习. 1.别用new Boolean().在很多场景中Boolean类型是必 ...

  3. java之操作mysql常用方法

    一般引用mysql-connector-java这个包. package DBManager; import java.sql.Connection; import java.sql.DriverMa ...

  4. nginx配置https服务器

    方法一 1.创建证书 #cd /usr/local/nginx/conf #openssl genrsa -des3 -out server.key 1024 #openssl req -new -k ...

  5. Microsoft EDP(enterprise database protection)配置策略中的三种Rule template

    搭建Microsoft EDP环境: Microsoft 10 insider preview,Microsoft Intune,ie10(要安装插件silverlight) 这里暂时只说在进行配置策 ...

  6. 859. Buddy Strings (wrong 4 times so many cases to test and consider) if else**

    Given two strings A and B of lowercase letters, return true if and only if we can swap two letters i ...

  7. 支付宝快速集成ios

    看一下这篇文章,非常不错,并在此感谢这篇文章的作者. 惯例,先写出嵌入支付宝的核心代码 - (IBAction)payWithAli:(UIButton *)sender { //生成订单信息NSSt ...

  8. POJ-3190 Stall Reservations---优先队列+贪心

    题目链接: https://vjudge.net/problem/POJ-3190 题目大意: 有N头奶牛,每头奶牛都会在[1,1000000]的时间区间内的子区间进行挤奶.挤奶的时候奶牛一定要单独放 ...

  9. P2065 [TJOI2011]卡片

    真·会了网络流,忘了匈牙利 一共两种颜色,很容易想到二分图劈配 虽然这题数据水 但是,数据强的话肯定会卡掉的. 为什么? 我暴力质因数都过了 我们可以在两边的数与质因数相连.然后跑网络流. #incl ...

  10. FTP服务安装及使用

    准备工作:一台服务器.我这里使用的是阿里云的ECS. 环境使用的是:windows 2008 r2 用途:FTP是用来进行文件传输的,我们可以把这个目录在IIS上配置成发布的网站,我们在本地只用把我们 ...