1552: [Cerc2007]robotic sort
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
const int M=,inf=;
int n,root,c[M][],mn[M],pos[M],ans[M],rev[M],fa[M],size[M],v[M],top,s[M];
struct node{int v,pos;}tr[M];
bool cmp(node a,node b){return ((a.v<b.v)||(a.v==b.v&&a.pos<b.pos));}
bool operator<(node a,node b){return a.pos<b.pos;}
void push_up(int k){
int l=c[k][],r=c[k][];
size[k]=size[l]+size[r]+;
pos[k]=k; mn[k]=v[k];
if(mn[l]<mn[k]){ mn[k]=mn[l]; pos[k]=pos[l];}
if(mn[r]<mn[k]){ mn[k]=mn[r]; pos[k]=pos[r];}
}
void push_down(int k){
int l=c[k][],r=c[k][];
rev[k]=; rev[l]^=; rev[r]^=;
swap(c[k][],c[k][]);
}
int build(int l,int r){
if(l>r) return ;
int m=(l+r)>>;
size[m]=; pos[m]=m;
c[m][]=build(l,m-);
c[m][]=build(m+,r);
for(int i=;i<;i++) if(c[m][i]) fa[c[m][i]]=m;
push_up(m);
return m;
}
int find(int x,int rank){
if(rev[x]) push_down(x);
int l=c[x][],r=c[x][];
if(size[l]+==rank) return x;
else if(size[l]>=rank) return find(l,rank);
else return find(r,rank-size[l]-);
}
void rotate(int x,int &k){
int y=fa[x],z=fa[y],l=,r=;
if(c[y][]==x) l=,r=;
if(y==k) k=x;
else{if(c[z][]==y) c[z][]=x; else c[z][]=x;}
fa[x]=z; fa[y]=x; fa[c[x][r]]=y;
c[y][l]=c[x][r]; c[x][r]=y;
push_up(x); push_up(y);
}
void splay(int x,int &k){
top=;s[++top]=x;
for(int i=x;fa[i];i=fa[i])
s[++top]=fa[i];
for(int i=top;i;i--)
if(rev[s[i]]) push_down(s[i]);
while(x!=k){
int y=fa[x],z=fa[y];
if(y!=k){
if(c[z][]==y^c[y][]==x) rotate(y,k);
else rotate(x,k);
}
rotate(x,k);
}
}
int push_ans(int l,int r){
int x=find(root,l),y=find(root,r+);
splay(x,root); splay(y,c[x][]);
return pos[c[y][]];
}
void rever(int l,int r){
int x=find(root,l),y=find(root,r+);
splay(x,root); splay(y,c[x][]);
rev[c[y][]]^=;
}
int main()
{
n=read(); mn[]=inf;
tr[].v=tr[n+].v=inf;
for(int i=;i<=n+;i++) tr[i].v=read(),tr[i].pos=i;
sort(tr+,tr++n,cmp);
for(int i=;i<=n+;i++) tr[i].v=i-;
sort(tr+,tr++n); for(int i=;i<=n+;i++) v[i]=tr[i].v;
root=build(,n+);
for(int i=;i<=n;i++){
int x=push_ans(i,n);
splay(x,root);
ans[i]=size[c[x][]];
rever(i,ans[i]);
}
for(int i=;i<=n;i++){ printf("%d",ans[i]); if(i!=n) printf(" ");}
return ;
}
1552: [Cerc2007]robotic sort的更多相关文章
- BZOJ 1552: [Cerc2007]robotic sort( splay )
kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...
- bzoj 1552: [Cerc2007]robotic sort
1552: [Cerc2007]robotic sort Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1198 Solved: 457[Submit] ...
- [BZOJ1552][Cerc2007]robotic sort
[BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...
- 【BZOJ1552】[Cerc2007]robotic sort Splay
[BZOJ1552][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N ...
- 【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 ...
- 【BZOJ】1552/3506 [Cerc2007]robotic sort
[算法]splay [题解] splay维护序列,用权值(离散化)作为编号.每次找第i小的话直接找对应编号splay即可. 但是这样splay没有下传翻转标记?直接暴力找到路径然后从根到改结点push ...
随机推荐
- Flask 中文手册 0.10 文档
Flask 中文手册 0.10 文档 欢迎使用 Flask 欢迎阅读 Flask 文档. 本文档分为几个部分.我推荐您先从 安装 开始,之后再浏览 快速入门 章节. 教程 比快速入门更详细地介绍了如何 ...
- Python Flask之旅
<Pyhton Flask之旅> 以前学flask时做的总结,搬运到这里,markdown格式写的有点乱,凑合看吧. 参考博客 http://blog.csdn.net/nunchakus ...
- ACM做题随做随思
程序停止运行:数组开太大: 输入一串单词,可以“string s; while(cin>>s){//代码块}”,因为cin>>s遇到空格会停止: map<key,valu ...
- 配置Mac自带的Apache http服务器
Mac系统是自带Apache,所以很方便我们做一些http测试. 我可以先启动默认的服务器 $ sudo apachectl start 在浏览器打开:http://localhost 将会看到下面信 ...
- 【python】 json.dumps() json.dump()的区别
以前写的很简单,只有几句话,最近发现本文是本博客阅读量最大的一篇文章,觉得这样有种把人骗进来的感觉,于是又细化了一些.如果还有不好的地方,欢迎指出. 首先说明基本功能: dumps是将dict转化成s ...
- oracle或mysql定时增量更新索引数据到Elasticsearch
利用kettle Spoon从oracle或mysql定时增量更新数据到Elasticsearch https://blog.csdn.net/jin110502116/article/details ...
- background 背景图铺满界面
background <body background="/image/1.png" style=" background-repeat:no-repeat ; b ...
- [洛谷P1887]乘积最大3
题目大意:请你找出$m$个和为$n$的正整数,他们的乘积要尽可能的大.输出字典序最小的方案 题解:对于一些数,若它们的和相同,那么越接近它们的乘积越大. 卡点:无 C++ Code: #include ...
- [国家集训队]Crash的数字表格 / JZPTAB 莫比乌斯反演
---题面--- 题解: $$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}{\frac{ij}{gcd(i, j)}}$$ 改成枚举d(设n < m) $$ans ...
- 解决IE下页面空白或者报错:[vuex] vuex requires a Promise polyfill in this browser
[vuex] vuex requires a Promise polyfill in this browser 上述错误的原因是不支持 Promise 方法,导致页面出现空白无法加载. 解决方法如下: ...