题目

给定长度为\(n\)的序列\(Ai\) ,我们将按照如下操作给\(Ai\) 排序,

先找到编号最小的所在位置\(x1\) ,将\([1,x1]\) 翻转,

再找到编号第二小的所在位置\(x2\) ,将\([1,x2]\) 翻转,

如果有相同的\(Ai\) ,则按照输入顺序操作。输出所有的\(xi\) 。

Sample Input:

6

3 4 5 1 6 2

Sample Output:

4 6 4 5 6 6


分析

Splay裸题,但赛时不会Splay,wtcl

这道题的关键就是记录每个数的在Splay中的编号,

要注意相同的数按照输入顺序操作,所以不能够直接建树,要一个个插入

那么将操作的编号按照数的大小排序,相同编号小则优先,那么得到编号就很容易寻找排名了


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int inf=0x7fffffff,N=100011; int b[N],ans[N],n;
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void print(int ans){
if (ans<0) putchar('-'),ans=-ans;
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
struct Splay{
int siz[N],lazy[N],cnt[N],son[N][2],fat[N],w[N],root,tot;
inline void pup(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];}
inline bool Is_R(int x){return son[fat[x]][1]==x;}
inline void pdown(int x){
if (x&&lazy[x]){
lazy[son[x][0]]^=1,lazy[son[x][1]]^=1;
swap(son[x][0],son[x][1]),lazy[x]=0;
}
}
inline void rotate(int x){
rr int Fa=fat[x],FFa=fat[Fa],wh=Is_R(x);
son[FFa][Is_R(Fa)]=x,fat[x]=FFa,son[Fa][wh]=son[x][wh^1];
fat[son[x][wh^1]]=Fa,son[x][wh^1]=Fa,fat[Fa]=x,pup(Fa),pup(x);
}
inline void update(int x,int tar){
if (x==tar) return;
update(fat[x],tar),pdown(x);
}
inline void splay(int x,int tar){
update(x,tar);
for (;fat[x]!=tar;rotate(x)){
rr int Fa=fat[x],FFa=fat[Fa];
if (FFa!=tar) rotate((Is_R(x)^Is_R(Fa))?x:Fa);
}
if (!tar) root=x;
}
inline signed rank(int x){
splay(x,0);
return siz[son[root][0]];
}
inline signed kth_site(int rk){
rr int now=root;
if (siz[now]<rk) return -1;
while (1){
pdown(now);
rr int lson=son[now][0];
if (siz[lson]+cnt[now]<rk)
rk-=siz[lson]+cnt[now],now=son[now][1];
else if (rk<=siz[lson]) now=son[now][0];
else break;
}
splay(now,0);
return now;
}
inline void Invert(int L,int R){
rr int l=kth_site(L-1),r=kth_site(R+1);
splay(l,0),splay(r,l);
lazy[son[son[root][1]][0]]^=1;
}
}Tre;
bool cmp(int x,int y){return (Tre.w[x]^Tre.w[y])?Tre.w[x]<Tre.w[y]:x<y;}
signed main(){
n=iut(),Tre.w[1]=-inf,Tre.w[n+2]=inf;
for (rr int i=2;i<n+2;++i) Tre.w[i]=iut();
for (rr int i=1;i<=n+2;++i)
Tre.son[i-1][1]=i,Tre.fat[i]=i-1,Tre.lazy[i]=0,
b[i]=i,Tre.cnt[i]=1,Tre.pup(i);
Tre.root=n+2,sort(b+1,b+2+n,cmp);
for (rr int i=2;i<n+2;++i){
rr int l=i,r=Tre.rank(b[i])+1;
Tre.Invert(l,r),ans[i-1]=r-1;
}
for (rr int i=1;i<=n;++i) print(ans[i]),putchar(i==n?10:32);
return 0;
}

#Splay#U137476 序列的更多相关文章

  1. BZOJ 1251 Splay维护序列

    思路: splay维护序列的裸题 啊woc调了一天 感谢yzy大佬的模板-- //By SiriusRen #include <cstdio> #include <cstring&g ...

  2. 【模板】splay维护序列

    题目大意:维护一个长度为 N 的序列,支持单点插入,单点询问. 注意事项如下: build 函数中要记得初始化 fa. 插入两个端点值. 代码如下 #include <bits/stdc++.h ...

  3. splay树 序列终结者

    /* 4655 序列终结者  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 网上有许多题,就是给定一个序 ...

  4. BZOJ 3223 Tyvj 1729 文艺平衡树 | Splay 维护序列关系

    题解: 每次reverse(l,r) 把l-1转到根,r+1变成他的右儿子,给r+1的左儿子打个标记就是一次反转操作了 每次find和dfs输出的时候下放标记,把左儿子和右儿子换一下 记得建树的时候建 ...

  5. Splay模板(序列终结者)

    我只是一个存模板的,详细的请看这里http://blog.csdn.net/whai362/article/details/47298133 题目链接:http://www.codevs.cn/pro ...

  6. BZOJ 3323 splay维护序列

    就第三个操作比较新颖 转化成 在l前插一个点 把r和r+1合并 //By SiriusRen #include <cstdio> #include <cstring> #inc ...

  7. UVA 11996 Jewel Magic —— splay、序列的分裂与合并、LCP的哈希算法

    #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> ...

  8. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

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

  9. 伸展树Splay

    新学的,其实吧,就那么回事.... 看了几天,splay处理序列问题,真的非常厉害,翻转,插入,删除,线段树实现不了的功能,splay用起来很方便. POJ 3580 SuperMemo 这题基本就是 ...

  10. 【BZOJ2809】【splay启发式合并】dispatching

    Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级. ...

随机推荐

  1. 遭遇DDOS攻击忍气吞声?立刻报警!首都网警重拳出击,犯罪分子无所遁形

    公元2024年2月24日18时许,笔者的个人网站突然遭遇不明身份者的DDOS攻击,且攻击流量已超过阿里云DDos基础防护的黑洞阈值,服务器的所有公网访问已被屏蔽,由于之前早已通过Nginx屏蔽了所有国 ...

  2. 可以取代宝塔和Nginx的Web服务器:Caddy

    一.安装 官网文章:https://caddyserver.com/docs/install 在左边选择:Install 我的服务器是Ubuntu,所以选第二行 我的服务器是Ubuntu,官方给出的就 ...

  3. 【Azure 环境】AAD 注册应用获取AAD Group权限接口遇 403 : Attempted to perform an unauthorized operation 错误

    问题描述 通过Azure AD的注册应用获取到Token后,访问AAD Group并查看日志信息时候,遇见了 {"error":{"code":"Un ...

  4. 图查询语言 nGQL 简明教程 vol.01 快速入门

    本文旨在让新手快速了解 nGQL,掌握方向,之后可以脚踩在地上借助文档写出任何心中的 NebulaGraph 图查询. 视频 本教程的视频版在B站这里. 准备工作 在正式开始 nGQL 实操之前,记得 ...

  5. mysql-批量修改表的主键id,修改成联合主键

    1.sql脚本 一. 通过sql脚本,查出所有表的功能,并编写插入修改的联合主键,sql select concat('ALTER table ', TABLE_NAME, ' DROP PRIMAR ...

  6. C++ //常用查找算法 find //自定义类型需要重载 ==

    1 //常用查找算法 find 2 #include<iostream> 3 #include<algorithm> 4 #include<functional> ...

  7. 解决centos启动zookeeper集群,但是状态显示报错:Error contacting service. It is probably not running 与连接超时,连接被拒绝问题

    安装zookeeper-3.4.10的时候,启动正常没报错,但bin/zkServer.sh status查看状态的时候却出现错误,如下: 这些都是我之前出现的问题,刚开始我出现的问题是连接超时,后来 ...

  8. 基于stm32的spi接口dma 数据收发实例解析

    一 前记 SPI接口平时用的比较少,再加上对CUBEMX不是很熟悉,这里踩了不少坑才把问题解决.针对遇到了不少问题,是要值得梳理一下了. 二 源码解析 1 SPI的DMA发送端配置: 2 主函数源码: ...

  9. JavaXMail发送邮件功能实现

    原文:JavaXMail发送邮件功能实现 | Stars-One的杂货小窝 好久之前实现的邮件发送功能,一直没整理出来,考虑到之后有个项目需要,先整理一波 提示: 本文代码例子是使用Kotlin语言编 ...

  10. ubuntu重启网卡

    1.关闭接口:sudo ifconfig eth0 down 2.然后打开:sudo ifconfig eth0 up