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 ...
随机推荐
- Mysql授权GRANT ALL PRIVILEGES
1. 改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 " ...
- MySQL语法
sql(structure query language)结构化查询语言ansi iso/iec组织制定ddl(data definition language) 数据定义语言dml(manipula ...
- PL/SQL Developer使用
查询存储过程方法:1.右上角小百页 - 新建SQL窗口 - 复制存储过程名称 - 按住CTRL - 点击链接进入2.点击查询按钮(望远镜) - 文本查找输入名称 - 对象类型默认(函数.过程,包说明, ...
- PHP中数据库的连接
<?php //1.链接MySQL服务器 $conn = mysql_connect("localhost", "root" , 199452); //2 ...
- ASP.NET中Server对象的几个方法
HtmlDecode 已重载. 对已被编码以消除无效 HTML 字符的字符串进行解码.HtmlEncode 已重载. 对要在浏览器中显示的字符串进行编码.MapPath 返回与 Web 服务器上的指定 ...
- 《第一行代码--Android》阅读笔记之Activity
1.BaseActivity里面可以干什么 定义一个Context定义一个TAG 记录当前的Activity名字getClass().getSimpleName(); 2.Activity里面的几个重 ...
- Cassandra 有限分页策略
瀑布式分页 如果你的应用只需要瀑布式的分页,那么,Cassandra可以很好的支持,不过记得要指定好排序顺序. CLUSTERING ORDER BY (add_time DESC); 常见的分页,跳 ...
- Head First-策略模式
策略模式,什么是策略模式,定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 下面我们就用鸭子来诠释一下策略模式,鸭子有两种行为呱呱叫和飞,但是并不是所有的鸭 ...
- 自定义DatePicker,年月日,不显示其中某几项
经过源码研究:该结构主要包含三个NumberPicker: private final NumberPicker mDayPicker; private final NumberPicker mMon ...
- c++ 类与函数中static变量初始化问题(转)
首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数: void Foo() { ; // initialize std::cout << a; a++; } 里的 ...