洛谷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$,看样子没什么问题, 感觉他那个传下标的方法太暴力了. ...
随机推荐
- 5、SpringBoot+MyBaits+Maven+Idea+pagehelper分页插件
1.为了我们平时方便开发,我们可以在同一个idea窗口创建多个项目模块,创建方式如下 2.项目中pom.xm文件的内容如下 <?xml version="1.0" encod ...
- SCU - 4110 - PE class
先上题目: 4110: PE class Submit your solution Discuss this problem Best solutions Description ...
- [bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp
最大子矩阵 bzoj-1084 SCOI-2005 题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大. 注释:$1\le n \le 100$,$1\le m\le 2 ...
- Python学习-生成器 - Generator
简单来说,generator是一个能够返回迭代器对象的函数. yield的使用: 在python中,当你定义一个函数,使用了yield关键字时,这个函数就是一个生成器,它的执行会和其他普通的函数有很多 ...
- IPC总结学习
写的不错. http://www.cnblogs.com/CheeseZH/p/5264465.html IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存储.Socket.S ...
- POJ 1155
很久以前做的树形DP题,今天再遇到时,竟然不会了,所以写写.. 设数组: prf[MAX][MAX],cost[MAX],sum[MAX].分别表示,在第i个结点为根的子树内的情况下,若有j个用户申请 ...
- 【solr基础教程之中的一个】Solr相关知识点串讲
Solr是Apache Lucene的一个子项目.Lucene为全文搜索功能提供了完备的API.但它仅仅作为一个API库存在.而不能直接用于搜索. 因此,Solr基于Lucene构建了一 ...
- Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位
<Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位> Android本身的ListView拉到顶部或者底部会在顶部/底部边缘间隙出现一道"闪光&quo ...
- Linux命令(七)——网络配置和网络通信
在使用网络前,需要对linux主机进行基本的网络配置,配置后可以使该主机能够同其他主机进行正常的通信. 一.网络配置 1.ifcfg-ethn网络配置文件 所有的网络接口配置文件均存放在/etc/sy ...
- 坚向的ViewPager,上下滑动的组件,android上下滑动 VerticalPager
package com.zhulin.android.atools; import android.content.Context; import android.util.AttributeSet; ...