線段數應用 poj2828

2021-06-19 06:12:28 字數 1429 閱讀 4181

線段數應用

題目

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...