poj2828 線段樹好題

2021-06-18 22:01:32 字數 768 閱讀 3169

題目意思是一群人排隊買票,然後後面乙個乙個的來人插隊,每個人都有乙個特殊的編號,每次告訴你他插在第幾個人的後面,問最後這串人的數字串最後是什麼。

如果模擬來搞的話每次要乙個乙個的挪動人,最差的情況下每個人的位置都要變,是o(n^2)的,200000的資料顯然是搞不動。

「正著思考麻煩的時候可以試著反向來思考」

假設前面n-1個人已經站好了,後面再來乙個人,這個人的位置就可以確定了。

於是對第n個人來說,他站的位置就是整個佇列中第pos[n]個空格所在的位置,第n-1個人站的就是第p[n-1]個空格的位置,以此類推。這樣問題就變成了統計此時第k個空格在哪個位置,就相當於統計哪一段的和為k,於是就變成了可以使用線段樹解決的問題。

#include#includeconst int max=2000002;

int n;

int dat[max>>2];

int pos[max];

int val[max];

void build(int k,int l,int r)

//t is what we want to find

int update(int k,int l,int r,int t)

int people[max];

int main()

for(int i=1;i<=m;i++)

printf("%d ",people[i]);

printf("\n");

} return 0;

}

線段樹典型例題 poj2828

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

poj 2828 線段樹插孔處理

給你乙個數列出現的先後順序num i 和對應數值 輸出最後排好序的對應數值,如 4 0 77 1 51 1 33 2 69第一步 77 第二部 77 51 第三步 77 33 51 第四部77 33 69 51 後面先出現的位置是固定的 所以從後往前處理。線段樹每個節點存當前區間還有多少個空位 in...

poj 2828 線段樹 單點更新

題意 有n個人排隊,每乙個人都有乙個val來對應,每乙個後來人都會插入當前隊伍的某乙個位置pos後面。要求把隊伍最後的狀態輸出。題解 一看到這種題目如果之前做過類似的題目很容易就可以想到要倒序完成 因為這樣每個數插入的位置在當前都是可以確定的,sum記錄當前線段的空位數 include includ...