【bzoj3506/1552】【robotic sort】【splay】
发布日期:2021-11-16 15:38:40 浏览次数:8 分类:技术文章

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

Description

Input

输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000。第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号。

Output

输出共一行,N个用空格隔开的正整数P1,P2,P3…Pn,Pi表示第i次操作前第i小的物品所在的位置。 注意:如果第i次操作前,第i小的物品己经在正确的位置Pi上,我们将区间[Pi,Pi]反转(单个物品)。

Sample Input

6
3 4 5 1 6 2

Sample Output

4 6 4 5 6 6
题解:splay维护区间最小值以及最小值的位置。
因为有相等的权值所以一开始排一遍序即可。
代码:
#include
#include
#include
#include
#define N 100010#define inf 2100000000using namespace std;int n,rev[N],c[N][3],d[N],sz,rt,v[N],size[N],fa[N],mn[N],pos[N],ans[N],s[N];struct use{int v,p;}a[N];bool cmp(use a,use b){return a.v
r) return; if (l==r){ int now=l,pre=f;fa[now]=pre; if (l
>1,now=mid,pre=f; build(l,mid-1,mid);build(mid+1,r,mid); fa[now]=pre;v[now]=mn[now]=a[now].v; pos[now]=now;update(now); if (mid
=rank) return find(l,rank); else return find(r,rank-size[l]-1); }int query(int l,int r){ int x=find(rt,l),y=find(rt,r+2); //cout<
<<' '<
<
>1; //for (int i=1;i<=n+2;i++) cout<
<

转载地址:https://blog.csdn.net/sunshinezff/article/details/51067338 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【bzoj2563】【阿狸和桃子的游戏】【贪心】
下一篇:【bzoj3444】【最后的晚餐】【组合数学】

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月01日 17时38分21秒