HDU5592(线段树+二分)
来源:互联网 发布:ip网络广播软件源文件 编辑:程序博客网 时间:2024/06/05 00:16
***********************************************声明******************************************************
原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。
由于各种原因,可能存在诸多不足,欢迎斧正!
*********************************************************************************************************
ZYB's Premutation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 838 Accepted Submission(s): 403
Problem Description
restore the premutation.
Pair
Input
In the first line there is the number of testcases T.
For each teatcase:
In the first line there is one numberN .
In the next line there areN numbers Ai ,describe the number of the reverse logs of each prefix,
The input is correct.
1≤T≤5 ,1≤N≤50000
For each teatcase:
In the first line there is one number
In the next line there are
The input is correct.
Output
For each testcase,print the ans.
Sample Input
130 1 2
Sample Output
3 1 2
Source
BestCoder Round #65
本题要求根据每个位置逆序数的累计个数,还原数列。可以从后往前推,求出当前位置元素ans[i]的前面有多少元素比他大或比他小,ans[i]=log[i]-log[i-1,注意边界的处理,但时,只知道前面比他大或比他小的元素是不能准确定位元素大小的,还得知道后面比他大或比他小的元素。
1)、前面比他大或小的元素个数可以通过反向遍历O(n)求出。
2)、后面比他大或小的元素个数可以通过在某个数组中标价,然后通过二分结合某个快速求区间和的算法-线段树得出,时间复杂度O(log(N))^2
这样一来,总的时间复杂度为O(N*log(N)) .好久没做题,在没有模板的情况下一棵线段树和二分求第一个等于某个元素的代码调试了很久,看来以后得多敲敲这类基础代码,而不是一味的堆积业务代码,哈哈。
#include<cstdio>#include<cstring>#define MAXN 50000+10int log[MAXN];int ans[MAXN];struct treeNode{int l,r,sum;}tree[MAXN*3];void build(int id,int l,int r){tree[id].l=l,tree[id].r=r;if(l==r){tree[id].sum=1;return ;}int mid=(l+r)>>1;build(id<<1,l,mid);build(id<<1|1,mid+1,r);tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;}void update(int pos,int id,int val){if(tree[id].l==tree[id].r){tree[id].sum+=val;return ;}int mid=(tree[id].l+tree[id].r)>>1;if(pos<=mid){update(pos,id<<1,val);}else{update(pos,id<<1|1,val);}tree[id].sum=tree[id<<1].sum+tree[id<<1|1].sum;}int query(int l,int r,int id){if(tree[id].l==l&&tree[id].r==r){return tree[id].sum;}int mid=(tree[id].l+tree[id].r)>>1;if(r<=mid){return query(l,r,id<<1);}else if(l>mid){return query(l,r,id<<1|1);}return query(l,mid,id<<1)+query(mid+1,r,id<<1|1);}int main(){int t;scanf("%d",&t);while(--t){memset(tree,MAXN*sizeof(int),0);int n;scanf("%d",&n);log[0]=0;for(int i=1;i<=n;++i){scanf("%d",&log[i]);}build(1,1,n);for(int j=n;j>0;--j){int tmp=j-(log[j]-log[j-1])-1;int l=1,r=n;while(l<r){int mid=(l+r)>>1;//printf("tmp=%d mid=%d l=%d r=%d\n",tmp,mid,l,r);if(query(l,mid,1)<=tmp){l=mid+1;}else{r=mid;}}ans[j]=l;//printf("%d \n",l);update(ans[j],1,-1);}for(int k=1;k<=n;++k){printf("%d ",ans[k]);}printf("\n");}return 0;}
0 0
- HDU5592(线段树+二分)
- HDU5592(线段树)
- hdu5592 线段树
- hdu5592
- hdu5592
- hdu3564(二分+线段树)
- hdu4614 二分+线段树
- hdu5217Brackets【线段树,二分】
- 【HDU4614】【线段树】【二分】
- HDU4791(线段树+二分)
- Codeforces460C【二分+线段树】
- hdu6070 二分+线段树
- HDU6070 二分 线段树
- hdu6070 线段树+二分
- UVA12663 线段树+二分
- poj2182 线段树/线段数组+二分搜索
- hdu 4339 线段树+二分
- hdu 4614 线段树+二分~
- 千里码第一题
- 使用 Navicat111_premium 将 oracle 数据库迁移到 mysql
- iOS NSUserDefaults
- ASIHTTPRequest 提示#import <libxml/HTMLparser.h>找不到
- 【视频】Excel2013十大企业级明星函数视频课程【精讲】
- HDU5592(线段树+二分)
- iOS中int,float怎么保存在NSMutableArray中
- 简单的数据查询
- 设计模式里的多态,答疑
- nagios插件之监控文件更新时间
- java集合框架中的数据结构
- adb命令集合
- git客户端命令常用操作
- Quartz2D---苹果官方的⼆维绘图引擎(绘制基本图形)