BZOJ3506/1502 [CQOI2014]排序机械臂
依然是一道splay的区间操作,需要注意的是要把下标离散化后来表示splay的节点,我不知道怎么搞所以索性弄了个$ValuetoNode$,看样子没什么问题,
感觉他那个传下标的方法太暴力了..应该可以优化
//BZOJ 1552 //by Cydiater //2016.9.7 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctime> #include <cmath> #include <iomanip> #include <cstdlib> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) ; const int oo=0x3f3f3f3f; inline int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ,root=,tol=,ValuetoNode[MAXN],q[MAXN],head,tail; struct _data{ int id,v; }a[MAXN]; struct SplayTree{ ],fa,siz,v,tag; }t[MAXN]; namespace solution{ inline ]==node;} inline bool cmp(_data x,_data y){return x.v==y.v?x.id<y.id:x.v<y.v;} inline bool re_cmp(_data x,_data y){return x.id<y.id;} void updata(int node){ if(node){ t[node].siz=; ])t[node].siz+=t[t[node].son[]].siz; ])t[node].siz+=t[t[node].son[]].siz; } } void downit(int node){ if(t[node].tag){ ],rightson=t[node].son[]; ;; swap(t[node].son[],t[node].son[]); t[node].tag=; } } void rotate(int node){ int old=t[node].fa,oldf=t[old].fa,which=get(node); t[old].son[which]=t[node].son[which^];t[t[old].son[which]].fa=old; t[old].fa=node;t[node].son[which^]=old;t[node].fa=oldf; ]]=node; updata(old);updata(node); } void build(int leftt,int rightt,int node,int fa){ if(leftt==rightt){ t[node].v=a[leftt].v;t[node].fa=fa;t[node].son[]=t[node].son[]=; t[node].siz=;ValuetoNode[a[leftt].v]=node;t[node].tag=; return; } t[node].tag=; t[node].fa=fa;; t[node].v=a[mid].v;ValuetoNode[a[mid].v]=node; >=leftt){ t[node].son[]=++tol;build(leftt,mid-,tol,node); } <=rightt){ t[node].son[]=++tol;build(mid+,rightt,tol,node); } updata(node); } void splay(int node,int aim){ for(int fa;(fa=t[node].fa);rotate(node)){ if(node==aim)break; if(t[node].fa==aim){ rotate(node); break; } if(t[fa].fa==aim){ rotate(get(node)==get(fa)?fa:node); rotate(node); break; } if(t[fa].fa!=aim)rotate(get(node)==get(fa)?fa:node); } if(aim==root)root=node; } int find(int num){ int now=root; ){ downit(now); ]?t[t[now].son[]].siz:); ]; else{ )return now; num-=(tmp+); now=t[now].son[]; } } } void init(){ N=read(); a[].v=oo;a[].id=; up(i,,N+){ a[i].v=read(); a[i].id=i; }N++; a[++N].v=oo;a[N].id=N; sort(a+,a+N+,cmp); up(i,,N)a[i].v=++cnt;//sort by value root=++tol; sort(a+,a+N+,re_cmp); build(,N,root,); } void slove(){ up(i,,N-){ int node=ValuetoNode[i]; head=;tail=;q[++tail]=node;; int tmp=t[node].fa; while(tmp!=root){ q[++tail]=tmp; tmp=t[tmp].fa; }q[++tail]=root; while(head<=tail){ tmp=q[tail--]; downit(tmp); } splay(node,root);right_siz=t[t[root].son[]].siz+; printf();)printf(" "); int leftt=find(i),rightt=find(right_siz); splay(leftt,root);splay(rightt,t[root].son[]); ]; t[Son].tag^=; } puts(""); } } int main(){ //freopen("input.in","r",stdin); using namespace solution; init(); slove(); ; }
BZOJ3506/1502 [CQOI2014]排序机械臂的更多相关文章
- 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)
点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...
- P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1 ,并把左起第一个物品至 P1P_1P1 ...
- 洛谷P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...
- bzoj3506 [Cqoi2014]排序机械臂
bzoj3506 此题是一道比较简单的spaly题目. 用splay维护序列,将每个点排到对应的位置之后删除,这样比较容易区间翻转. 我的指针写法在洛谷上AC了,但在bzoj上RE. #include ...
- BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap
题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...
- [BZOJ3506] [Cqoi2014] 排序机械臂 (splay)
Description 同OJ1552 Input Output Sample Input Sample Output HINT Source Solution Q:哎不是同一道题吗为什么分两篇博客来 ...
- [bzoj1552][Cerc2007]robotic sort&&[bzoj3506][Cqoi2014]排序机械臂
非常垃圾的一道平衡树,结果被日了一天.很难受嗷嗷嗷 首先不得不说网上的题解让我这个本来就不熟悉平衡树的彩笔很难受——并不好理解. 还好Sinogi大佬非常的神,一眼就切掉了,而且用更加美妙的解法. 题 ...
- Luogu P3165 [CQOI2014]排序机械臂
先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...
- 【洛谷 P3165】 [CQOI2014]排序机械臂 (Splay)
题目链接 debug了\(N\)天没debug出来,原来是找后继的时候没有pushdown... 众所周知,,Splay中每个编号对应的节点的值是永远不会变的,因为所有旋转.翻转操作改变的都是父节点和 ...
随机推荐
- C#实现清理系统内存
金山内存整理工具.360内存清理工具非常好用,可以将系统内存最小化,提升系统运行速度.其实这些事情C#也可以做到,原理就是对系统进程中的进程内存进行逐个优化. 网上大多推荐使用系统的SetProces ...
- 在Go语言中使用JSON(去掉空字段)
Encode 将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error: func Marshal(v interface{}) ([]byte, error) ...
- nginx中获取真实ip
nginx反向代理配置时,一般会添加下面的配置: proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; ...
- auto refresh iframe
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...
- VMWare虚拟机提供的桥接、nat和主机模式的区别
虚拟机网络模式 无论是vmware,virtual box,virtual pc等虚拟机软件,一般来说,虚拟机有三种网络模式: 1.桥接 2.NAT 3.Host-Only 哪一种网络是适合自己的虚拟 ...
- Maven-搭建maven web项目
点击Eclipse菜单File->New->Other->Maven->Maven Project 在选择maven-archetype的界面进行如下操作:(其他选项基本与创建 ...
- TODO: 图片加载框架ImageLoader的实现
1, 使用三级缓存策略 2, 使用builder模式设置ImagLoager的config
- iOS蓝牙开发(一)蓝牙相关基础知识(转)
转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad , ...
- java项目的划分方式:模块优先还是层优先?
I've seen and had lots of discussion about "package by layer" vs "package by feature& ...
- IOS开发中UI编写方式——code vs. xib vs.StoryBoard
最近接触了几个刚入门的iOS学习者,他们之中存在一个普遍和困惑和疑问,就是应该如何制作UI界面.iOS应用是非常重视用户体验的,可以说绝大多数的应用成功与否与交互设计以及UI是否漂亮易用有着非常大的关 ...