POJ 2299 再水一发数状数组求逆序数

来源:互联网 发布:毕业去向地图制作软件 编辑:程序博客网 时间:2024/06/05 09:52

这道题用 map 来离散化又T了。。想起来了有一次 CF 怕直接开数组过大使用 map 结果T了的悲剧故事。。。

能用数组 hash 的坚决不用 map

#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<map>using namespace std;#define ll long long ll bit[1000000];#define P pair<ll,ll>#define fst first#define sec secondll n;void add(ll x,ll i){while(i<=n){bit[i]+=x;i+=i&(-i);}}ll sum(ll i){ll ans=0;while(i>0){ans+=bit[i];i-=i&(-i);}return ans;}P num[1000000];ll tnum[1000000];int main(){freopen("acm.in","r",stdin);while(scanf("%lld",&n)!=EOF&&n!=0){memset(bit,0,sizeof(bit));memset(tnum,0,sizeof(tnum));for(int i=1;i<=n;i++){scanf("%lld",&num[i].fst);num[i].sec=i;}sort(num+1,num+1+n);for(int i=1;i<=n;i++)tnum[num[i].sec]=i;long long ans=0;for(int i=1;i<=n;i++){int index=tnum[i];ans+=sum(index-1);add(1,index);}cout<<n*(n-1)/2-ans<<endl;}return 0;}

 

0 0