BZOJ_1552_[Cerc2007]robotic sort_splay
BZOJ_1552_[Cerc2007]robotic sort_splay
题意:

分析:
splay维护区间操作
可以先把编号排序,给每个编号分配一个固定的点,映射过去
查找编号的排名时先找到这个点,找出到根的路径
从上至下pushdown标记,顺便求出这个点的排名
然后翻转啥的就好做了
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
int a[N],ch[N][2],f[N],siz[N],val[N],turn[N],rt;
int n,w[N];
struct A{
int num,id;
}b[N];
bool cmp(const A &x,const A &y)
{
if(x.num==y.num)return x.id<y.id;
return x.num<y.num;
}
void print(int p)
{
if(!p)return ;
if(ls)print(ls);
printf("p=%d ,val[p]=%d ",p,val[p]);
if(rs)print(rs);
}
void pushup(int p){ if(p) siz[p]=siz[ls]+siz[rs]+1; }
void pushdown(int p)
{
if(turn[p])
{
turn[p]=0;
turn[ls]^=1;turn[rs]^=1;
swap(ch[ls][0],ch[ls][1]);
swap(ch[rs][0],ch[rs][1]);
}
}
void rotate(int x)
{
int y=f[x],z=f[y],k=get(x);
ch[y][k]=ch[x][k^1];f[ch[y][k]]=y;ch[x][k^1]=y;
f[y]=x;f[x]=z;if(z)ch[z][ch[z][1]==y]=x;
pushup(y),pushup(x);if(rt==y)rt=x;
}
void splay(int x,int y)
{
for(int fa;(fa=f[x])!=y;rotate(x))
if(f[fa]!=y)
rotate((get(x)==get(fa)) ? fa : x);
}
int find(int x)
{
int p=rt;
while(1){
pushdown(p);
if(x<=siz[ls])p=ls;
else{
x-=siz[ls]+1;
if(!x)return p;
p=rs;
}
}
}
void build(int fa,int l,int r,int flg)
{
if(l>r)return ;
int mid=l+r>>1;
ch[fa][flg]=mid;
f[mid]=fa;
siz[mid]=1;
val[mid]=a[mid-1];
w[a[mid-1]]=mid;
build(mid,l,mid-1,0);
build(mid,mid+1,r,1);
pushup(mid);
}
int getrank(int p)
{
int cnt=0;
while(p)
{
a[++cnt]=p;
p=f[p];
}
int i;
for(i=cnt;i;i--) pushdown(a[i]);
splay(a[1],0);
return siz[ch[a[1]][0]];
}
void reverse(int x,int p)
{
x=find(x);
p=find(p);
splay(x,0);
splay(p,rt);
turn[ls]=1;
swap(ch[ls][0],ch[ls][1]);
pushup(p);pushup(x);
}
int main()
{
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&b[i].num);
b[i].id=i;
}
sort(b+1,b+n+1,cmp);
for(i=1;i<=n;i++)
{
a[b[i].id]=i;
}
build(0,1,n+2,1);
rt=n+3>>1;
for(i=1;i<=n;i++)
{
int tmp=getrank(w[i]);
if(i-1)printf(" %d",tmp);
else printf("%d",tmp);
reverse(i,tmp+2);
}
}
BZOJ_1552_[Cerc2007]robotic sort_splay的更多相关文章
- [BZOJ1552][Cerc2007]robotic sort
[BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...
- BZOJ 1552: [Cerc2007]robotic sort( splay )
kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...
- 【BZOJ1552】[Cerc2007]robotic sort Splay
[BZOJ1552][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N ...
- bzoj 1552: [Cerc2007]robotic sort
1552: [Cerc2007]robotic sort Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1198 Solved: 457[Submit] ...
- 【bzoj1552/3506】[Cerc2007]robotic sort splay翻转,区间最值
[bzoj1552/3506][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. ...
- [Cerc2007]robotic sort
splay区间反转练手题 #include <iostream> #include <cstdio> #include <algorithm> using name ...
- 洛谷 P4402 BZOJ1552 / 3506 [Cerc2007]robotic sort 机械排序
FHQ_Treap 太神辣 蒟蒻初学FHQ_Treap,于是来到了这道略显板子的题目 因为Treap既满足BST的性质,又满足Heap的性质,所以,对于这道题目,我们可以将以往随机出的额外权值转化为每 ...
- BZOJ 1552/1506 [Cerc2007]robotic sort
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1552 [分析] 这题哇!又有翻转操作...每次要输出第几个?是吧... 所以又要用Spla ...
- 【bzoj1552】[Cerc2007]robotic sort
题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开的 ...
随机推荐
- mysql性能优化之-innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit是配置MySql日志何时写入硬盘的参数: 一.参数值说明 0:log buffer将每秒一次地写入log file中,并且log file的 ...
- RocketMQ源码 — 六、 RocketMQ高可用(1)
高可用究竟指的是什么?请参考:关于高可用的系统 RocketMQ做了以下的事情来保证系统的高可用 多master部署,防止单点故障 消息冗余(主从结构),防止消息丢失 故障恢复(本篇暂不讨论) 那么问 ...
- oracle索引建立和删除
1.多列建立索引 SQL> create index dex_index2 on dex(sex,name); Index created. SQL> select object_name ...
- IBATIS的优缺点
ibatis优缺点总结 .优点 简单: 易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现. 实用: 提供了数据映射功能,提供了对底层数据访问的封装(例如ado.net),提供 ...
- EJB 介绍
EJB 编辑 EJB是sun的服务器端组件模型,设计目标与核心应用是部署分布式应用程序.凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台.EJB (Enterprise ...
- scons脚本示例
import os def list_dir(dir): all_dirs = [] for root, dirs, files in os.walk('./', True): for name in ...
- ASP.NET Core Api网关Ocelot的中文文档
架构图 入门 不支持 配置 路由 请求聚合 GraphQL 服务发现 微服务ServiceFabric 认证 授权 Websockets 管理 流量控制 缓存 QoS服务质量 转换Headers 转换 ...
- mybatis源码解读(三)——数据源的配置
在mybatis-configuration.xml 文件中,我们进行了如下的配置: <!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境常用: ...
- UE4学习心得:Scene Component蓝图的一个简单应用
Scene Component是蓝图类中一个不怎么常用的分类(特别是对于新手而言),主要是其实现的功能可以在Actor类中用相同的方法实现,使其作用显得有点多余. 笔者在使用过这个类之后发现其作用更相 ...
- CSS基础知识01
一.CSS基础知识介绍 1.css是cascading style sheet层叠式样式表的简写 2.css小用法 加粗:font-weight:bold; 正常用:norma ...