【杂题记录】♫ 杂题随心记 ♫

  最近常常刷一些奇奇怪怪的小题目,就随手开篇记录一下趴~

CF700B Connecting Universities —— 思维 - 分析答案上下界

 

    分别考虑每条边的贡献。要经过这条边,说明匹配的点中有一个在子树外部,一个在子树内部。若子树内部共有 \(size[u]\) 个点,那么最大的贡献即为 \(min(size[u], 2 * K - size[u])\) 。如何证明一定可以达到这个上界 / 这个上界对于全局一定最优?倘若一条边的贡献在答案中没有到达上界,说明至少有一对点在子树内部匹配,一对点在子树外部匹配。如果这时候变成两对子树内外的匹配,显然原本产生了贡献的边均不会失去贡献,而又会经过更多的边,必然更优。所以每条边一定会达到这个上界值。

 

CF732F Tourist Reform —— 思维 - Tarjan缩点 & 贪心

    首先可以明显的发现,如果原图中存在有环,我们可以使得这个环上的点可以两两到达。所以我们将这些环缩起来,则每一个强连通分量中每个点所能到达的点的下界即为强连通分量的大小。缩完点后我们得到的是一棵树,那么不论我们如何调整,总会有一个强连通分量的出度为0,也就是该强连通分量中的点的答案为最小值——该强连通分量的大小。我们显然让点数最大的作为这个‘根’。dfs确定答案即可。

 

CF500C New Year Book Reading —— 奇怪的题 - 贪心 & 模拟

    我想这题竟然都想了一会儿(撞墙)。这个把书放到最上面的操作实际上就已经表示如果阅读,那么它的位置与摆放位置无关。所以我们直接按照每本书第一次出现的时间次序为摆放次序就好啦……

 

CF842D Vitya and Strange Lesson —— 套路 - trie树 & 整体操作

    看到与位运算有关的第一个想到trie树,如果没有第一个操作而仅仅是求 mex 的话,我们就是在trie树上找到最靠左边的第一个空位。我们可以记录一下trie树上的每一个节点的子树是否已经满,贪心的走尽量靠左的一边即可。异或的操作由于是对于全局而言的,我们考虑直接在trie树上进行操作。异或上的数 x 如果在第 k 位上有 1,实际上就是原序列中的每个数在这一位均翻转一次。在trie树上走的时候我们人工转换一下翻转关系就行。

 

CF981D Bookshelves —— 技巧 - 贪心 & dp

    如果我们暴力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 的偶数必然能够拆分成两个质数,一个奇数如果不是质数我们可以把它拆成一个质数和一个偶数。这样就完了……

 

posted @ 2018-10-24 23:39  Twilight_Sx  阅读(302)  评论(0编辑  收藏  举报