洛谷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$,看样子没什么问题, 感觉他那个传下标的方法太暴力了. ...
随机推荐
- QT的creator中图示
不同的开发工具显示class和相关的用不同的图标表示.但大同小异.但对于QT的creator中图示确实不太好分.看图一目了然.
- 解决ExpressSpreadSheet 中文乱码问题[备查]
cxSpreadSheet和F1Book等都提供了类似Excel的操作, 但是相比F1Book, cxSpreadSheet的中文支持还不是很完善.在设置了wordbreak为true的时候,里面的中 ...
- 【Codeforces 350B】Resort
[链接] 我是链接,点我呀:) [题意] [题解] 我们可以把原图的边都反向一下. 然后以每个休息点作为起点,进行dfs. 每次在扩展节点y的时候,要求这个点y必须只有一个出度,然后就能走多远就走多远 ...
- mysql 7 种 join
一. select * from A inner join B on A.key = B.key 二. select * from A left join B on A.key = B.key 三. ...
- Spring Boot-整合redis(六)
redis安装 参考:https://www.cnblogs.com/LQBlog/p/9214517.html 单机版 1.添加pom依赖 <!-- Spring Boot Reids 依赖 ...
- 反射常用API
反射所有功能都是通过class API来实现的 class常用API有: 1.class.GETINTERFACES():获得这个类实现的接口. 2.class.getMethods() Method ...
- win7配置免安装mysql5.6.19过程具体解释
本文主要介绍免安装配置mysql5.6.19的过程,整个过程中自己出现非常多次失误,经过整理,现将一次可成功的过程记录下来,供大家參考. 准备 在mysq官网 http://dev.mysql.com ...
- Fitnesse Slim的使用
官网上的使用说明:http://www.fitnesse.org/FitNesse.UserGuide.WritingAcceptanceTests.Slim 本文主要介绍Slim常用的几种表格,更多 ...
- Webx框架:Spring Schema 和 Spring Ext
webx诞生的原因是当时市面上没有好用的web框架.如今的Web框架有非常多.然后它们背后的思想都是相似的,并且越来越趋同. Spring Schema 在传统的spring中,配置bean时须要手动 ...
- IOS UITextView光标位置在中间的问题
在viewDidLoad中 if ([selfrespondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) { se ...