poj2299离散化,树状数组
2016-08-27 17:31
274 查看
求序列正序对的个数
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=500005; long long a[maxn],data[maxn]; int c[maxn]; int n; void lisan()//离散化 { memset(data,0,sizeof(data)); for(int i=0;i<n;i++) data[i]=a[i]; sort(data,data+n); int cc=unique(data,data+n)-data; for(int i=0;i<n;i++) a[i]=1+lower_bound(data,data+cc,a[i])-data; } int lowbit(int x) { return x&-x; } void update(int x,int add) { while(x<=maxn) { c[x]+=add; x+=lowbit(x); } } long long sum(int x) { long long ret=0; while(x) { ret+=c[x]; x-=lowbit(x); } return ret; } int main() { while(~scanf("%d",&n)&&n) { memset(c,0,sizeof(c)); for(int i=0;i<n;i++) { scanf("%lld",&a[i]); } lisan(); // for(int i=0;i<n;i++) // cout<<a[i]<<endl; long long ans=0; for(int i=0;i<n;i++) { update(a[i],1); ans+=(i+1-sum(a[i])); //cout<<i-sum(a[i]-1)-1<<endl; } printf("%lld\n",ans); } return 0; }
相关文章推荐
- POJ-2299 Ultra-QuickSort(树状数组)(离散化)
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)
- POJ 2299 Ultra-QuickSort【树状数组+离散化】
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)
- poj 2299(离散化+树状数组)
- poj 2299 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(归并排序)||(树状数组+离散化)
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)
- POJ 2299 Ultra-QuickSort (离散化+树状数组)
- POJ 2299 Ultra-QuickSort (求逆序数:离散化+树状数组或者归并排序求逆序数)
- poj 2299 Ultra-QuickSort(归并排序)||(树状数组+离散化)