块状链表 poj2887

相当优秀的数据结构,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)个,预设块可以开个栈,每次添块就从栈中取,合并块就将其中一个压入栈中。

这道题也可以用逆推的方式用线段树做,好像很少有人想到,思路由罗雨屏提供,详情可参见下一篇博文

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值