poj 2299 Ultra-QuickSort(利用树状数组变形,求一个数左边比它大的数的个数)
2012-08-06 12:27
369 查看
代码:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int tree[1001000],b[1001000],n; struct node { int value,no; }arr[1001000]; int cmp(node x,node y) { return x.value<y.value; } int LowBit(int x) { return x&(-x); } __int64 GetSum(int x) { __int64 temp=0; for(int i=x;i<=n;i+=LowBit(i)) temp+=tree[i]; return temp; } void UpDate(int x,int c) { for(int i=x;i>=1;i-=LowBit(i)) tree[i]+=c; } int main() { while(scanf("%d",&n)!=EOF && n!=0) { memset(tree,0,sizeof(tree)); for(int i=1;i<=n;i++) { scanf("%d",&arr[i].value); arr[i].no=i; } sort(arr+1,arr+1+n,cmp); for(int i=1;i<=n;i++) { arr[arr[i].no].value=i; } for(int i=1;i<=n;i++) { b[i]=GetSum(arr[i].value); UpDate(arr[i].value,1); } __int64 ans=0; for(int i=1;i<=n;i++) ans+=b[i]; printf("%I64d\n",ans); } system("pause"); return 0; }
相关文章推荐
- POJ Ultra-2299 QuickSort 【离散化+树状数组】
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
- poj2299 Ultra-QuickSort(树状数组求逆序数,离散化)
- POJ 2299 Ultra-QuickSort (树状数组求逆序数 || 线段树 +离散化)
- POJ:2299 Ultra-QuickSort(树状数组+离散化+技巧+求逆序对)
- poj 2299 Ultra-QuickSort (树状数组)
- POJ 2299 Ultra-QuickSort(归并排序 || 树状数组 || 线段树)
- POJ 2299 Ultra-QuickSort [树状数组做法]
- Ultra-QuickSort (poj 2299 归并排序 || 树状数组 求逆序对)
- POJ 2299 Ultra-QuickSort(离散化+树状数组求逆序对)
- POJ[2299]Ultra-QuickSort 逆序对:线段树||树状数组||分治
- POJ 2299 Ultra-QuickSort(树状数组+离散化)
- poj - 2299 - Ultra-QuickSort(树状数组)
- poj 2299 Ultra-QuickSort (树状数组求逆序数)
- POJ 2299 Ultra-QuickSort (树状数组)
- POJ 2299 Ultra-QuickSort(树状数组+离散化)
- POJ 2299 Ultra-QuickSort 求逆序数 树状数组
- poj 2299 Ultra-QuickSort 【线段树 or 线段树+lazy or 树状数组 or 归并排序】 求逆序对
- poj 2299 Ultra-QuickSort(数学:求逆序数||数据结构:树状数组)