题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5592

题意:

http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=654&pid=1003

题解:

对给的n个数做差分,即a[i]=a[i]-a[i-1],然后对做完差分之后的数组从后往前扫一遍(最后一个数就是代表整个序列中比它大的数有a[n-1]个,即,它是第a[n-1]+1大的数),每次求还未求出的数中的第(a[i]+1)大(第1大就是最大的意思)。

代码:

线段树:

 #include<iostream>
#include<cstdio>
#include<cstring>
#define lson (o<<1)
#define rson ((o<<1)|1)
#define M (l+(r-l)/2)
using namespace std; const int maxn=+; int n,arr[maxn],ans[maxn]; int sumv[maxn<<]; void build(int o,int l,int r){
if(l==r){
sumv[o]=;
}else{
build(lson,l,M);
build(rson,M+,r);
sumv[o]=sumv[lson]+sumv[rson];
}
} int _ret;
void query(int o,int l,int r,int k){
if(l==r){
_ret=l;
sumv[o]=;
}else{
if(sumv[rson]>=k) query(rson,M+,r,k);
else query(lson,l,M,k-sumv[rson]);
sumv[o]=sumv[lson]+sumv[rson];
}
} int main(){
int tc;
scanf("%d",&tc);
while(tc--){
scanf("%d",&n);
build(,,n);
for(int i=;i<n;i++) scanf("%d",arr+i);
for(int i=n-;i>;i--) arr[i]-=arr[i-];
for(int i=n-;i>=;i--){
query(,,n,arr[i]+);
ans[i]=_ret;
}
for(int i=;i<n-;i++) printf("%d ",ans[i]);
printf("%d\n",ans[n-]);
}
return ;
}

二分+树状数组:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M (low+(hig-low)/2)
using namespace std; const int maxn=+; int n,arr[maxn],ans[maxn]; int sumv[maxn]; void add(int p,int x){
while(p<=n){
sumv[p]+=x;
p+=p&(-p);
}
} int sum(int p){
int ret=;
while(p>){
ret+=sumv[p];
p-=p&(-p);
}
return ret;
}
//lower_bound
int solve(int k){
int low=,hig=n;
while(low+<hig){
if(sum(M)<k) low=M;
else hig=M;
}
add(hig,-);
return hig;
} void init(){
memset(sumv,,sizeof(sumv));
} int main(){
int tc;
scanf("%d",&tc);
while(tc--){
scanf("%d",&n);
init();
for(int i=;i<=n;i++) add(i,);
for(int i=;i<n;i++) scanf("%d",arr+i);
for(int i=n-;i>;i--) arr[i]-=arr[i-];
for(int i=n-;i>=;i--){
ans[i]=solve(i+-arr[i]);
}
for(int i=;i<n-;i++) printf("%d ",ans[i]);
printf("%d\n",ans[n-]);
}
return ;
}

HDU 5592 ZYB's Premutation的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. hdu 5592 ZYB's Premutation(线段树优化)

    设f_if​i​​是第ii个前缀的逆序对数,p_ip​i​​是第ii个位置上的数,则f_i-f_{i-1}f​i​​−f​i−1​​是ii前面比p_ip​i​​大的数的个数.我们考虑倒着做,当我们处理 ...

  7. hdu 5592 ZYB's Game 树状数组

    ZYB's Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=55 ...

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

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

  9. ZYB's Premutation(有逆序数输出原序列,线段树)

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

随机推荐

  1. c3p0配置xml

    c3p0-config.xml <c3p0-config> <default-config> <property name="automaticTestTabl ...

  2. Windows服务中用Timer和线程两种方式来执行定时任务

    在Service服务文件夹下新建Windows服务 - TestService

  3. c# dataset 索引0没有值

    datatable绑定到dataGrieView,在刷新datatable的数据时,常会bug:索引0没有值或索引(int)x没有值 昨天弄了一个下午,发现bug原因: dataGridView中有数 ...

  4. aspx页面与服务器控件间运行原理

    一.进入服务器控件以及aspx页面前,必须的准备: a)在WebForm 中只要带有runat="server" 那么那就是一个控件. b)如果form有runat="s ...

  5. 【转】CSS white-space 属性

    定义和用法 white-space 属性设置如何处理元素内的空白. 这个属性声明建立布局过程中如何处理元素中的空白符.值 pre-wrap 和 pre-line 是 CSS 2.1 中新增的. 默认值 ...

  6. 10)Java Error and Exception

      1>异常继承类        Error类和Exception类都继续自Throwable类      Error表示系统级的错误情况,如内存错误这样程序无法通过自身的处理再继续执行下去的情 ...

  7. Android开发之Source无法覆写public void onClick(View v)

    初学Android开发,在为一个按钮[该按钮继承OnClickListener()]写监听时,发现无法在Source中引入public void onClick(View v),当时非常纳闷,平常情况 ...

  8. DBGridEh 点击表头排序方法

    方法1: (不用编程写代码) 程序中引用 单元 EhLibCDS设置DBGridEh的属性:      ColumnDefValues.Title.TitleButton = True      Op ...

  9. pure css兼容IE

    <!--[if lte IE 8]> <link rel="stylesheet" href="pure/0.5.0/grids-responsive- ...

  10. 【微信平台&后台管理】第一个外包项目:XX科技城微信平台项目总结

    苍天有眼啊,学了半年的网站开发终于派上用处,终于能赚钱了啊. 这个项目是和学长一起做的,项目的甲方是大庆某房地产土豪,项目要求就是搭建一整套的微信平台和微信平台管理系统,具体要求就是:回复关键字能拿到 ...