省选模拟70 题解
A. 小 Y 增员操直播群
考虑一个暴力做法,每次枚举较小的集合的大小,在判断合法之后可以直接将原问题划分为两个子问题。
两个子问题是互不干扰的,所以直接 dp 就好了。
然后可以发现枚举大小是没有必要的。
考虑与元素 $n-1$ 连边的最小的点 $x$。
如果两个集合大小相等,那么 $x=\frac{n-2}{2}$,可以直接将原问题划分。
否则将 $n$ 向左平移 $x+1$ 步,与 $n-x-1$ 连边的最小的点就是较小集合中最大的编号。
用 vector 维护一下每个点连出的边,即可做到 $O(m log)$ 复杂度。
B. 小 J 真爱粉交流群
一些结论是,对于大墩而言,向上走是没有必要的。
对于小 J 而言,每次只需要选择是否堵住大墩向下的路。
那么对于每一层,大墩走的一定是一段连续的区间。
大墩的决策是使总和最小,向左向右的权限是掌握在大墩手中的。
小 J 的决策是使总和最大,在区间不完全覆盖的情况下,能否向下的权限掌控在小 J 手中。
这样写一个 dp,每次向左向右拓展取min,向下拓展取max即可。
C. 青青草原播种计划
容易发现可以整个可持久化权值线段树,然后插入、删除、合并、$mex$ 都可以解决。
问题是咋处理子集的 $mex$。
然后有一个结论是这样的。
一个答案 $y$ 能成为子集的 $mex$,仅当所有小于等于 $y$ 的元素加和等于 $y-1$。
证明只要考虑小于等于 $y$ 的最大的元素就好了。
然后有了这个结论,一个 $O(nlog^2)$ 的做法就显然了,只要每次查询区间和,如果没找到答案,那么就能够达到权值倍长的效果。
一个 $log$ 似乎也是能做的,因为只需要判断一个区间内是否存在 $mex$ 就可以在线段树上二分。
如果这样维护区间内最大的 下标 - 前缀和 即可,感觉这玩意应该是能维护的。