HDU 5592 还原逆序数(树状数组+二分)
来源:互联网 发布:she候鸟 知乎 编辑:程序博客网 时间:2024/06/06 05:48
问题描述
ZYB有一个排列P,但他只记得P中每个前缀区间的逆序对数,现在他要求你还原这个排列.(i,j)(i<j)被称为一对逆序对当且仅当Ai>Aj
输入描述
第一行一个整数T表示数据组数。接下来每组数据:第一行一个正整数N,描述排列的长度.第二行N个正整数Ai,描述前缀区间[1,i]的逆序对数.数据保证合法.1≤T≤5,1≤N≤50000
输出描述
T行每行N个整数表示答案的排列.
输入样例
130 1 2
输出样例
3 1 2
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int maxn=50000+100;int a[maxn],pre[maxn],c[maxn],b[maxn];int n;void add(int x,int d){while(x<=n) {c[x]+=d;x+=x&(-x);}}int sum(int x){int ans=0;while(x>0) {ans+=c[x];x-=x&(-x);}return ans;}int main(){int t,i,j,l,r,num;scanf("%d",&t);while(t--) {memset(c,0,sizeof(c));scanf("%d",&n);pre[0]=0;for(i=1;i<=n;i++) {scanf("%d",&pre[i]);a[i]=pre[i]-pre[i-1];add(i,1);}for(i=n;i>0;i--) {l=1;r=n;while(l<=r) {int mid=(l+r)>>1;num=sum(n)-sum(mid);if(num<=a[i]) r=mid-1;else l=mid+1;}b[i]=l;add(l,-1);}for(i=1;i<=n;i++) {printf("%d",b[i]);if(i!=n) printf(" ");}printf("\n");}return 0;}
0 0
- HDU 5592 还原逆序数(树状数组+二分)
- 逆序数的还原详解 树状数组+二分
- 逆序数(树状数组)
- 【树状数组(逆序数)】hdu 3743 Frosh Week
- 【树状数组(逆序数)】hdu 1394 Minimum Inversion Number
- HDU 2838 (树状数组求逆序数)
- hdu 2838(树状数组求逆序数)
- hdu 3743(树状数组求逆序数)
- HDU-1541 Stars(树状数组+逆序数)
- HDU 1394 Minimum Inversion Number(树状数组+逆序数)
- hdu 2689 sort it (树状数组 逆序数)
- hdu 1394 Minimum Inversion Number(树状数组逆序数)
- hdu 1394 树状数组求逆序数
- hdu 1394(树状数组求逆序数)
- hdu 2689树状数组求逆序数
- hdu 5592 树状数组+二分
- 树状数组求解逆序数(SOJ2309)
- 树状数组求逆序数(模板)
- Java基础_03_Java数组
- 深度学习相关链接
- 虚拟机安装Ubuntu14.04共享查看Win7上共享的文件夹
- 一些知识点的初步理解_9(独立成分分析-ICA,ing...)
- Java中线程基本知识整理
- HDU 5592 还原逆序数(树状数组+二分)
- Android网络传输框架的核心代码量对比
- UDID和openUDID的区别
- 【java学习笔记s】线程1
- ObjC的initialize和init
- 10006---AngularJS 指令
- uva 563 Tree Recovery
- my blog
- 同余定理在编程中的应用