打成 史 了,\(0+20+0+45\),还有半个月 NOIP 了,怎么还是打这点分呢 ??
CTH 要看,所以先发了
A. 暴力操作
二分答案
对于一个数 \(a_i\) 它变成 \(\lfloor \frac{a_i}{x} \rfloor\) 的代价是 \(c_x = \forall y\mid x, min( c_y+c_{\frac {x}{y}} )\) 。
调和级数复杂度处理出来每个 \(c_i\),再对 \(c\) 数组取后缀最小值二分答案即可
B. 异或连通
赛时没多想这道题(也想不出来,毕竟不会线段树分治),打了 0/1 的部分分和暴力,结果 0/1 的还挂了
【 线段树分治 + 0/1 trie 】 / 【 trie 树分治 】
对于每次询问离线下来按询问的 \(x\) 大小排序插进 0/1 trie 里,较容易发现都经过 trie 树上同一个点的一定是一段连续的区间,所以按排序后的询问编号为线段树下标,建好 0/1 trie 后查询每一个边权 \(c_i\) 时把这条边插进经过的点所代表的区间的线段树里。
C. 诡异键盘
D. 民主选举
二分类答案
对于一个节点 \(x\), \(size_x\) 表示以 \(x\) 这个节点为根的子树大小,\(son_x\) 表示和 \(x\) 直接相连的子节点个数
考虑找到一个最小的值 \(res\) 满足所有点得到的票数 \(<res\),多余的票数上传给父亲,能分完所有的票没有冗余
发现 \(res\) 具有单调性,直接二分做,时间复杂度 \(O(n\log )\) ,每次 check 需要跑一遍 dfs,具体实现自己想想,和暴力相同。
这个时候如果直接特判 \(size_i - 1 \ge res\) 就合法,否则不合法,其实少考虑了一种合法的情况:
当我们判断 \(i\) 点是否合法的时候,发现其实除了 \(i\) 以外的点才需要满足最多有 \(res-1\) 张票,而 \(i\) 点可以有 \(res\) 张票。
那么也就是说若 \(size_i=res\) 也有可能是合法的,此时有可能是虽然没办法让所有点得到的票数都小于 \(res-1\),但有可能除了 \(i\) 以外的其他点得到了 \(res-1\) 张票,而 \(i\) 自己得到了 \(res\) 张票是可以做到的。
所以有对于所有 \(size_x=res\) 的点特判:
做一遍二分时的 \(check(res-1)\) ,dfs 的过程中记录到每个点 \(i\) 目前冗余的票数(直接拿子节点传上来的票数加上 \((son_i-(res-1))\),和 0 取 max)
-
最后根节点的冗余票数若为 0,则 \(x\) 点一定合法;
-
若根节点的冗余票数 \(>1\),则一定合法:因为这种情况下即使 \(x\) 比别的点多选一张票,也就是少向上传一张票,也做不到让根节点的冗余票数为 0;
-
而根节点的冗余票数恰好为 1 的时候有可能合法:此时即为 \(x\) 点少向上传一张票从而使得根节点的冗余票数为 0。
- 这个时候再特判一下从根节点到 \(x\) 的路径上是否存在冗余票数为 0 的情况,若有则还是不合法的:因为若存在冗余票数为 0,再减去 \(x\) 少上传上去的这一张票就成负的了,意味着到这个点便不会再向上继续减去那一张票了。