hdu 2492 离散化,树状数组,逆序数
2014-04-17 21:31
489 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2492
题目大意:给出n 个数的序列,枚举一个数,然后查找该数 左边大于它的数的个数 a 和小于他的数的个数 b ,查找右边大于他的数的个数 c 和小于他的数的个数 d 。
最后,res = a * d + b * c ; 其实就是一个查找逆序数的过程。
可以用树状数组,和线段树解决。
这里要注意一点,如果给出的数据比较大的情况,数组无法开到这么大,可以用离散化的思想,把数组转化成一个较小的数组。
树状数组:
题目大意:给出n 个数的序列,枚举一个数,然后查找该数 左边大于它的数的个数 a 和小于他的数的个数 b ,查找右边大于他的数的个数 c 和小于他的数的个数 d 。
最后,res = a * d + b * c ; 其实就是一个查找逆序数的过程。
可以用树状数组,和线段树解决。
这里要注意一点,如果给出的数据比较大的情况,数组无法开到这么大,可以用离散化的思想,把数组转化成一个较小的数组。
树状数组:
#include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #include<cstring> using namespace std; # define N 400000 int inf = 100000000; int maxx ,b ,c ; int lmin ,lmax ,rmin ,rmax ; int n; struct A { int v,index; }a[400000]; int cmp(A p1, A p2) { return p1.v < p2.v; } int lowbit(int x) { return x & (-x); } void update(int x, int y) { while(x <= n) { c[x] += y; x += lowbit(x); } } int getsum(int x) { int ans = 0; while(x > 0) { ans += c[x]; x -= lowbit(x); } return ans; } int main() { int T,i; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(c,0,sizeof(c)); for(i =1 ; i <= n; i++)//离散化 { scanf("%d",&a[i].v); a[i].index = i; } sort(a+1,a+n+1,cmp); for(i = 1; i <= n; i++) b[a[i].index] = i;//离散化 for(i = 1; i <= n; i++) { lmin[i] = getsum(b[i]); lmax[i] = i - lmin[i] - 1; update(b[i],1); } memset(c,0,sizeof(c)); for(i = n; i > 0; i--) { rmin[i] = getsum(b[i]); rmax[i] = n-i - rmin[i]; update(b[i],1); } long long res = 0;//第一次 WA 就是因为这个地方,定义的时候用了int for(i = 1; i <= n; i++) res += lmin[i] * rmax[i] + lmax[i] * rmin[i]; printf("%I64d\n",res); } return 0; }
相关文章推荐
- POJ 3928 & HDU 2492 Ping pong(树状数组求逆序数)
- hdu 2492 Ping pong 树状数组 求逆序数
- 【树状数组】hdu 4911 Inversion(离散化+树状数组求逆序数)
- hdu 2492树状数组
- HDU 3743 (树状数组,离散化)
- POJ 3928 & hdu 2492 & Uva1428 PingPong 【树状数组】
- HDU 5877 Weak Pair DFS + 树状数组 + 其实不用离散化
- HDU 2492 pingpang(树状数组)
- hdu 2689 sort it(树状数组 逆序数)
- hdu_2227_Find the nondecreasing subsequences_树状数组,离散化
- 反向树状数组 + 离散化 HDU 5372
- HDU-5877-Weak Pair【树状数组】【离散化】【DFS】【2016大连网络】【好题】
- HDU - 4911 - Inversion(树状数组逆序数+离散化)
- HDU-2492-Ping pong(树状数组)
- poj2299 Ultra-QuickSort&&NYOJ117 求逆序数 (树状数组求逆序对数+离散化)+(归并排序)
- HDU 2492 Ping pong (树状数组)
- hdu_2227_Find the nondecreasing subsequences_树状数组,离散化
- poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)
- hdu 5196 DZY Loves Inversions(树状数组,二分法,逆序数)
- POJ 2299 Ultra-QuickSort(树状数组+离散化—求逆序数)