1.思想:把一个序列分成√n段
那么查询的时候就是完整段(长度√n)的操作,和段内的操作(<√n)
2.每一段记录什么信息:完整段用懒标记add,sum本段真实和(算上懒标记add)
3.修改:
完整度:add+d,sum+d*length
段内:暴力
4.查询:
完整段:累加sum
段内:暴力枚举
5.块状链表:把一个序列分成若干块,每一块用双向链表维护
6.可以实行的操作:
1.插入一段:
1.分裂节点
2.在分裂点插入序列
2.删除一段:
1.删除开头节点的后半部分
2.删除中间完整节点
3.删除结尾节点的前半部分
3.合并:
遍历这个链表
如果下一节点可以合并当前点,则合并
7.文本编辑器:
实现以下操作:
维护两个变量pos1,pos2表示当前光标在第pos1个块的第pos2个元素后面
1.move(k):每√n段跳,直到k<x∗√n,然后记录第几段,第几个字符前面
2.inert:暴力在pos2后面加入这个字符,但如果现在的块长超过了L√L(我取了2000),就拆出一个新的块,在链表上修改前驱后继,然后在这个块里面继续插入字符(注意不能改pos1,pos2)
3.delete:从pos2后面开始删除,删完了就通过链表找到下一个块,继续。
4.Prev,Nxt就就从现在的位置往前/往后走就好了,注意如果走到了空的块要跳过
5.对于get操作,从pos2后面开始输出,输完了就通过链表找到下一个块,继续。