08 2021 档案
摘要:题面 首先看到这是个 DS 题并且要维护异或,所以他就是个 trie。 然后来考虑怎样求出 \(\text{mex}\) 。 显然,对于树上的一个节点,我能往 \(0\) 的方向走肯定最优,如果那边满了说明走另一边。最后走的那条路径就是答案。 如何维护异或呢?考虑在做 \(\text{mex}\)
阅读全文
摘要:题面 题意: 给出 \(n\) 个字符串和 \(q\) 个询问,对于每一个询问,求出以询问串为前缀的字符串的个数。 看到了“前缀”,所以立即想到了用 trie 树。 读入字符串时,把每个字符串插进树里,插入的过程中,我们对于每个节点维护一个 tag ,对于每一个经过的节点,就将他的 tag \(+1
阅读全文
摘要:题面 比赛结束后第一时间想到这个题的解法。 赛时已经想到了这是个二分,我们以此为突破口继续往下走。 考虑 \(\operatorname{check}\) 函数怎么写。我们看这个 \(n\) 是 \(10^7\) 级别的,所以时间复杂度应该是 \(O(n\log_2n)\) ,所以 \(\opera
阅读全文
摘要:题面 对于这个题,你可以发现如果一个牛受欢迎那么他所在的 \(\text{SCC}\) 都受欢迎,因为它们是互相连通的。所以考虑缩了点再说。 然后我们得到一个新的图。如果他不联通那答案显然就是 \(0\) ,而在每个连通块中必定有一个点出度为 \(0\) (否则就出现了一个新的SCC),所以我们统计
阅读全文
摘要:题面 观察原递推式, \(f_i=1\times f_{i-1}+0\times f_{i-2}+1\times f_{i-3}\) , 所以 \[ \begin{aligned} f_i &= 1\times f_{i-1}+0\times f_{i-2}+1\times f_{i-3}, \\
阅读全文
摘要:题面 先讲坑点: 多测。 HDU不能cerr。 这个题明显的可以定义 \(f_i\) 为我打印到 \(i\) 点时的最小花费,那么显然我们有 \(f_i=\operatorname{min}\{f_j+(\sum_{k=j}^i a_k) ^2\}, 1\leq j< i\)。但是这样做的时间复杂度
阅读全文
摘要:题面 对于每一秒,Bessie 肯定会跑一个单位。这是什么?过河卒! 然后枚举每一秒, \(f_{nowx,nowy,t}=\sum_{i=0}^3 f_{nowx-x_i,nowy-y_i,t-1}\) 。 这像一个DP。 没了。 代码
阅读全文
摘要:CF题面 AT题面 先讲ABC的题。 首先不考虑数据范围的话,可以轻松写出一个 \(O(n^2)\) 的树形DP。 但是这个题过不去。所以考虑换一个算法。我去统计每一个数出现了几次。 那么显然这个边前后大于此边边权的边向外连出去的点和这条边木得关系了,那对当前边出现次数有影响的点,只可能是被边权小于
阅读全文
摘要:题面 和这个题很像,但是本题有一个花费而那一题没有,所以我们要把 \(f\) 数组开大一维。 \(f_{i,j}\) 表示节点 \(i\) 为根的子树在 \(i\) 点是 \(j\) 状态下的最小花费。 状态可以参照我的题解。 那一个题解写得很含糊,这里再讲一遍。 分三种状态: 让父亲覆盖自己; 自
阅读全文
摘要:题面 看题目就知道这是一个点覆盖型树形DP。 首先定义状态。设 \(f_i\) 为 \(i\) 节点的状态。 那么, \(f_i\) 有三种情况: 自己不放置坑爹。 儿子坑了自己。 儿子全部自给自足,自己不放置,靠儿子养活。 三个状态分别如图所示: 知道状态以后,转移就很简单了。 初始状态:坑爹,因
阅读全文
摘要:题面 一道看上去像道换根DP但可以用其他方法水过去的题目,正解显然是换根DP。 考虑换根DP两个步骤,一个是求 \(f_1\) ,第二是由 \(f_u\) 推出 \(f_v\) 。 先是状态的定义。 \(f_i\) 表示以 \(i\) 为根的答案。 然后考虑"反向边"怎么存,因为不能不存。这个可以用
阅读全文
摘要:题面 这个题就是个暴力题。 暴力从后往前枚举每一个状态,对于每一个状态暴力枚举每一种操作,然后暴力转移。 就是操作的时候位运算要看好是 << (l-1) 还是 << l 。另外就没什么难点了。 代码
阅读全文
摘要:题面 看到数据范围显然是个状压DP。 考虑记录两个数组, \(dis\) 和 \(f\) 。\(dis\) 数组表示当前状态走了多少路程, \(f\) 数组表示当前状态有多少种走法。 显然 \(dis\) 数组可以随便推,在当前状态中随便取一位 \(p\) ,然后计算 \(dis_s=dis_{s-
阅读全文
摘要:题面 可恨的getchar。 一般的状压dp。 因为空间不够开 \(100\times 2^{10} \times 2^{10}\) ,所以我们使用滚动数组。 如何滚动呢?我们在记录行数的那一维全部 \(\operatorname{mod}3\) 即可。因为当前行的状态只取决于前两行的状态。 然后就
阅读全文
摘要:题面 显然是个状压DP。 看数据范围,不难发现算法复杂度应该是 \(O(n\times 2^n \times 2^n)\) 。 显然第一个 \(n\) 是遍历每一行的土地。 后面两个 \(2^n\) ,想都不用想就知道是暴力枚举上一行和这一行的状态。 而枚举状态这个东西比较浪费时间,所以我们可以先不
阅读全文
摘要:题面 看起来非常简单,但是细节多的一批的状压DP入门题。 我设 \(f_i\) 为 \(i\) 状态时最小分组数, \(g_i\) 为 \(i\) 状态时最后一组剩余空间。 对于每一个 \(i\) ,枚举每一个 \(1\le j\le n\) 且 \(j\) 不在 \(i\) 内, 即 \(i \&
阅读全文
摘要:题面 模拟退火练手好题。 对于这个题,一般有两种解法: 每次随机两个数交换。 每次直接打乱数组。 两个方法都可以过,我写了第一种,因为不想用stl。 代码
阅读全文
摘要:题面 首先,对于每个数,有三种状态:选入集合A,选入集合B,或者不选入集合。暴力枚举的时间复杂度是 \(O(n\times3^n)\) ,显然跑不过去。 因此考虑 \(\text{Meet in Middle}\) 。记录选取前半部分的数时的总和,然后和右边每次搜索的结果进行匹配。 我设两个集合分别
阅读全文
摘要:题面 本人用的是暴力分类讨论 + \(unordered\_map\) 存储,与所有的题解都不同。 因为 \(n \leq 6\) ,非常的小,并且我不想写 DFS,所以直接暴力分类讨论 \(n=1,n=2,\dots,n=6\) 的情况。 当 \(n \leq 3\) 时,可以用循环嵌套来解决,这
阅读全文
摘要:题面 源 OJ 未 AC(卡 \(map\) ,不想写 \(hash\) )。 看到 \(n \leq 100\) ,显然 \(O(n^6)\) 会挂掉,所以要优化。 考虑到原式可化为 \(a \times b + c = d \times (e+f)\) ,所以可以分别枚举 \(a,b,c\) 和
阅读全文
摘要:题面 看到 \(n \leq 35\) ,这是一个非常小的数据,但是 \(O(2^n)\) 的暴力跑不过去,所以考虑玄学做法 \(\text{Meet in Middle}\) 。就是先做左边,然后做右边的时候顺便和左边合并。 考虑到每个点最多进行一次操作(两次操作回源没用),所以对于每个点只有操作
阅读全文
摘要:题面 首先他叫我们建一颗笛卡尔树,所以我们就建一颗笛卡尔树。 然后他说要生成序列中最小的。想到笛卡尔树的一条性质:左<根<右。但是根节点必须先插进去。他的两个儿子用贪心的思想就知道是先选左边那个。然后这题就做完了。 根据分析我们知道,遍历的顺序是根-左-右,这不是先序遍历么。 code
阅读全文

浙公网安备 33010602011771号