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了一次,因为输出的格式不对,没有输出最后序列的长度,所以。。。这其实是个很严重的问题。即使真的写出来是对的,那么格式一错,全盘皆输。