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

2022-08-21 19:06:11 字數 713 閱讀 6217

題意:有n個人,依次給出這n個人進入佇列時前面有多少人p[i],和它的權值v[i],求最終佇列的權值序列。

思路:基本類似於poj2182,簡化題意後即為求序列1..n中第k小的值的問題。讀入資料量比較大,最好讀入優化。我們從n..1逆序遍歷,則可以確認最後乙個人的最終位置為p[n]+1,然後從序列中刪除p[n]+1,繼續操作倒數第二個...這一操作可以通過線段樹來完成。線段樹的結點包括3個值:l(區間左端點),r(區間右端點),len(區間剩餘編號數)。每次詢問維護len值。時間複雜度為o(tnlogn)。

ac**:

#include#include

using

namespace

std;

const

int maxn=200005

;inline

intread()

while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();

return f?-x:x;

}struct

nodetr[

4*maxn];

intp[maxn],v[maxn],n,ans[maxn];

void build(int v,int l,int

r)int query(int v,int

k)int

main()

return0;

}

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

題意 排隊問題,每次把vali插到posi的位置,問最後的序列 思路 如果順著做的話,複雜度n 2無法接受,我們可以發現乙個重要的性質,前面的數對後面的沒有影響,後面插入的對前面有影響,所以倒序處理,每個插入的位置其實是在當前所有排位的第posi 1個空位的位置這個很容易證明,在原有的左邊插入,不會...

線段樹典型例題 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的資料顯然是搞不動。正著思考麻煩的時候可以試著反向來思...