hdu 1394 (最小逆序對 線段樹

2021-10-07 07:35:30 字數 1140 閱讀 2880

題意:

給n個0到n-1的數,每次可以取乙個放後面,求最小逆序對

思路:求逆序對可以利用樹狀陣列或者線段樹元素出現的時間差來維護,這裡由於n個數是0到n-1,所以每次更新就是加上原來的順序對,減去逆序對,就是+n-1-2*a[i]

#include

#include

#include

#define lson p<<1,l,mid

#define rson p<<1|1,mid+1,r

#define ls p<<1

#define rs p<<1|1

using

namespace std;

const

int maxn=

5010

;int a[maxn]

,sum[maxn]

;void

pushup

(int p)

void

build

(int p,

int l,

int r)

int mid=l+r>>1;

build

(lson)

;build

(rson)

;pushup

(p);

}int

query

(int p,

int l,

int r,

int l,

int r)

void

update

(int p,

int l,

int r,

int x)

int mid=l+r>>1;

if(x<=mid)

update

(lson,x)

;else

update

(rson,x)

;pushup

(p);

}int

main()

int res=ans;

for(

int i=

1;i<=n;

++i)

printf

("%d\n"

,res);}

return0;

}

hdu1394 線段樹求最小逆序數

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

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小...