#Splay#U137476 序列
题目
给定长度为\(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 序列的更多相关文章
- BZOJ 1251 Splay维护序列
思路: splay维护序列的裸题 啊woc调了一天 感谢yzy大佬的模板-- //By SiriusRen #include <cstdio> #include <cstring&g ...
- 【模板】splay维护序列
题目大意:维护一个长度为 N 的序列,支持单点插入,单点询问. 注意事项如下: build 函数中要记得初始化 fa. 插入两个端点值. 代码如下 #include <bits/stdc++.h ...
- splay树 序列终结者
/* 4655 序列终结者 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 网上有许多题,就是给定一个序 ...
- BZOJ 3223 Tyvj 1729 文艺平衡树 | Splay 维护序列关系
题解: 每次reverse(l,r) 把l-1转到根,r+1变成他的右儿子,给r+1的左儿子打个标记就是一次反转操作了 每次find和dfs输出的时候下放标记,把左儿子和右儿子换一下 记得建树的时候建 ...
- Splay模板(序列终结者)
我只是一个存模板的,详细的请看这里http://blog.csdn.net/whai362/article/details/47298133 题目链接:http://www.codevs.cn/pro ...
- BZOJ 3323 splay维护序列
就第三个操作比较新颖 转化成 在l前插一个点 把r和r+1合并 //By SiriusRen #include <cstdio> #include <cstring> #inc ...
- UVA 11996 Jewel Magic —— splay、序列的分裂与合并、LCP的哈希算法
#include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- 伸展树Splay
新学的,其实吧,就那么回事.... 看了几天,splay处理序列问题,真的非常厉害,翻转,插入,删除,线段树实现不了的功能,splay用起来很方便. POJ 3580 SuperMemo 这题基本就是 ...
- 【BZOJ2809】【splay启发式合并】dispatching
Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级. ...
随机推荐
- 具备有效期的localStorage存储
具备有效期的localStorage存储 类方式 // 具备有效期的localStorage存储-类方式. class LocalStorageWrapper { // 存储数据到localStora ...
- 项目实战:Qt中英文输入软键盘(支持Qt4、Qt5、触摸和键鼠混合输入等)
需求 1. 全屏软键盘: 2. 输入英文: 3. 输入中文: 4. 支持触摸.键盘和输入混合输入: 5. 目前有黑色系皮肤: 6. Qt4和Qt5区分2个版本: Demo:Qt5 ...
- NodeJS开启GZIP功能
gzip是用于压缩,效果特别好,js.css等文件的压缩率一般高达70% 具体方法如下: 先安装一个依赖 npm install compression --save 然后在已有代码里(一般是app. ...
- NodeJS内存泄露
p.p1 { margin: 0; font: 13px "Helvetica Neue"; color: rgba(0, 0, 0, 1) } p.p2 { margin: 0; ...
- AntSK:打造你的本地AI知识库——离线运行详细教程
亲爱的读者朋友们,今天我要给大家介绍一个强大的开源工具--AntSK.这个工具能让您在没有Internet连接时依然能使用人工智能知识库对话和查询,想象一下,即使在无网络的环境中,您也能与AI进行愉快 ...
- C++ 多线程笔记2 线程同步
C++ 多线程笔记2 线程同步 并发(Concurrency)和并行(Parallelism) 并发是指在单核CPU上,通过时间片轮转的方式,让多个任务看起来像是同时进行的.实际上,CPU在一个时间段 ...
- 关于Java并发多线程的一点思考
写在开头 在过去的2023年双11活动中,天猫的累计访问人次达到了8亿,京东超60个品牌销售破10亿,直播观看人数3.0亿人次,订单支付频率1分钟之内可达百万级峰值,这样的瞬间高并发活动,给服务端带来 ...
- Codeforces Round #851 (Div. 2) 题解
Codeforces Round #851 (Div. 2) 题解 A. One and Two 取 \(\log_2\),变成加号,前缀和枚举 \(s[i]=\dfrac{s[n]}{2}\). B ...
- git的 .gitignore 配置概述
git的 .gitignore 配置概述 学习背景:自己在使用git时发现有时会上传很多无用的配置文件,或者在项目中已经包含一个本地的git仓库,导致上一级项目上传总是报错,所以学习采用gitigno ...
- vscode中输入``自动将光标后面一个单词选中,左右加入<w>和</w>标签 - snippets 的命令调用
需求 vscode中输入``自动将光标后面一个单词选中,左右加入和标签 步骤0 准备需要安装插件 vim - 这里的点击两次按键激活的快捷键,这个插件可以设置 macros - 一次执行多个命令的插件 ...