博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1552: [Cerc2007]robotic sort & BZOJ3506: [Cqoi2014]排序机械臂
阅读量:5255 次
发布时间:2019-06-14

本文共 1379 字,大约阅读时间需要 4 分钟。

【传送门:&】


简要题意:

  给出一个长度为n的序列,现在要将它们进行排序,排序的操作为:

  如果当前是第i次排序,则先找到当前序列中的最i小值所在位置x(如果有多个,则找到一开始给出序列顺序中排在最前面的数),然后将第i到第x的位置上的数都翻转

  求出每次操作中x的值


题解:

  splay裸题,树上记录最小值以及如果有多个最小值时初始位置最小的数在树上的位置,以及翻转标记

  然后每做完一次操作,就要把x从树中删掉就行了


参考代码:

#include
#include
#include
#include
#include
#define Maxn 110000#define INF 1<<30using namespace std;struct T{
int f,son[2],c,d,p,mp,mn;bool fz;T(){mn=INF;fz=false;}}tr[Maxn];int len;int rt,a[Maxn];void update(int x){ int lc=tr[x].son[0],rc=tr[x].son[1]; int mmin=min(tr[x].d,min(tr[lc].mn,tr[rc].mn)),t=INF; if(tr[x].d==mmin) if(t>tr[x].p) t=tr[x].p; if(tr[lc].mn==mmin) if(t>tr[lc].mp) t=tr[lc].mp; if(tr[rc].mn==mmin) if(t>tr[rc].mp) t=tr[rc].mp; tr[x].mn=mmin;tr[x].mp=t; tr[x].c=tr[lc].c+tr[rc].c+(tr[x].d!=INF);}int ins(int l,int r){ int mid=(l+r)/2; int now=++len; tr[now].d=a[mid];tr[now].p=mid; if(l
tr[x].p) t=tr[x].p; if(tr[lc].mn==mmin) if(t>tr[lc].mp) t=tr[lc].mp,x=lc; if(tr[rc].mn==mmin) if(t>tr[rc].mp) t=tr[rc].mp,x=rc; if(x!=lc&&x!=rc) break; } return x;}int main(){ int n; scanf("%d",&n); for(int i=2;i<=n+1;i++) scanf("%d",&a[i]);a[1]=a[n+2]=INF; len=0;rt=ins(1,n+2); for(int i=1;i<=n;i++) { int x=getmin(); splay(x,0); if(i

 

转载于:https://www.cnblogs.com/Never-mind/p/10154125.html

你可能感兴趣的文章
myeclipse自动设置类和方法的注释(快捷键)
查看>>
iOS 9应用开发基础教程下册
查看>>
Hard Disk Drive(MBR)
查看>>
Jenkins执行selenium报错unknown error: cannot find Chrome binary
查看>>
咱可以去伦敦~ 参加那个什么奥林匹克吗
查看>>
双绞线的标准接法
查看>>
一些有用的SQL Server语句和存储过程
查看>>
源码分享-纯CSS3实现齿轮加载动画
查看>>
10个常见的 Android 新手误区
查看>>
spring mvc配置文件简单实现
查看>>
eclipse安装反编译插件
查看>>
Farpoint使用一点小总结
查看>>
各种连接字符串
查看>>
P3295 [SCOI2016]萌萌哒
查看>>
P2115 [USACO14MAR]破坏Sabotage
查看>>
路由器开发(二)—— 路由器工作原理
查看>>
用户空间和内核空间通讯之【Netlink 上】
查看>>
sql语句 MySQL
查看>>
Could not find Developer Disk Image 9.3
查看>>
OO Unit 1 表达式求导
查看>>