線段數應用
題目:
buy tickets
題目大意:
n個人排隊等待,第
i個人到來會有兩個資訊(
pos[i]
∈[0, i − 1] , val[i]
)表明這
個人會插隊到
pos[i]
的後邊,這個人的值是
val[i]
;依次給出
n個人的到來資訊,輸出最終的
佇列從頭到尾每個人的值。
思路:第
i個人插入的位置是
pos[i]
那就說明這個人前面要有
pos[i]
個空位置重後向前依次插入到線段數中,假設第
i個人插入到了位置
x,那麼
[0,x - 1]
必須有(pos[i])
個空位置留給在
i之前到來且排在
i前的人(這樣的人必然有,
要不然第
i個人的插入操作就是錯誤的)。
提交情況:
wa 2
次 ac 1次
原因:沒搞清思路;
ac code:
#include
#include
#include
#include
using
namespace std;
#define
maxn 200100
intnum[maxn];
struct
segmenttreenode
void init(int _l, int _r, int _sit, segmenttreenode* sonl, segmenttreenode* sonr)
};
struct
humnodehum[maxn];
struct
segmenttree
~segmenttree()
void built(int l, int r, segmenttreenode* &rt)
void insert(int sate, int id, segmenttreenode* rt)
if(rt->son[0]->sit >= sate) insert(sate, id, rt->son[0]);
else insert(sate - rt->son[0]->sit, id, rt->son[1]);
} };
intmain()
for(int i = 0; i < n - 1; ++ i) printf("%d ", num[i]);
printf("%d\n", num[n - 1]);
} return 0; }
線段樹典型例題 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的資料顯然是搞不動。正著思考麻煩的時候可以試著反向來思...
poj 2828 線段樹插孔處理
給你乙個數列出現的先後順序num i 和對應數值 輸出最後排好序的對應數值,如 4 0 77 1 51 1 33 2 69第一步 77 第二部 77 51 第三步 77 33 51 第四部77 33 69 51 後面先出現的位置是固定的 所以從後往前處理。線段樹每個節點存當前區間還有多少個空位 in...