7.10 T3:
题意:维护序列,支持5种操作:
1.在光标后插入x,光标移到x后。
2.光标左移一位,光标在头则不变。
3.光标右移一位,光标在末尾则不变。
4.删除光标前的字符,光标位置不变。
5.查询以1~x结尾的最大前缀和,其中x在光标前。
分析:
看到这维护序列,第一反应,woc写平衡树啊,于是写了一发,但是常数太大T了两个点90分。
又想发现可以链表来维护,考完后lyd写了一发A了,%%%
正解是单调栈(这里单调栈的意思是如果待插元素比栈顶大,则插入,否则什么都不做),并维护另一个栈,代表光标右边的元素(注意不用单调)。
插入时相当于从栈顶插入一个元素;
左移如果不是栈顶,不做事,否则把栈顶放到另一个栈中;
右移就把另一个栈的栈顶中元素入栈;
删除如果不是栈顶,不做事,否则弹栈;
查询时在单调栈里二分x这个位置,小于等于x的最后一个元素就是前缀和最大值的末尾,只需修改时维护前缀和就行了。
(写了代码了,不过丢了,不想再写一遍了..)
7.18 T3:
题意:给定两段长度相同的序列,每次可以将第一段序列中的某个区间内的数+1后模4,问最少通过几次操作可以使第一个序列变成第二个序列。
分析:
将第一个数列与第二个数列每个位置上的元素对应相减,相当于问这个序列最少进行几次操作可以变为全0.
区间加不好搞,我们差分一下,区间加相当于头+1,尾的下一个元素-1,有多少个+1就是答案,我们用贪心随便搞搞就行了。
贪心思想大概就是,优先使用-1,如果-1不够就把前面的-1替换成+1,替换时,因为替换1,2,3都会多出来4个-1,我们优先替换3,因为这样我们只会多一个+1.
7.19 T3:
传送门:传送门