模拟69 题解
A. chess
想一下合法方案是怎样的。
因为要保证每一个正方形合法,所以新加的一列中棋子个数等于刚刚删去一列的棋子个数。
当$m$很大的情况下,$mod\ n$相同的列转移系数都是相同的。
接着考虑,其实$m\ mod\ n$列转移了$m/n+1$次,而$n-m\ mod \ n$列转移了$m/n$次。
所以将$C$分为两部分,即转移$m/n+1$次的和转移$m/n$次的。
分别做背包就可以了。
B. array
很值得反思的一道题。
刚开始看成了弱智问题,看zkt也马上切了,于是以为确实是弱智题,然后就马上打完交了。
之后T1,T3也很简单,于是以为自己AK了,出去看到别人,各种立flag。
还剩四十多分钟的时候,想打T2对拍,突然发现情况有点不妙。
然而已经心态已经不能支持思考了,只好打了显然的二分部分分。
考试时确实用到了单调栈,但还有一步转化题意没有想到。
问题其实是,每个点到左侧比它大的第一个点范围内,最小的点的位置。
倒序枚举每个元素,维护一个从栈底到栈顶单调递减的栈。
对于栈中每一个元素,维护这个元素到栈中前一个元素范围内的最小值。
当栈顶被弹出时,表明左侧出现了比它更大的点,那么直接用最小值更新答案。
同时弹出栈顶时,栈顶下的元素将成为新的栈顶,那么新栈顶与当前枚举的i之间最小值将可能发生改变,尝试更新。
C. ants
原题没什么好说的,简单回滚莫队。
右指针不断右滚,左指针记录块边界的状态。
对于每个询问单独从块边界向左滚动。
好处是只有添加操作而没有删除。
用一个类似链表的方式维护一下连续区间就可以。