1552: [Cerc2007]robotic sort

时间:2020-12-01 23:50:26
这道题用splay写 先离散化数据保证按题目所述顺序来写 按原序作为键值建树 维护区间最小值去跑 每次将i的位置 和 n的位置x和y找出来后 将x旋转到root y旋转到x的有儿子 这时y的左子树就是所求区间 找出区间最小值和他的位置之后 旋转最小值到root 这时他左子树的大小+1就是他现处位置 然后将i到最小值位置中间的区间打上标记等待旋转 这样全部处理完就okay了
#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的更多相关文章

  1. BZOJ 1552&colon; &lbrack;Cerc2007&rsqb;robotic sort&lpar; splay &rpar;

    kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...

  2. bzoj 1552&colon; &lbrack;Cerc2007&rsqb;robotic sort

    1552: [Cerc2007]robotic sort Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1198  Solved: 457[Submit] ...

  3. &lbrack;BZOJ1552&rsqb;&lbrack;Cerc2007&rsqb;robotic sort

    [BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...

  4. 【BZOJ1552】&lbrack;Cerc2007&rsqb;robotic sort Splay

    [BZOJ1552][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N ...

  5. 【bzoj1552&sol;3506】&lbrack;Cerc2007&rsqb;robotic sort splay翻转,区间最值

    [bzoj1552/3506][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. ...

  6. &lbrack;Cerc2007&rsqb;robotic sort

    splay区间反转练手题 #include <iostream> #include <cstdio> #include <algorithm> using name ...

  7. 洛谷 P4402 BZOJ1552 &sol; 3506 &lbrack;Cerc2007&rsqb;robotic sort 机械排序

    FHQ_Treap 太神辣 蒟蒻初学FHQ_Treap,于是来到了这道略显板子的题目 因为Treap既满足BST的性质,又满足Heap的性质,所以,对于这道题目,我们可以将以往随机出的额外权值转化为每 ...

  8. BZOJ 1552&sol;1506 &lbrack;Cerc2007&rsqb;robotic sort

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1552 [分析] 这题哇!又有翻转操作...每次要输出第几个?是吧... 所以又要用Spla ...

  9. 【BZOJ】1552&sol;3506 &lbrack;Cerc2007&rsqb;robotic sort

    [算法]splay [题解] splay维护序列,用权值(离散化)作为编号.每次找第i小的话直接找对应编号splay即可. 但是这样splay没有下传翻转标记?直接暴力找到路径然后从根到改结点push ...

随机推荐

  1. HTML5结构元素

    前面的话 几年前,用于网页布局的一般都用div元素,但语义化并不好.HTML5引入了大量新的块级元素来帮助提升网页的语义,使页面具有逻辑性的结构.容易维护,并且对数据挖掘服务更加友好.本文将详细介绍H ...

  2. 代码编辑器Sublime Text 3 免费使用方法与简体中文汉化包下载

    Sublime Text这款代码编辑器是Jeff 一直都在使用的,前段时间转用到版本3,因为感觉Sublime Text 3 启动速度更加快,运行更加流畅——虽然3 还是在Beta 阶段.下面就直接分 ...

  3. 团队Git工作流总结

    为什么使用Git “svn用了这么多年都好好的,为啥折腾搞Git?” “Git一点都不好用,提交个代码都提交不上去!” “Git这么复杂,命令多到记不住,而且完全用不到.哪有svn简单好用?”   推 ...

  4. Spring学习之第一个AOP程序

    IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...

  5. 比较常见的const与指针的组合情况

    1.对于普通的const与基本类型组合,都是表示的是这是一个常量, const int a; int const a; 表示的意思是一样的,a是一个常量,不可改变 2.对于const与指针组合在一起, ...

  6. 快速美眉&lpar;FastMM&rpar;使用手记

    今天在SourceForge下到了FastMM (Fast Memory Manager),听说比官方的内存管理快多了,试了一下,果然不错.目前最新的是4.27. 就我的使用范围来说,我就是想看看我的 ...

  7. 从零开始学Python--数据类型之字符串

    一.Python中的数据类型 ·   整数, 如 1 -100 ·   长整数, 是比较大的整数,Python 2里面有long长整数:Python 3里面没有 ·   浮点数 如 1.23.3E-2 ...

  8. Python图形用户界面

    1.使用Tkinter创建图形用户界面的步骤 (1)导入Tkinter模块,使用import Tkinter或from Tkinter import * (2)创建顶层窗口对象容器,使用top = T ...

  9. BZOJ3252攻略——长链剖分&plus;贪心

    题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...

  10. 对比学IT---路由器和linux流量统计的差别

    1. 路由器使用MQC来统计端口入出方向,特定特征的数据流. 显示policy 的统计信息 配置policy: #traffic classifier vlan5traffic operator an ...