树状数组的应用(SOJ2559)
2014-03-21 20:35
197 查看
(2012-07-23 14:04:18)
SOJ2559:http://cstest.scu.edu.cn/soj/problem.action?id=2559
这道题是说对于给定的一个数组s求s[i]在前i个元素中的排名(从大到小)。
其实很简单,对于s[i]只需找出前i个元素中
题中的数据量为45000,对于每个元素的值没有具体的要求,只是为int型。
首先对数组s进行归一化(我自己的命名,很多人说是离散化,我觉得归一化更为恰当)处理,将数组中的元素值映射到1-45000上。
代码:
SOJ2559:http://cstest.scu.edu.cn/soj/problem.action?id=2559
这道题是说对于给定的一个数组s求s[i]在前i个元素中的排名(从大到小)。
其实很简单,对于s[i]只需找出前i个元素中
题中的数据量为45000,对于每个元素的值没有具体的要求,只是为int型。
首先对数组s进行归一化(我自己的命名,很多人说是离散化,我觉得归一化更为恰当)处理,将数组中的元素值映射到1-45000上。
代码:
#include<iostream> #include<algorithm> #include<cstring> using namespace std; struct node { int num; int rank; }s[45005]; int t[45005]; int c[45005]; int result[45005]; int n;///////////////////////////// int lowbit(int x) { return x&(x^(x-1)); } void mod(int i) { while(i<=n) { c[i]++; i+=lowbit(i); } } int sum(int i) { int SUM=0; while(i) { SUM+=c[i]; i-=lowbit(i); } return SUM; } bool cmp(node a,node b) { return a.num<b.num; } int main() { int i; while(scanf("%d",&n)==1) { memset(c,0,sizeof(c)); for(i=1;i<=n;i++) { scanf("%d",&s[i].num); s[i].rank=i; } sort(s+1,s+n+1,cmp); for(i=1;i<=n;i++) t[s[i].rank]=i; for(i=1;i<=n;i++) { result[i]=i-sum(t[i]); mod(t[i]); } for(i=1;i<=n;i++) printf("%d\n",result[i]); } return 0; }
相关文章推荐
- HDU 3874 Necklace 树状数组的应用
- 树状数组应用之——求逆序对
- hdu 2642 Stars--二维树状数组的应用
- HDU2838 Cow Sorting 树状数组 区间求和加逆序数的应用
- 浅谈树状数组求逆序对及离散化的几种方式及应用
- 树状数组的应用(区间修改,区间查询,多维树状数组)
- poj 2155 Matrix(树状数组的应用)
- hdu 2689 Sort it 一维树状数组的应用
- POJ 1656 二维树状数组简单应用
- 树状数组进阶应用:区间更新、区间最值查询
- 树状数组及其应用
- HDU 2642 Stars 简单二维树状数组应用
- 树状数组应用
- 树状数组的应用 Mega Inversions
- ACM集训——POJ2352---一维树状数组的应用
- 树状数组应用-冒泡排序的交换次数
- 树状数组与其应用(Python实现)(1)
- 树状数组_应用的代码
- 数据结构颓废计划II-树状数组的推广与应用
- hdu 5147 (树状数组的应用)