【POJ】2299 Ultra-QuickSort 树状数组

来源:互联网 发布:淘宝微商怎么做 编辑:程序博客网 时间:2024/06/01 08:17

树状数组求逆序对


WQNMD  long long


Run IDUserProblemResultMemoryTimeLanguageCode LengthSubmit Time17806769FMM6662299Accepted11496K969MSG++1118B2017-11-06 15:27:40


#include <cstdio>#include <cstring>#include <algorithm>#define C (c=nc())using namespace std;struct wjnsb{long long x,pla;}a[500005];long long ans,n,tr[500005];inline char nc(void){static char ch[100010],*p1=ch,*p2=ch;return p1==p2&&(p2=(p1=ch)+fread(ch,1,100010,stdin),p1==p2)?EOF:*p1++;}inline void read(long long &n){static char c;long long f=1;n=0;C;while (c<'0'||c>'9') c=='-'?f=-1,C:C;while (c>='0'&&c<='9') n=(n<<3)+(n<<1)+c-48,C;return (void)(n*=f);}bool mmp(wjnsb i,wjnsb j){return i.x<j.x;}bool cmp(wjnsb i,wjnsb j){return i.pla<j.pla;}void add(long long x){for (register long long i=x;i<=n;i+=i&-i) tr[i]++;}long long query(long long x){long long ans=0;for (register long long i=x;i>=1;i-=i&-i) ans+=tr[i];return ans;}int main(void){while (1){read(n);if (n==0) return 0;ans=0;memset(tr,0,sizeof(tr));register long long i;for (i=1;i<=n;++i)read(a[i].x),a[i].pla=i;sort(a+1,a+1+n,mmp);for (i=1;i<=n;++i) a[i].x=i;sort(a+1,a+1+n,cmp);for (i=1;i<=n;++i){add(a[i].x);ans+=i-query(a[i].x);}printf("%lld\n",ans);}}


原创粉丝点击