1. 程式人生 > >sort it 樹狀數組+逆序對

sort it 樹狀數組+逆序對

play clas return pan hid 逆序 set void sca

sum[i]是1-i所有1的和,而i-sum[a[i]]就是在a[i]後面的數,即在i之前出現,卻比他大的數。1是加在a[i]上,即i實際應該放的位置。而c[i]是為sum做準備的

技術分享圖片
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<stdlib.h>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9
#include<string> 10 #include<set> 11 #include<cctype> 12 #include<sstream> 13 #define mem(a) memset(a,0,sizeof(a)) 14 #define LL long long 15 using namespace std; 16 const int N=1e6+5; 17 int a[N],c[N],n; 18 int lowbit(int x) 19 { 20 return x&-x; 21 } 22 void add(int x,int
a) 23 { 24 while(x<=n) c[x]+=a,x+=lowbit(x); 25 } 26 int sum(int x) 27 { 28 int ans=0; 29 while(x) 30 { 31 ans+=c[x]; 32 x-=lowbit(x); 33 } 34 return ans; 35 } 36 int main() 37 { 38 while(~scanf("%d",&n)) 39 { 40 mem(c); 41 int ans=0
; 42 for(int i=1;i<=n;i++) 43 { 44 scanf("%d",&a[i]); 45 add(a[i],1); 46 ans+=i-sum(a[i]); 47 } 48 printf("%d\n",ans); 49 } 50 return 0; 51 }
View Code

sort it 樹狀數組+逆序對