1. 程式人生 > 實用技巧 >HDOJ-2689 Sort it(樹狀陣列模板)

HDOJ-2689 Sort it(樹狀陣列模板)

Description:

hyh最近有點無聊,於是想出了一個遊戲玩:給出一個數字序列,每次操作只能交換相鄰兩個數字,需要多少次才能使數字序列按升序來排。

Hint:例如1 2 3 5 4,我們只需要一個操作:交換5和4。

Sample Input

3
1 2 3
4 
4 3 2 1 

 

Sample Output

0
6

程式碼如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#define lowbit(x) (x & (-x)) //樹狀陣列的核心
using namespace
std; const int Maxn = 5005; int a[Maxn],Tree[Maxn],n; void update(int x,int k){ while(x <= n){ //修改下一個Tree[i] Tree[x]+=k; x += lowbit(x); } } int getsum(int x){ int ans = 0; while( x >= 1){ //得到下一個Tree[x]並相加 ans += Tree[x]; x -= lowbit(x); } return
ans; } int read(){ //快讀 int s = 1,x=0; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-') s=-1; ch=getchar();} while(isdigit(ch)) { x = 10*x + ch - '0'; ch = getchar();} return x*s; } int main(){ while(~scanf("%d",&n)){ int ans = 0; memset(Tree,0,sizeof
(Tree)); for(int i=1 ;i<=n ;i++){ a[i] = read(); update(a[i],1); ans += (i-getsum(a[i])); // ans + i-(a[i]的子集合) } printf("%d\n",ans); } }