題意:
排隊問題,每次把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的資料顯然是搞不動。正著思考麻煩的時候可以試著反向來思...