最近经常刷一些奇奇怪怪的小题目,就随手开篇记录一下趴~spa
CF700B Connecting Universities —— 思惟 - 分析答案上下界
orm
分别考虑每条边的贡献。要通过这条边,说明匹配的点中有一个在子树外部,一个在子树内部。若子树内部共有 \(size[u]\) 个点,那么最大的贡献即为 \(min(size[u], 2 * K - size[u])\) 。如何证实必定能够达到这个上界 / 这个上界对于全局必定最优?假若一条边的贡献在答案中没有到达上界,说明至少有一对点在子树内部匹配,一对点在子树外部匹配。若是这时候变成两对子树内外的匹配,显然本来产生了贡献的边均不会失去贡献,而又会通过更多的边,必然更优。因此每条边必定会达到这个上界值。it
CF732F Tourist Reform —— 思惟 - Tarjan缩点 & 贪心
form
首先能够明显的发现,若是原图中存在有环,咱们可使得这个环上的点能够两两到达。因此咱们将这些环缩起来,则每个强连通份量中每一个点所能到达的点的下界即为强连通份量的大小。缩完点后咱们获得的是一棵树,那么不论咱们如何调整,总会有一个强连通份量的出度为0,也就是该强连通份量中的点的答案为最小值——该强连通份量的大小。咱们显然让点数最大的做为这个‘根’。dfs肯定答案便可。class
CF500C New Year Book Reading —— 奇怪的题 - 贪心 & 模拟遍历
我想这题居然都想了一下子(撞墙)。这个把书放到最上面的操做实际上就已经表示若是阅读,那么它的位置与摆放位置无关。因此咱们直接按照每本书第一次出现的时间次序为摆放次序就好啦……sso
CF842D Vitya and Strange Lesson —— 套路 - trie树 & 总体操做
技巧
看到与位运算有关的第一个想到trie树,若是没有第一个操做而仅仅是求 mex 的话,咱们就是在trie树上找到最靠左边的第一个空位。咱们能够记录一下trie树上的每个节点的子树是否已经满,贪心的走尽可能靠左的一边便可。异或的操做因为是对于全局而言的,咱们考虑直接在trie树上进行操做。异或上的数 x 若是在第 k 位上有 1,实际上就是原序列中的每一个数在这一位均翻转一次。在trie树上走的时候咱们人工转换一下翻转关系就行。统计
CF981D Bookshelves —— 技巧 - 贪心 & dpdi
若是咱们暴力dp的话,这确定是不行哒。不过再一次看到位运算,咱们有高位 -> 低位贪心鸭。咱们考虑当前的第 K 位是否可以为 1,咱们就设立状态 f[i][j] 表示 dp 到第 i 位,已经分红了 j 段,是否是可以知足异或值为 ans | (1 << K) 。若是能够,咱们则将(1 << K) 加到答案中,不然跳过。复杂度成功降到 \(n^{2}logm\) (m 为值域范围)。
CF771C Bear and Tree Jumps —— 思惟 - 树形dp
我太菜啦……这题若是K均为1,那么咱们只须要对于每一条边统计一会儿树内与子树外的边便可。但因为K能够取1~5,那么当两点之间的距离不足K的时候,咱们须要向上取整。例如 K=4 的状况,对于一条长度为11的路径,咱们须要跳 (11 + 1) / 4 = 3 次。因此咱们能够考虑把每条路径的长度补全成为K的倍数,令这些被加上去的剩余值为res,两两点之间的距离之和为 ans,最后的答案就是 (res + ans) / K。设立状态 f[u][j] 表示以 u 为根的子树内,距离 u 的路径长度 % K = j 的点有多少个。因为 K 的范围很小咱们 \(K^{2}\) 枚举一下转移 & 统计答案。
CF1070F Debate —— 贪心
这题的贪心策略挺明显的。因为 a 和 b 的个数要求相等,那么假如最后 a 类型选择了 x 我的, b 类型若是人数大于等于 x,毫不会选择小于 x 我的(收益都是正数)。因此实际上 a 类型和 b 类型的人必定都会取走 min(cnta, cntb) 个。把剩下的和非 a 也非 b 类型的丢在一块儿贪心取最大值直到没有办法取了为止。
CF348D Turtles —— 思惟 - 性质 & dp
很妙妙啊!若是不考虑相交的状况,咱们只须要求出 Cal(2, 1, n, m - 1) * Cal(1, 2, n - 1, m) 就是答案。但是因为有相交的状况,咱们考虑用所有的减去相交的部分。咱们能够在两条相交的路径的最后一个相交点的位置翻转两条路线,则此时图上的两条路线一条为\((2, 1) -> (n - 1, m)\),一条为\((1, 2) -> (n, m - 1)\)。此时,这两条路径依然在最后一个相交点的位置相交,也就是咱们在这两种方案之间创建起了一一对应的映射关系。因此不合法的方案总数即为 Cal(2, 1, n - 1, m) * Cal(1, 2, n, m - 1)。
CF527E Data Center Drama —— 图论 - 欧拉回路&构造
感受有点点套路?好像不少欧拉回路的构造都差不太多的样子……因为要保证度数都是偶数,首先这张图上必须存在一条欧拉回路。又由于一条边必定贡献1的入度 & 1的出度,因此必定有偶数条边。咱们能够把图补全变成欧拉回路图,若是此时边数为奇数则随便添加一个自环。遍历欧拉回路将边间隔取反便可。
CF547D Mike and Fish —— 图论 - 欧拉回路&构造
仍是同样的……每一个点的红蓝点数相差不超过1,咱们能够把点 (x, y) 看作一条 (x -> y) 的边。这样就转化成了一个二分图。咱们能够先把图补全成欧拉回路图后先从原图中的奇点补全的边开始遍历,红蓝相间染色。为何这样是对的呢?首先对于一个欧拉回路图来讲,一个点进入一次,必然会要出去一次,因此与之相连的红蓝边数都是相等的。惟独最开始遍历的点不必定知足这个要求,由于第一次出去和最后一次回来的边颜色可能相同。若是最开始遍历的点是奇点,那么第一条遍历的边就是咱们添加的虚边,颜色可有可无,颜色相差数为1;若是最开始是偶点,图又是个二分图,咱们知道出边的颜色必然等于入边。因此这样构造出来的图必定是知足题意的。
AGC016C Tree Restoring —— 大力推结论
应该说比较简单?首先能够求出全部长度中最小的和最长的分别为 mn 和 mx。显然有 mx 为直径。而 mn 必定出如今直径的中间,首先判断一下最小值的个数是否知足要求。以后对于全部值大于 mn 的看是否出现了两次及以上,由于直径是对称的,因此至少要出现两次。多余的能够在对应的位置增长一个分支(毛毛虫)来构造。
CF735D Taxes —— 奇怪奇怪 - 哥德巴赫猜测??
有点奇葩的感受……首先不难发现咱们要使得代价最小,那么确定要将 n 分红尽可能少的几个质数。若是一个数可以被拆分红质数 p * q (其中 p 是它的最小质因子),那么咱们能够把它拆分红 q 个 p,这样并不会使得答案更劣……而后……就上哥德巴赫猜测了?一个 >= 2 的偶数必然可以拆分红两个质数,一个奇数若是不是质数咱们能够把它拆成一个质数和一个偶数。这样就完了……