poj 2828 線段樹查詢第k小 離線處理

2021-10-07 07:43:46 字數 1126 閱讀 8916

題意:

排隊問題,每次把vali插到posi的位置,問最後的序列

思路:如果順著做的話,複雜度n^2無法接受,我們可以發現乙個重要的性質,前面的數對後面的沒有影響,後面插入的對前面有影響,所以倒序處理,每個插入的位置其實是在當前所有排位的第posi+1個空位的位置這個很容易證明,在原有的左邊插入,不會影響,在右邊插入,會根據之前插入過的個數倒退,所以就是第posi+1個空位,線段樹或者樹狀陣列搞搞就好了

#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=

2e5+5;

int sum[maxn<<2]

;int pos[maxn]

,val[maxn]

,n,ans[maxn]

;void

pushup

(int p)

void

build

(int p,

int l,

int r)

int mid=l+r>>1;

build

(lson)

;build

(rson)

;pushup

(p);

}void

update

(int p,

int l,

int r,

int num,

int x)

int mid=l+r>>1;

if(num>sum[ls]

)update

(rson,num-sum[ls]

,x);

else

update

(lson,num,x)

;pushup

(p);

}int

main()

return0;

}

poj2828(線段樹查詢序列第k小的值)

題意 有n個人,依次給出這n個人進入佇列時前面有多少人p i 和它的權值v i 求最終佇列的權值序列。思路 基本類似於poj2182,簡化題意後即為求序列1.n中第k小的值的問題。讀入資料量比較大,最好讀入優化。我們從n.1逆序遍歷,則可以確認最後乙個人的最終位置為p n 1,然後從序列中刪除p n...

線段樹典型例題 poj2828

逆序處理。注意到如果逆序插入,則每次插入的位置都是第x個空位。所以可以用線段樹來尋找第x個合法位置 include include include include include using namespace std const int n 200005 int sum n 3 pos n val...

poj2828 線段樹好題

題目意思是一群人排隊買票,然後後面乙個乙個的來人插隊,每個人都有乙個特殊的編號,每次告訴你他插在第幾個人的後面,問最後這串人的數字串最後是什麼。如果模擬來搞的話每次要乙個乙個的挪動人,最差的情況下每個人的位置都要變,是o n 2 的,200000的資料顯然是搞不動。正著思考麻煩的時候可以試著反向來思...