BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap
题目描述
输入
输出
样例输入
3 4 5 1 6 2
样例输出
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n;
int cnt;
int root;
int x,y,z;
int v[100010];
int s[100010];
int r[100010];
int mn[100010];
int ls[100010];
int rs[100010];
int size[100010];
struct miku
{
int val;
int num;
int rak;
}a[100010];
bool cmp1(miku a,miku b)
{
if(a.val!=b.val)
{
return a.val<b.val;
}
return a.num<b.num;
}
bool cmp2(miku a,miku b)
{
return a.num<b.num;
}
int build(int val)
{
int rt=++cnt;
r[rt]=rand();
v[rt]=val;
mn[rt]=val;
size[rt]=1;
return rt;
}
void rotate(int rt)
{
swap(ls[rt],rs[rt]);
s[rt]^=1;
}
void pushup(int rt)
{
size[rt]=size[ls[rt]]+size[rs[rt]]+1;
mn[rt]=v[rt];
if(ls[rt])
{
mn[rt]=min(mn[rt],mn[ls[rt]]);
}
if(rs[rt])
{
mn[rt]=min(mn[rt],mn[rs[rt]]);
}
}
void pushdown(int rt)
{
if(s[rt])
{
if(ls[rt])
{
rotate(ls[rt]);
}
if(rs[rt])
{
rotate(rs[rt]);
}
s[rt]^=1;
}
}
int merge(int x,int y)
{
if(!x||!y)
{
return x+y;
}
pushdown(x);
pushdown(y);
if(r[x]<r[y])
{
rs[x]=merge(rs[x],y);
pushup(x);
return x;
}
else
{
ls[y]=merge(x,ls[y]);
pushup(y);
return y;
}
}
void split(int rt,int k,int &x,int &y)
{
if(!rt)
{
x=y=0;
return ;
}
pushdown(rt);
if(size[ls[rt]]<k)
{
x=rt;
split(rs[rt],k-size[ls[rt]]-1,rs[x],y);
}
else
{
y=rt;
split(ls[rt],k,x,ls[y]);
}
pushup(rt);
}
int rank(int rt)
{
pushdown(rt);
int res=v[rt];
if(ls[rt])
{
res=min(res,mn[ls[rt]]);
}
if(rs[rt])
{
res=min(res,mn[rs[rt]]);
}
if(res==mn[ls[rt]])
{
return rank(ls[rt]);
}
else if(res==v[rt])
{
return size[ls[rt]]+1;
}
else
{
return size[ls[rt]]+1+rank(rs[rt]);
}
}
int main()
{
srand(20020419);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].num=i;
}
sort(a+1,a+1+n,cmp1);
for(int i=1;i<=n;i++)
{
a[i].rak=i;
}
sort(a+1,a+1+n,cmp2);
for(int i=1;i<=n;i++)
{
root=merge(root,build(a[i].rak));
}
for(int i=1;i<=n;i++)
{
int ans=rank(root);
printf("%d",i-1+ans);
if(i!=n)
{
printf(" ");
}
split(root,ans-1,x,y);
split(y,1,y,z);
rotate(x);
root=merge(x,z);
}
}
BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap的更多相关文章
- [bzoj1552][Cerc2007]robotic sort&&[bzoj3506][Cqoi2014]排序机械臂
非常垃圾的一道平衡树,结果被日了一天.很难受嗷嗷嗷 首先不得不说网上的题解让我这个本来就不熟悉平衡树的彩笔很难受——并不好理解. 还好Sinogi大佬非常的神,一眼就切掉了,而且用更加美妙的解法. 题 ...
- bzoj3506 [Cqoi2014]排序机械臂
bzoj3506 此题是一道比较简单的spaly题目. 用splay维护序列,将每个点排到对应的位置之后删除,这样比较容易区间翻转. 我的指针写法在洛谷上AC了,但在bzoj上RE. #include ...
- [BZOJ3506] [Cqoi2014] 排序机械臂 (splay)
Description 同OJ1552 Input Output Sample Input Sample Output HINT Source Solution Q:哎不是同一道题吗为什么分两篇博客来 ...
- 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)
点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...
- [BZOJ1552][Cerc2007]robotic sort
[BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...
- 【BZOJ3506】排序机械臂(Splay)
[BZOJ3506]排序机械臂(Splay) 题面 神TMBZOJ没有题面,感谢SYC的题面 洛谷的题面也不错 题解 对于每次旋转的物体 显然可以预处理出来 现在只要模拟旋转操作就行了 至于在哪里放标 ...
- Luogu P3165 [CQOI2014]排序机械臂
先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...
- P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1 ,并把左起第一个物品至 P1P_1P1 ...
- 洛谷P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...
随机推荐
- linux源码分析 - 进程
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 最近在回想一些知识点的时候,觉得对进程这一块有些模糊,特别写一篇随笔对进程信息进行巩固和复习. 程序和进程 以我 ...
- Vue-使用json-server快速“伪造”后台接口
JSON-Server主要的作用是搭建一台JSON服务器,测试一些业务逻辑(我之前都是采用读取文件的方式尴尬).一.安装 npm install --save json-server 前提是已经安装好 ...
- run `npm audit fix` to fix them, or `npm audit` for details
问题 added 246 packages from 681 contributors and audited 382 packages in 17.509s found 13 vulnerabili ...
- vs2017+opencv4.0.1安装配置详解(win10)
一.说明 笔者之前已经安装过了vs2017,对应的opencv是3.4.0版本的.但现在想体验下opencv4的改变之处,所以下载了最新的opencv4.0.1. vs2017的安装请自行搜索安装,本 ...
- Runaway argument错误 [Overleaf: 在线Latex] [Type 3问题后续]
[背景与问题描述] 在Latex中,经常出现各种问题: Runaway argument? {\contentsline {subsection}{\numberline {6.3}General c ...
- 【URLOS开发入门】docker官方系统镜像——Alpine入门教程
我们在进行URLOS应用开发时,经常会用到一些基础系统镜像,如:ubuntu.CentOS.Debian等,我们可以通过docker pull命令直接拉取官方镜像. root@ubuntu:~# do ...
- Centos下堡垒机Jumpserver V3.0环境部署完整记录(2)-配置篇
前面已经介绍了Jumpserver V3.0的安装,基于这篇安装文档,下面说下Jumpserver安装后的的功能使用: 一.jumpserver的启动 Jumpserver的启动和重启 [root@t ...
- 浅谈JS的作用域链(三)
前面两篇文章介绍了JavaScript执行上下文中两个重要属性:VO/AO和scope chain.本文就来看看执行上下文中的this. 首先看看下面两个对this的概括: this是执行上下文(Ex ...
- apacheTomcat
Window+R ------>cmd || Window PowerShell apacheTomcat\bin> ./startup.sh
- linux alias 别名设置【转载】
功能说明:设置指令的别名. 语 法:alias[别名]=[指令名称] 形如: alias cp=“cp -i” : 补充说明:用户可利用alias,自定指令的别名.若仅输入alias,则可列出目前所有 ...