HDU 5592 ZYB's Premutation
题目链接:
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的更多相关文章
- hdu 5592 ZYB's Premutation (权值线段树)
最近在线段树的世界里遨游,什么都能用线段树做,这不又一道权值线段树了么. ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others) Mem ...
- HDU 5592——ZYB's Premutation——————【线段树单点更新、单点查询】
ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...
- HDU 5592 ZYB's Premutation(树状数组+二分)
题意:给一个排列的每个前缀区间的逆序对数,让还原 原序列. 思路:考虑逆序对的意思,对于k = f[i] - f[i -1],就表示在第i个位置前面有k个比当前位置大的数,那么也就是:除了i后面的数字 ...
- HDU - 5592 ZYB's Premutation (权值线段树)
题意:给出序列前k项中的逆序对数,构造出这个序列. 分析:使用权值线段树来确定序列元素. 逆序对的数量肯定是递增的,从最后一个元素开始逆向统计,则\(a[i] - a[i-1]\)即位置i之前比位置i ...
- hdu 5592 ZYB's Premutation(线段树优化)
设f_ifi是第ii个前缀的逆序对数,p_ipi是第ii个位置上的数,则f_i-f_{i-1}fi−fi−1是ii前面比p_ipi大的数的个数.我们考虑倒着做,当我们处理 ...
- 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 ...
- HDU 5592 ZYB's Game 【树状数组】+【二分】
<题目链接> 题目大意: 给你一个由1~n,n个数组成的序列,给出他们每个的前缀逆序数,现在要求输出这个序列. 解题分析: 由前缀逆序数很容易能够得到每个数的逆序数.假设当前数是i,它前面 ...
- ZYB's Premutation(有逆序数输出原序列,线段树)
ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
随机推荐
- A-Frame_简单介绍
VR框架A-Frame: https://aframe.io 版本: 0.2.0 30/6/2016 A-Frame 是一个能够实现在web网页上实现3D和VR体验的开源框架,它是由 MozVR ...
- 初识 css3中counter属性
最近看到counter属性,好奇是做什么用的,于是去查了查. 1.简单介绍 counter是为css中插入计数器.[注明]在CSS2.1中counter()只能被使用在content属性上.关于浏览器 ...
- EF 只更新部分字段
/// 只更新storedAddress数据中的DefaultAddress字段,更新为false /// 将默认地址改为不是默认地址 /// </summary> /// <par ...
- ASP.NET基础笔记
MSDN: ...
- 惊曝6.24AppCan移动开发大会参展名录,现场礼品超多!
AppCan移动开发者大会召开在即, 诸位参展商准备就绪, 移动圈的半边天都来了, 现场活动和礼品多到爆炸, 请大家一一过目! 排名不分先后,AppCan不偏心! 1.极验验证 首创滑动式拼图验证码. ...
- OpenStack:安装Glance
>安装Glance1. 安装# apt-get install glance python-glanceclient删除sqlite文件rm -f /var/lib/glance/glance. ...
- web安全之token
Token,就是令牌,最大的特点就是随机性,不可预测.一般黑客或软件无法猜测出来. 那么,Token有什么作用?又是什么原理呢? Token一般用在两个地方: 1)防止表单重复提交. 2)anti c ...
- Ubuntu 12.04 Desktop安装XAMPP
1/打开终端 在Dash里搜索.打开Dash,在里面搜索“gnome-terminal”,就可以找到终端应用序.快捷键Ctrl+Alt+L也可以,不过如果是虚拟机的话可能会有问题. 如果想以后快捷打开 ...
- iOS 进阶 第十四天(0416)
0416 注意调用关系,如下图: 就是initWithCoder:.initWithFrame.setup方法三元组
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...