hdu1394 線段樹求最小逆序數

2022-05-14 20:21:32 字數 736 閱讀 1866

hdu 1394

用線段樹求逆序數,例如要求x的逆序數隻需要訪問(x+1,n)段有多少個數,就是x的逆序數。還有就是求最小逆序數的時候有個巧妙的想法,當把x放入陣列的後面,此時的逆序數應該為x沒放入最後面之前的逆序總數加上(n-x)再減去(x-1);sum = sum+(n-x[i])-(x[i]-1)。

線段樹#include#include#includeusing namespace std;

#define lson l , m , rt << 1

#define rson m + 1 , r , rt << 1 | 1

const int maxn = 5555;

int sum[maxn<<2];

void pushup(int rt)

void build(int l,int r,int rt)

void update(int p,int l,int r,int rt)

int m=(l+r)>>1;

if(p<=m)

update(p,lson);

else

update(p,rson);

pushup(rt);

}int query(int l,int r,int l,int r,int rt)

int x[maxn];

int main()

printf("%d\n",ans);

}return 0;

}

hdu 1394 線段樹求逆序數

線段樹求逆序數 求小逆序數 神奇 題意 給定乙個序列,對該序列的n種排列 排列如下 的每種排列 0 n 1 的逆序數求最小值 a1,a2,an 1,an a2,a3,an,a1 a3,a4,an,a1,a2 an,a1,a2,an 1 思路 先求出初始序列的逆序數,可以歸併,這裡用的是線段數求。設當...

hdu1394線段樹求逆序數

這個吧,就是這麼回事。你把每乙個數都插在相應的點上。然後,query來計算a i 道n的插得點個數,因為你是按順序插得。先插的而且還在後面。那麼一定構成逆序數。然後用sum儲存一下。還有逆序數的計算第乙個數放到最後,比他小的有x 1個,比他大的有n x個。然後給移到後面,逆序數增加n x 個,比x小...

hdu1394 線段樹求逆序數

題意 給出一串數字a,可以進行如下操作 將該串數字第乙個數字a0放到該串數字的最後位置,形成新的數字串,求操作過程中最小逆序數。思路1 求一串數字的逆序數 暴力法 對每乙個數字x,判斷x與x之前出現了多少個比x大的數字。複雜度為o nn 利用線段樹 因為數字串出現的數字只能在區間0 n,可以利用線段...