【BZOJ】【1552】【Cerc2007】robotic sort / 【3506】【CQOI2014】排序机械臂
Splay
离散化+Splay维护序列……
好吧主要说一下我做这道题遇到的几个错误点:
1.离散化
2.由于找到的这个数的位置一定是大于等于 i 的,所以其实在把它splay到根以后,i 结点只能splay到它的左儿子,而不是右儿子……而且相应的,代表这个区间的应该是c[c[root][0]][1]呃……就是root的左儿子的右儿子= =整个反了一下……好吧不要在意这些细节,我也不知道为什么我突然要反过来写[捂脸熊]
3.进行了修改操作以后一定要立即splay修改的结点!在这题中就是当找到最小结点,将其置为无穷大后,一定要splay一下……否则就WA了TAT
/**************************************************************
Problem: 1552
User: Tunix
Language: C++
Result: Accepted
Time:2764 ms
Memory:4888 kb
****************************************************************/ //BZOJ 1552
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;i--)
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*+ch-'';
return r*v;
}
const int N=1e5+,INF=~0u>>;
/******************template*********************/
struct node{int v,pos;}a[N];
bool operator < (node a,node b){return a.pos<b.pos;}
bool cmp(node a,node b){return a.v<b.v||(a.v==b.v && a.pos<b.pos);}
int c[N][],fa[N],v[N],mn[N],size[N],tot,root,n;
bool rev[N];
#define L c[x][0]
#define R c[x][1]
void Push_down(int x){
if (rev[x]){
rev[L]^=; rev[R]^=;
swap(L,R); rev[x]=;
}
}
void Push_up(int x){
mn[x]=v[x];
if (L) mn[x]=min(mn[x],mn[L]);
if (R) mn[x]=min(mn[x],mn[R]);
size[x]=size[L]+size[R]+;
}
void Rotate(int x){
int y=fa[x],z=fa[y],l=c[y][]==x,r=l^;
c[z][c[z][]==y]=x;
fa[x]=z; fa[y]=x; fa[c[x][r]]=y;
c[y][l]=c[x][r]; c[x][r]=y;
Push_up(y);
}
int st[N];
void Preview(int x){
int top=; st[++top]=x;
for(int i=x;fa[i];i=fa[i])
st[++top]=fa[i];
D(i,top,) Push_down(st[i]);
}
void splay(int x,int s=){
int y;
for(Preview(x);fa[x]!=s;Rotate(x))
if (fa[y=fa[x]]!=s) Rotate(c[y][]==x^c[fa[y]][]==y?x:y);
Push_up(x);
if (!s) root=x;
}
void New_node(int &x,int f,int key){
x=++tot;
fa[x]=f;
v[x]=mn[x]=key;
rev[x]=L=R=;
size[x]=;
}
void Build(int &x,int f,int l,int r){
if (l>r) return;
int mid=l+r>>;
New_node(x,f,a[mid].v);
Build(L,x,l,mid-);
Build(R,x,mid+,r);
Push_up(x);
}
int kth(int x,int k){
Push_down(x);
if (size[L]+==k) return x;
else if (size[L]>=k) return kth(L,k);
else return kth(R,k-size[L]-);
}
int findmin(int x){
Push_down(x);
if (L && mn[x]==mn[L]) return findmin(L);
else if (R && mn[x]==mn[R]) return findmin(R)+size[L]+;
else {v[x]=INF;Push_up(x); return size[L]+;}
}
int main(){
n=getint();
v[]=mn[]=a[].v=a[n+].v=INF;
F(i,,n) {a[i].v=getint();a[i].pos=i;}
sort(a+,a+n+,cmp);
F(i,,n) a[i].v=i;
sort(a+,a+n+);
Build(root,,,n+);
F(i,,n){
int t1=findmin(root);
splay(kth(root,t1));
printf("%d",t1-); if(i!=n)printf(" ");
splay(kth(root,t1+)); splay(kth(root,i),root);
int pos=c[c[root][]][];
if (pos) rev[pos]^=;
splay(pos);
}
return ;
}
1552: [Cerc2007]robotic sort
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 436 Solved: 186
[Submit][Status][Discuss]
Description

Input
Output
注意:如果第i次操作前,第i小的物品己经在正确的位置Pi上,我们将区间[Pi,Pi]反转(单个物品)。
Sample Input
3 4 5 1 6 2
Sample Output
HINT
Source
【BZOJ】【1552】【Cerc2007】robotic sort / 【3506】【CQOI2014】排序机械臂的更多相关文章
- BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap
题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...
- [bzoj1552][Cerc2007]robotic sort&&[bzoj3506][Cqoi2014]排序机械臂
非常垃圾的一道平衡树,结果被日了一天.很难受嗷嗷嗷 首先不得不说网上的题解让我这个本来就不熟悉平衡树的彩笔很难受——并不好理解. 还好Sinogi大佬非常的神,一眼就切掉了,而且用更加美妙的解法. 题 ...
- 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] ...
- 1552/3506. [CQOI2014]排序机械臂【平衡树-splay】
Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. Output ...
- 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)
点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...
- Luogu P3165 [CQOI2014]排序机械臂
先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...
- P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1 ,并把左起第一个物品至 P1P_1P1 ...
- 洛谷P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...
- BZOJ3506/1502 [CQOI2014]排序机械臂
传送门 依然是一道splay的区间操作,需要注意的是要把下标离散化后来表示splay的节点,我不知道怎么搞所以索性弄了个$ValuetoNode$,看样子没什么问题, 感觉他那个传下标的方法太暴力了. ...
随机推荐
- Silverlight 独立存储(IsolatedStorageFile)
1.在Web中添加天气服务引用地址 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 2.在Web中添加Wcf服务接口I ...
- Java 中判断两个对象是否相等
由于每次实例化一个对象时,系统会分配一块内存地址给这个对象,而系统默认是根据内存地址来检测是否是同一个对象,所以就算是同一个类里实例化出来的对象它们也不会相等. public class Transp ...
- JS 获取浏览器和屏幕宽高等信息代码
JS 获取浏览器和屏幕宽高等信息. 网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:doc ...
- Nginx Location匹配举例
1.location / { if (!-f $request_filename){ rewrite ^/(.+)$ /uri.php last; }} ...
- xm 命令详解
xm 命令详解 xm addlabel label dom configfile [policy] xm addlabel label res resource [policy] 增加了名称为labe ...
- 对Iframe和图表设置高度的优质代码
//对Iframe和图表设置高度 function f() { parent.window.setWinHeight(parent.window.document.getElementById(&qu ...
- 应聘复习基础笔记1:网络编程之TCP与UDP的优缺点,TCP三次握手、四次挥手、传输窗口控制、存在问题
重要性:必考 一.TCP与UDP的优缺点 ①TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供 ...
- Redbean:入门(一) - 增删改查
<?php require_once 'rb.php'; $tableName = "link"; //链接数据库 R::setup("mysql:host=loc ...
- mysql开启日志
在 centos 5 下, 在 mysld 下面,添加一行 log=/var/log/mysql.log 然后执行如下命令 touch /var/log/mysql.logchmod 777 /va ...
- IOS内存管理「1」- 引用计数