唔,真的考不动了,大脑一片空白,要坏掉了……
19.am
T1 是神秘暴力,发现每个数加多次没有用所以子集枚举暴力跑。题解给了神秘折半存储。
T2 一眼 cdq 分治,可惜树剖写挂了。据说可以 dsu。
T3 李超板子。
19.pm
T1 简单线段树维护子树信息。
T2 正反跑一遍最长匹配子序列,枚举汇合点再双指针判断合法性即可。
T3 注意到每次操作为把打头的递增子序列拿出来,剩余的翻转放到前面,再胡乱猜一下除掉后缀的递增序列长度总共 \(\mathcal O(n)\)。可以这样证明:考虑序列结构为递减+乱序+递增,注意到递减和递增不会移动到乱序,乱序移动到递增时贡献一次,递减中的第一个元素还会额外贡献一次。
T4 dp 推式子。暂未看懂。
20
T1 一个数组做完了,但像我这种学数据结构学傻了的也可以无脑平衡树。
T2 注意到合并顺序不会影响答案,只用考虑修改的区间。如果想不到线性做法也可以分治。
T3 操作挂到树上,线段树维护最小值及数量即可。
T4 除了线段树分治以外,没有看懂任何东西。
21
T1 小学奥数。
T2 注意到一定可以拖到不能再拖再出发,也就是一定有一条边是在关闭的那一刻刚好走完的。枚举这条边,正图反图分别跑出发的最晚时间和抵达的最早时间,询问的时候枚举这个边取最小值。注意循环枚举的变量作为数组的最后一维会快很多。
T3 每个机器人只会从离自己最近的左边或右边的出口走。只考虑这些有两种选择的,每个机器人选择的出口转化为"左 x"和"右 x"两个,实际看的就是这些操作达成顺序的先后关系,同样方向数值小的肯定先完成,所以考虑把向右操作往向左的操作序列里面插,设 \(dp_{i,j}\) 表示第 \(i\) 个向右操作放在第 \(j\) 个向左操作后的方案数。考虑会从那些点转移,同样的方案肯定放得越靠后可能性越多,所以取得所有即将变化的点。如"左 x"和"右 y"存在配对,那么 \(dp_{y-1,x-1}\) 可以转移到 \(dp_{y,j}\),\(dp_{y-1,j}\) 也可以转移到 \(dp_{y,j}\) 因为它也是最后一个能取到该状态的。发现只有 \(n\) 个配对所以实际上是 \(n\) 个区间加,树状数组维护即可。
T4 线段树分治。罕见的发现删点好做而加点不好做,所以把修改操作改为一加一删,然后设初始状态为所有点都已经加入,维护哪些时间区间要删哪些点即可。
22
T1 要求图联通,那防止图不连通那先连成完全图看看,发现点数奇数已经有欧拉回路了,考虑偶数点数每个点要删一条边,为了方便就相邻的两两配对删掉吧,发现这是可以实现的,只有点数为 \(2\) 时会因为没有其它点连接而导致不连通无解,其它情况都已构造出合法解。
T2 发现强制差为 \(1\),那就是一奇一偶,想到二分图。如果不是二分图直接方案数为 \(0\)。如果是二分图,考虑 \(0\) 只会在一边出现,发现 \(0\) 确定后其它点的值都可以顺着边一点点推出来,所以方案数就是选 \(0\) 的方案数。两边分别每个点选或不选再去掉空集,每个连通块单独求解。
T3 求前 \(k\) 小路径,很自然的枚举起点,每次取出最短的后把该起点次短的加入堆,重复 \(k\) 次即可。但发现次短不好找,实际上次短有两种方法,一种是换掉当前路径最后一个点,一个是添加新点到末尾,初始时可选点集合可以拆成三个区间,每次选掉最小的后把区间拆成两个子问题即可。
T4 P14243。
浙公网安备 33010602011771号