相当优秀的数据结构,splay可以做的sequence,它也可以做。
无论是翻转,插入,删除,最大值,最小值,区间和,第k大值,比t小数,第k个数,都可以做
该题只需插入和查询第k个数就可以了。
查询的时候要将长度小的块合并,插入的时候也可以做(但我懒得编了)。
1、查询:判断第x个块长度是否>k,若满足,则在该块第k个,否则k:=k-x.len,查询x.next;在此过程中顺便合并长度之和<sqrt(n)的块。
2、插入:若k>总长则插入在最后块,若块已满,则新建块,last指针后移;否则查询k号位置,若此块未满则直接插入,否则将此块从k处分裂,再插入。分裂的块可能会在之后合并,但短时间内会增加超出预估的块数,所以要多预设一部分块。
move函数很方便,不用担心超时,因为最多移sqrt(n)个,预设块可以开个栈,每次添块就从栈中取,合并块就将其中一个压入栈中。
这道题也可以用逆推的方式用线段树做,好像很少有人想到,思路由罗雨屏提供,详情可参见下一篇博文