设f_if​i​​是第ii个前缀的逆序对数,p_ip​i​​是第ii个位置上的数,则f_i-f_{i-1}f​i​​−f​i−1​​是ii前面比p_ip​i​​大的数的个数.我们考虑倒着做,当我们处理完ii后面的数,第ii个数就是剩下的数中第f_i-f_{i-1}+1f​i​​−f​i−1​​+1大的数,用线段树和树状数组可以轻松地求出当前第kk个是11的位置,复杂度O(N \log N)O(NlogN).

  1 #define cn(i,p,q) for(int i=p;i<=q;i++)
2 #define cn1(i,p,q) for(int i=p;i>=q;i--)
3 #define pr(x) printf("%d\n",x)
4 #define prr(x) printf("%d",x)
5 #define prrr(x) printf(" %d",x)
6 #define sc(x) scanf("%d",&x)
7 #define scc(x) scanf("%lf",&x)
8 #define pr1(x) printf("%.2f\n",x)
9 #include<stdio.h>
10 #include<algorithm>
11 #include<iostream>
12 #include<string.h>
13 #include<stdlib.h>
14 #include<math.h>
15 int que(int l,int r,int k ,int s);
16 void build(int l,int r,int k);
17 void up(int k);
18 const int N=1e6+10;
19 int a[N];
20 int b[N];
21 int c[N];
22 int flag[N];
23 int main(void)
24 {
25
26 int n,j,i,k,p,q;
27 scanf("%d",&n);
28 while(n--)
29 {
30 scanf("%d",&k);
31 for(i=1; i<=k; i++)
32 {
33 scanf("%d",&a[i]);
34 }
35 c[1]=0;
36 for(i=2; i<=k; i++)
37 {
38 c[i]=a[i]-a[i-1];
39 }
40 build(1,k,0);
41 for(i=k; i>=1; i--)
42 {
43 int ff=i-c[i];
44 int ss=que(1,k,0,ff);
45 c[i]=ss;
46 }
47 printf("%d",c[1]);
48 for(i=2; i<=k; i++)
49 {
50 printf(" %d",c[i]);
51 }printf("\n");
52
53 }
54 return 0;
55
56 }
57 void build(int l,int r,int k)
58 {
59 if(l==r)
60 {
61 b[k]=1;
62 flag[l]=k;
63 return ;
64 }
65 build(l,(l+r)/2,2*k+1);
66 build((l+r)/2+1,r,2*k+2);
67 b[k]=b[2*k+1]+b[2*k+2];
68
69 }
70 int que(int l,int r,int k ,int s)
71 {
72 if(b[k]==s&&b[flag[r]]!=0)
73 {
74 b[flag[r]]=0;
75 up(flag[r]);
76 return r;
77 }
78 else if(b[k]<=s)
79 {
80 if(b[2*k+1]<s)
81 {
82 return que((l+r)/2+1,r,2*k+2,s-b[2*k+1]);
83 }
84 else if(b[2*k+1]==s)
85 {
86 return que(l,(l+r)/2,2*k+1,s);
87 }
88 }
89 else if(b[k]>s)
90 {
91 if(b[2*k+1]>=s)
92 {
93 return que(l,(l+r)/2,2*k+1,s);
94 }
95 else return que((l+r)/2+1,r,2*k+2,s-b[2*k+1]);
96 }
97
98 }
99
100 void up(int k)
101 {
102 int kk=(k-1)/2;
103 while(kk>=0)
104 {
105 b[kk]=b[2*kk+1]+b[2*kk+2];
106 if(kk==0)
107 {
108 break;
109 }
110 kk=(kk-1)/2;
111 }
112 }

hdu 5592 ZYB's Premutation(线段树优化)的更多相关文章

  1. Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  2. hdu 5592 ZYB's Premutation (权值线段树)

    最近在线段树的世界里遨游,什么都能用线段树做,这不又一道权值线段树了么. ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  3. HDU 5592——ZYB's Premutation——————【线段树单点更新、单点查询】

    ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  4. HDU - 5592 ZYB's Premutation (权值线段树)

    题意:给出序列前k项中的逆序对数,构造出这个序列. 分析:使用权值线段树来确定序列元素. 逆序对的数量肯定是递增的,从最后一个元素开始逆向统计,则\(a[i] - a[i-1]\)即位置i之前比位置i ...

  5. HDU 5592 ZYB's Premutation

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5592 题意: http://bestcoder.hdu.edu.cn/contests/contes ...

  6. BC 65 ZYB's Premutation (线段树+二分搜索)

    题目简述:有一个全排列,一直每个前缀区间的逆序对数,还原这个排列. fi记录逆序对数,pi记录该位置数值,则k=fi-f(i-1)表示前i-1个数比pi大的数的个数,那么只要在剩余元素求出按大小顺序第 ...

  7. HDU 5592 ZYB's Premutation(树状数组+二分)

    题意:给一个排列的每个前缀区间的逆序对数,让还原 原序列. 思路:考虑逆序对的意思,对于k = f[i] - f[i -1],就表示在第i个位置前面有k个比当前位置大的数,那么也就是:除了i后面的数字 ...

  8. HDU 5592 ZYB's Game 【树状数组】+【二分】

    <题目链接> 题目大意: 给你一个由1~n,n个数组成的序列,给出他们每个的前缀逆序数,现在要求输出这个序列. 解题分析: 由前缀逆序数很容易能够得到每个数的逆序数.假设当前数是i,它前面 ...

  9. hdu 3698 UVA1490 Let the light guide us 线段树优化DP

    题目链接 and 题目大意 hdu3698 但是 hdu的数据比较弱,所以在这luogu提交吧UVA1490 Let the light guide us 有一个\(n*m\)的平原,要求每行选一个点 ...

随机推荐

  1. Scrapy-Splash的安装和使用

    Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具. Scrapy-Splash的安装分为两部分.一个是Splash服务的安装,具体是通过Docker,安装之后,会启动一 ...

  2. SpringBoot Profiles 多环境配置及切换

    目录 前言 默认环境配置 多环境配置 多环境切换 小结 前言 大部分情况下,我们开发的产品应用都会根据不同的目的,支持运行在不同的环境(Profile)下,比如: 开发环境(dev) 测试环境(tes ...

  3. linux 实用指令搜索查找类

    linux 实用指令搜索查找类 目录 linux 实用指令搜索查找类 find指令 locate指令 grep指令和管道符号 | find指令 说明 从指定目录向下递归地遍历其各个子目录,将满足条件的 ...

  4. Kafka入门教程(一)

    转自:https://blog.csdn.net/yuan_xw/article/details/51210954 1 Kafka入门教程 1.1 消息队列(Message Queue) Messag ...

  5. db9串口接头的定义

    这个接头都是以公头为准,所有接头还是以公头去记. RS-232端(DB9公头/针型)引脚定义 2: RXD 3:TXD 5:GND 1/4/6:内部相链接 7/8   :内部相链接 1.RS-232端 ...

  6. 【Other】逻辑分析仪的使用(UART、SPI)

    首先上一张接线示意图 上方是UART的接线方式,下方则是SPI的 事实上,这样接就能收到信号了 如果是SPI,要设定自己为主机,UART则没有这个问题 下面来说明逻辑分析仪的界面设定 设定介绍完了 下 ...

  7. C++福尔摩斯的约会

    这道题的要求总结如下: 1.DAY 星期 大写字母:A B C D E F G2.HH 时 数字+大写字母 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M ...

  8. ComponentScan注解的使用

    在项目初始化时,会将加@component,@service...相关注解的类添加到spring容器中. 但是项目需要,项目初始化时自动过滤某包下面的类,不将其添加到容器中. 有两种实现方案, 1.如 ...

  9. java中的collection小结

    Collection 来源于Java.util包,是非常实用常用的数据结构!!!!!字面意思就是容器.具体的继承实现关系如下图,先整体有个印象,再依次介绍各个部分的方法,注意事项,以及应用场景.   ...

  10. [学习总结]4、Android的ViewGroup中事件的传递机制(一)

    本文主要针对dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent三个方法,通过简单的例子来简单的介绍下. 根据字面意思的理解,dispatchTo ...