HDOJ-2689 Sort it(樹狀陣列模板)
阿新 • • 發佈:2020-09-06
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 namespacestd; 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); } returnans; } 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); } }