标签:
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 49587 | Accepted: 18153 |
Description
Input
Output
Sample Input
5 9 1 0 5 4
3
1 2 3 0
Sample Output
6 0
第一道树状数组,求逆序数其实就是将数离散化一下然后插入从前完后插入树状数组或线段树中,同时统计一下前面比它大的数的个数,求和即可。
不过树状数组手写起来好简单。。。。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; const int INF=(1<<29); int n; ll a[maxn]; ll b[maxn],m; ll c[maxn]; int lowbit(int x) { return x&(-x); } ll sum(int p) { ll res=0; while(p>0){ res+=c[p]; p-=lowbit(p); } return res; } void add(int p,ll x) { while(p<=m){ c[p]+=x; p+=lowbit(p); } } int main() { while(cin>>n,n){ MS0(c); REP(i,1,n){ scanf("%I64d",&a[i]); b[i]=a[i]; } sort(b+1,b+n+1); m=unique(b+1,b+n+1)-(b+1); ll ans=0; REP(i,1,n){ int x=lower_bound(b+1,b+n+1,a[i])-b; add(x,1); ans+=sum(m)-sum(x); } printf("%I64d\n",ans); } return 0; }
poj2299 Ultra-QuickSort 树状数组求逆序数
标签:
原文地址:http://www.cnblogs.com/--560/p/4857366.html