POJ 2828 buy tickets 線段樹

【題目鏈接】
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=10345

【解題報告】
題意:
每個人有一個value值
第i個人來了,站在編號爲posi的人的後面
售票處編號爲0
輸出價值序列
思路:
正着想,是一個插隊的問題,由於一個區間都需要更新,複雜度很高。
但是逆着想,第n個進隊的人,它的序號不變;
第n-1個人,如果序號在n前面,沒影響,直接插,如果序號>=第n個人的序號,那麼他要相應往後移一位
第n-2個人,假如他的序號在n-1和n-2後面,那麼相應往後移兩位
以此類推,我們容易看出,只需要查找線段樹對應第posi個空位即可。

  爲什麼可以這樣做呢?
  我們對比第k個人和第n個人面臨的局面,
  第n個人直接插到第posn個空位上,
  而第k個人,直接插到第posk個空位上,而k+1...n如果有插在k前面的,那麼k就要相應後移,因爲第1..k-1個進隊的人我們還沒
  插入,所以k前面仍然是posk-1個空位。
  相當於在我們維護的k+1..n局面下,第posk個空位一定是k對應的位置

總結:
這道題目的編程複雜度很低,就是裸的線段樹單點更新,但爲什麼一道人人都會的基礎線段樹,通過某種題意的轉化,就變的不那麼
容易分析出解法來。
所以我們訓練的時候,刻意追求學更多的算法,總結更多的模板,是不太可取的。模板就那麼些,但是題是出不完的。同樣一份模板,
能出出來的題目難度可是截然不同!
今後的訓練中,會多找些,簡單的編程難度,但是思維含量比較高的題目來訓練做題的感覺。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章