洛谷P3165 [CQOI2014]排序机械臂 Splay维护区间最小值
可以将高度定义为小数,这样就完美的解决了优先级的问题。
Code:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=100000+2;
int cnt[10000000+33];
double B[maxn],A[maxn];
struct Node
{
int s,tag;
double v,minv;
Node *ch[2];
int ls(){
if(ch[0]==NULL)return 0;
return ch[0]->s;
}
Node(double u)
{
v=u,s=1,minv=u,tag=0;
ch[0]=ch[1]=NULL;
}
int cmp(double x){
if(ch[0]!=NULL)
{if(ch[0]->minv==x)return 0;}
if(ch[1]!=NULL)
{if(ch[1]->minv==x)return 1;}
return -1;
}
int cmp2(int k){
int lsize=ch[0]==NULL?0:ch[0]->s;
if(k<=lsize)return 0;
if(k==lsize+1)return -1;
return 1;
}
void down(){
if(tag==1){
tag=0;
swap(ch[0],ch[1]);
if(ch[0]!=NULL)ch[0]->tag=!ch[0]->tag;
if(ch[1]!=NULL)ch[1]->tag=!ch[1]->tag;
}
}
void maintain(){
s=1,minv=v;
if(ch[0]!=NULL){
s+=ch[0]->s;minv=min(minv,ch[0]->minv);
}
if(ch[1]!=NULL){
s+=ch[1]->s;minv=min(minv,ch[1]->minv);
}
}
};
void rotate(Node* &o,int d){
Node *k=o->ch[d^1];o->ch[d^1]=k->ch[d];k->ch[d]=o;
o->maintain();k->maintain();o=k;
}
void splay(Node* &o,double x){
o->down();
int d=o->cmp(x);
if(d!=-1){
Node *p=o->ch[d];
p->down();
int d2=p->cmp(x);
if(d2!=-1){
splay(p->ch[d2],x);
if(d==d2)
rotate(o,d^1);
else
{ rotate(p,d2^1);o->ch[d]=p;}
}
rotate(o,d^1);
}
}
void splay2(Node* &o,int k){
o->down();
int d=o->cmp2(k);
if(d==1)k-=o->ls()+1;
if(d!=-1)
{
Node *p=o->ch[d];
p->down();
int d2=p->cmp2(k);
if(d2==1)k-=p->ls()+1;
if(d2!=-1){
splay2(p->ch[d2],k);
if(d==d2)
rotate(o,d^1);
else
rotate(o->ch[d],d2^1);
}
rotate(o,d^1);
}
}
void build(double arr[],int l,int r,Node* &o){
if(l>r)return;
int mid=(l+r)/2;
o=new Node(arr[mid]);
build(arr,l,mid-1,o->ch[0]);
build(arr,mid+1,r,o->ch[1]);
o->maintain();
}
void remove(Node* &o){
if(o->ch[0]==NULL)o=o->ch[1];
else if(o->ch[1]==NULL)o=o->ch[0];
else
{
Node *right=o->ch[1];
splay2(o->ch[0],o->ch[0]->s);
Node *left=o->ch[0];
left->ch[1]=right;
left->maintain();
o=left;
}
}
Node *head;
int main()
{
int N;
scanf("%d",&N);
for(int i=1;i<=N;++i){
int a;
scanf("%d",&a);
++cnt[a];
B[i]=a+(0.000001)*(cnt[a]);
A[i]=B[i];
}
sort(B+1,B+1+N);
build(A,1,N,head);
for(int i=1;i<=N-1;++i)
{
splay(head,B[i]);
if(head->ch[0]!=NULL)head->ch[0]->tag=!head->ch[0]->tag;
printf("%d ",head->ls()+i);
remove(head);
}
printf("%d\n",N);
return 0;
}
洛谷P3165 [CQOI2014]排序机械臂 Splay维护区间最小值的更多相关文章
- 洛谷P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...
- [UVA1402]Robotic Sort;[SP2059]CERC07S - Robotic Sort([洛谷P3165][CQOI2014]排序机械臂;[洛谷P4402][Cerc2007]robotic sort 机械排序)
题目大意:一串数字,使用如下方式排序: 先找到最小的数的位置$P_1$,将区间$[1,P_1]$反转,再找到第二小的数的位置$P_2$,将区间$[2,P_2]$反转,知道排序完成.输出每次操作的$P_ ...
- P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1 ,并把左起第一个物品至 P1P_1P1 ...
- Luogu P3165 [CQOI2014]排序机械臂
先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...
- [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]\),以此类推.求 ...
- 1552/3506. [CQOI2014]排序机械臂【平衡树-splay】
Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. Output ...
- bzoj3506 [Cqoi2014]排序机械臂
bzoj3506 此题是一道比较简单的spaly题目. 用splay维护序列,将每个点排到对应的位置之后删除,这样比较容易区间翻转. 我的指针写法在洛谷上AC了,但在bzoj上RE. #include ...
- BZOJ3506/1502 [CQOI2014]排序机械臂
传送门 依然是一道splay的区间操作,需要注意的是要把下标离散化后来表示splay的节点,我不知道怎么搞所以索性弄了个$ValuetoNode$,看样子没什么问题, 感觉他那个传下标的方法太暴力了. ...
随机推荐
- 去除html标签 php
function my_html($string,$sublen =80){ $string = strip_tags($string); $string = preg_replace ('/\n/i ...
- GOF23设计模式之原型模式
GOF23设计模式之原型模式 1)通过 new 产生一个对象需要飞船繁琐的数据准备或访问权限,则可以使用原型模式. 2)就算 java 中的克隆技术,以某个对象为原型,复制出新的对象.显然,新的对象具 ...
- 【Codeforces 229B】Planets
[链接] 我是链接,点我呀:) [题意] [题解] 设dis[i]表示到达i号传送器的最早时刻. 显然,虽然有那么多的出发时刻的限制,但我们还是越早到越好的. 因为你到得越早,出发的时间肯定不会比到达 ...
- DBMS_SPACE包的使用
最近有朋友问到了DBMS_SPACE包的使用,也看了一下,大部分是关于dbms_space.space_usage的使用,space_usage这个过程的例子已经很多了,我也就不再多说了,除了这个过程 ...
- 手动编译java的package问题,及演示继承的基本实现
不用IDE,而直接用命令编译JAVA包,仔细看了下,作一个记录. 以下的URL值得收藏. http://www.aiuxian.com/article/p-2115485.html http://ww ...
- ASP.NET--MVC--伪静态
原文地址 以前伪静态很流行主要是为了SEO优化排名,现在搜索引擎对静态网站和动态网站的权重差不多了,就没有必要再伪静态了,个人意见,仅供参考. 有些客户要求设置静态的,为了完成需求,而且更简单的做法就 ...
- 阶梯博弈&POJ 1704
阶梯博弈: 先借用别人的一幅图片.(1阶梯之前还有一个0阶梯未画出) 阶梯博弈的最初定义是这样的:每一个阶梯只能向它的前一个阶梯移动本阶梯的点,直至最后无法移动的为输. 那么,利用NIM,只计算奇数级 ...
- ural 1707. Hypnotoad's Secret(线段树)
题目链接:ural 1707. Hypnotoad's Secret 题目大意:给定N和M,然后N组s0, t0, Δs, Δt, k,每组能够计算出k个星星的坐标:M组a0, b0, c0, d0, ...
- MySQL改动rootpassword的多种方法
方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newp ...
- JavaScript --晋级--优
https://zhuanlan.zhihu.com/p/23412169 总计划 JavaScript 教程 http://www.w3school.com.cn/js/ JavaScr ...