设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. 设置administrator账号密码

    设置administrator账号密码: 打开:附件->运行 输入:lusrmgr.msc 在里面的用户里修改administrator密码

  2. 推荐一个latex简历模板的网站给大家

    http://www.rpi.edu/dept/arc/training/latex/resumes/ Using the LaTeX Resume Templates A group of resu ...

  3. Spark的shuffle和MapReduce的shuffle对比

    目录 MapperReduce的shuffle Spark的shuffle 总结 MapperReduce的shuffle shuffle阶段划分 Map阶段和Reduce阶段 任务 MapTask和 ...

  4. Spring Boot中使用Redis

    一.定义工程 创建一个spring boot模块 二.修改pom文件 在pom文件中添加Spring Boot与Redis整合依赖 <dependencies> <!--spring ...

  5. SQL查询:并集、差集、交集

    新建两个表进行测试: test_a ID name 1 曹操 2 郭嘉 3 孙权 4 周瑜 test_b ID name 1 刘备 2 关羽 3 张飞 4 孙权 5 周瑜 1.UNION形成并集 UN ...

  6. springmvc中的异常处理方法

    //1.自定义异常处理类       2.编写异常处理器    3.配置异常处理器 package com.hope.exception;/** * 异常处理类 * @author newcityma ...

  7. 如何利用EL表达式获取list,map,对象等值

    <%@ page import="com.hopetesting.domain.User" %><%@ page import="java.util.* ...

  8. 1945-祖安 say hello-String

    1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include<bits/stdc++.h> 3 char str[100][40]; 4 char s[10 ...

  9. 【C++】最长回文子串/动态规划

    ACM #include <bits/stdc++.h> using namespace std; const int maxn = 1010; char S[maxn]; int dp[ ...

  10. shell脚本 批量查看mysql表条目数

    一.简介 源码地址 日期:2018/4/12 介绍:查看mysql的信息,用于比对和查询条目数 效果图: 二.使用 适用:centos6+ 语言:中文 注意:适用于5.7版本,其它版本要更改变量han ...