hdu1394 線段樹 樹狀陣列

2021-06-25 21:14:57 字數 1002 閱讀 2486

題目:就是求乙個陣列的逆序數,然後依次將陣列的第乙個數調到最後,最後求出最小的逆序數

做了兩種,線段樹和樹狀陣列

//利用線段樹求逆序數

// 每次將數字x插到線段樹的 x 位置,然後球一下,該線段樹右邊的和,即為逆序數的個數

//第一次用線段樹,做這個。。

#include#include#include#include#includeusing namespace std;

#define maxn 5555

int sum[maxn<<2];

int x[maxn];

/*void build(int l,int r,int rt)//其實build 可以省略

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

void push_up(int rt)

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

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

if(p<=mid)update(p,l,mid,rt<<1);

else update(p,mid+1,r,rt<<1|1);

push_up(rt);

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

int main()

void add(int x,int value)

int sum(int x) //找出x前面比x小的數的個數

int main()

{ // freopen("q.txt","r",stdin);

while(scanf("%d",&n)==1)

{int res=0;

memset(c,0,sizeof(c));

for(int i=1;i<=n;i++)

{scanf("%d",&a[i]);

a[i]++;

// cout<_<)~~~~  還需要再認真思考啊,總是參照別人對的**,當然很容易作對啊

hdu1394 樹狀陣列 解法

本題使用樹狀陣列果然更加快。樹狀陣列難點 1 如何遍歷樹 2 如何利用陣列資料 建立乙個樹狀陣列就如上圖紅色部分代表所有的樹狀陣列節點了。基本操作 查詢下乙個節點的計算,如不明白下面函式的作用,請檢視負數記憶體存放的問題。簡而言之就是 內存放是求反 1 利用這個函式可以神奇地尋找到其單親節點和兄弟節...

hdu 1394 樹狀陣列求逆序數

解題思路 這道題是求迴圈陣列中逆序數最小值,求逆序數這裡肯定是用樹狀陣列。只是這裡有一點點變化,由於題目中n位數是0 n 1的乙個排列,所以num i 可表示為比num i 小的數的個數。把第一位的數挪到最後一位,那麼整個序列的逆序數變化為ans ans num 0 n 1 num 0 num 0 ...

HDU 1394 樹狀陣列求逆序數

題意 給你n個數,每次將其第乙個元素放後面,要你算出這期間所產生的最小逆序數。題解 首先用樹狀陣列求出原序列所產生的逆序數,然後根據性質算出公式sum n a i 1 a i 具體結合 更好理解。include include include using namespace std const in...