1. 程式人生 > >【Codeforces Gym 100725K】Key Insertion

【Codeforces Gym 100725K】Key Insertion

mat 沒有 信息 math 是個 每次 就是 抽象 如果

Codeforces Gym 100725K

題意:給定一個初始全0的序列,然後給\(n\)個查詢,每一次調用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K,如果第L位已經有值了就會先調用\(Insert(L+1,A_L)\)(其中\(A_L\)表示第L位上的值),再將\(A_L\)賦為K。問經過查詢後序列的模樣。

思路:首先將題意抽象成每次找到從第L位開始第一個0,並將其“拖”回第L位,然後將其更改為K。這個操作很明顯可以用FHQ Treap完成,只要在每個節點處新維護一個值表示當前節點的子樹中的值有多少個為0。然後對於每一個操作先將從L開始的後綴split出來,然後在Treap上二分:如果當前節點左子樹上有0,那麽在左子樹中找,如果當前節點為0,答案就是當前節點,否則在右子樹中找第一個0。然後找到第一個0在樹中的排名後將其split出來更改一下信息再放到正確的位置即可。

反思:這道題我WA1了一次,因為輸出的格式不對,沒有輸出最後序列的長度,所以。。。這其實是個很嚴重的問題。即使真的寫出來是對的,那麽格式一錯,全盤皆輸。

【Codeforces Gym 100725K】Key Insertion