A. 小B的棋盘
这种方案不好枚举的题的一个解决方案就是考虑怎样的方案是可能合法的。
如果 (k geq n) 那么一定无解,否则可以找到至少一组点的中点来表示最终的答案。
容易发现取 (k+1) 个点至少存在一个能匹配到的,所以复杂度可以做到 (O(n^2 k))。
如果判断一下每个中点出现的次数,可以做到 (O(n^2))。
正解其实也不难想,如果把所有的点排序一下,那么合法的匹配的对称点一定是前 (k+1) 个和后 (k+1) 个两两中点其中之一。
暴力枚举然后判断,复杂度就是 (O(nk^2)) 的。
B. 小B的夏令营
其实暴力的 DP 还是挺简单的,考试的时候没仔细想这个题。
设 (dp_{i,l,r}) 表示到第 (i) 行,当前行剩余区间为 ([l,r]) 的概率。
转移就是从上一行有交集的区间转移,乘上的系数就是当前行恰好选上 ([l,r]) 的概率。
可以对左右两侧分别考虑,设 (P_i) 表示只考虑一侧的情况下选中 (i) 次的概率。
有 (P_i=inom{k}{i}p^i(1-p)^{k-i}),系数为 (P_{l-1}*P_{m-r})。
然后暴力 dp 随便优化就可以做到 (O(nm^2)) 了。
继续优化考虑令 (Dp_{i,l}=sum dp_{i,l,r})。
推一推式子发现这个玩意是可以由 (Dp_{i-1,j}) 转移过来的,然后系数用一些前缀和就维护了。
C. 小B的图
首先根据生成树的一些结论,可以知道对两个边集分别先做一下最小生成树,然后只保留树边的算法是正确的。
做法是这样的,首先对 (A) 边集做最小生成树,当 (x) 足够小的时候,这就是最终的答案。
然后对 (B) 边集中的边排个序,由小到大插入并替换能替换的最大的 (A) 的边来得到新的生成树,此时可以解出这个替换行为发生的时间来修改一下答案。
大概可以理解这个做法是正确的,在缩小边集之后 (A.B) 都简化为了生成树。
这也就是说 (B) 不管怎么替换,每次都能找到环上的一条边集 (A) 的边。
但是问题主要是,原来已经替换过的边可能导致环的形态改变了,然后似乎正确性不是很显然。
可以考虑反证,然后发现如果存在这样的情况,那么交换不劣,所以就可以认为不存在这样的情况。
动态维护最小生成树,边化点然后写个 LCT 就好了。