HDU5592(线段树)
2015-12-05 23:18
357 查看
题目大意:给你一个序列,表示在这个位置以及之前,有p[i]个逆序对,求此序列。
#include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<iostream> #include<set> #include<map> #include<queue> #include<stack> using namespace std; #define lson o<<1,l,m #define rson o<<1|1,m+1,r const int maxn=55555; int a[maxn<<2],ans[maxn<<2]; int sum[maxn<<2]; void pushup(int o) { sum[o]=sum[o<<1]+sum[o<<1|1]; } void build(int o,int l,int r) { if(l==r) { sum[o]=r-l+1; return; } int m=(l+r)>>1; build(lson); build(rson); pushup(o); } int query(int o,int l,int r,int k) { if(l==r) { sum[o]=0; return l; } int res; int m=(l+r)>>1; if(sum[o<<1|1]>=k) res=query(rson,k); else res=query(lson,k-sum[o<<1|1]); pushup(o); return res; } int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); a[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } build(1,1,n); for(int i=n;i>=1;i--) { int x=a[i]-a[i-1]; ans[i]=query(1,1,n,x+1); } for(int i=1;i<=n;i++) { printf("%d%c",ans[i],(i==n)?'\n':' '); } } return 0; }
相关文章推荐
- UVa101-The Blocks Problem/STL-Vector的使用
- constant
- Struts2常用标签总结
- RedHat7安装Tomcat
- 七、常量指针和指针常量
- r语言数据处理(三)
- Qt 设置鼠标
- 栈的java实现和栈的应用
- ZYB's Biology
- 闪退捕捉办法
- 集体智慧编程笔记:物品推荐过程小结
- WinDbg学习笔记
- 解决Java调用Azure SDK证书错误javax.net.ssl.SSLHandshakeException
- Iterator
- oracle创建表空间及用户赋予权限
- OutputStream
- mybatis(12) spring和mybatis整合
- ORL人脸数据库
- xxOutputStream xxInputStream
- pil