求一串序列相邻连个元素交换多少后,是一串上升的序列。
思路:求该串序列的逆序数,数据比较大,要离散化。
AC代码:
#include<stdio.h> #include<string.h> #include<set> #include<map> #include<algorithm> #define ll __int64 using namespace std; const ll maxn=500010; ll n,c[maxn],a[maxn]; struct node { ll val,id; }; struct node p[maxn]; ll lowbit(ll x) { return x&(-x); } void update(ll x,ll i) { while(x<=n) { c[x]+=i; x+=lowbit(x); } } ll sum(ll x) { ll ret=0; while(x>0) { ret+=c[x]; x-=lowbit(x); } return ret; } bool cmp(node a,node b) { return a.val<b.val; } int main() { ll i; while(scanf("%I64d",&n)!=EOF,n) { memset(a,0,sizeof a); memset(c,0,sizeof c); for(i=1;i<=n;i++) { scanf("%I64d",&p[i].val); p[i].id=i; } sort(p+1,p+n+1,cmp); for(i=1;i<=n;i++)//离散化 a[p[i].id]=i; ll temp,ans=0; for(i=1;i<=n;i++) { update(a[i],1); temp=sum(a[i]); ans+=i-temp; } printf("%I64d\n",ans); } return 0; }
POJ 2299 Ultra-QuickSort (离散化+树状数组),布布扣,bubuko.com
POJ 2299 Ultra-QuickSort (离散化+树状数组)
原文地址:http://blog.csdn.net/u012377575/article/details/38401847