08 2023 档案
摘要:比较显然的 DP 是很好思考的。 令 fif_ifi 表示前 iii 个字符的答案,转移时枚举 1≤j≤i1 \leq j \leq i1≤j≤i,判断 j∼ij \sim ij∼i 是否是一个单词,如果是,用 fj−1+s[j⋯i]f_{j-1}+s[j\cdots i]fj−1+s[j⋯i]
阅读全文
摘要:比较容易发现的是,由于图上不存在三元环,所以如果逃犯进了一个环,那么无论如何都抓不到了。 从 aaa 和 bbb 跑广搜,处理出到每个点的距离。接着找所有环即可。 不需要 Tarjan,平凡的,无向图 DFS 树上不存在横叉边,每一条返祖边对应一个简单环,全都搜出来就好了。 如果存在环上的点 iii
阅读全文
摘要:还比较好想。 考虑对棋盘三染色,每连着的三个必然有三种颜色。只需要将三种颜色中的其中两种分别染成 O 和 X 或 X 和 O 即可。 总共 666 种染法,选最小的那个做,鸽巢原理容易发现操作次数不超过其限制。 #include <iostream> #include <cstdio> #inclu
阅读全文
摘要:考虑每一个 xi<yix_i < y_ixi<yi 的组,拿回 ziz_izi 的票需要 ⌈yi−xi2⌉\lceil \dfrac{y_i-x_i}{2}\rceil⌈2yi−xi⌉ 个人从 yiy_iyi 变成 xix_ixi。 直接算出两个人的得分 a,ba,ba,b,则至少需
阅读全文
摘要:提供一个非常无脑但不太好写的做法。 考虑每一个点是否在一个人视线中,只需要考虑四个方向不遇到障碍物的情况下第一个人的方向即可。 那就直接四个方向,每个方向二分一次,找到那个人的位置就做完了。复杂度 O(n2logn)O(n^2 \log n)O(n2logn),假设 n,mn,mn,m 同阶。 #
阅读全文
摘要:很简单的结论。 发现有一步十分重要,就是去重。我们考虑对于有序的无重序列中两个数 aia_iai 和 aja_jaj,假设 i<ji<ji<j,aia_iai 加上的是 n−in-in−i,aja_jaj 加上的是 n−jn-jn−j。因为 aj−ai≥j−ia_j-a_i \geq j -
阅读全文
摘要:可以发现,答案一定是可二分的。 那么我们思考如何判定。首先,对于一个点,在一棵 DFS 树上,它只有两种走法。要么往下走,要么走到祖先的某个点,然后考虑能否往下。 于是我们可以设计一个 DP,fuf_ufu 表示 uuu 点能往下的最大长度。fu=maxcj=0{fj+1}f_u = \max
阅读全文
摘要:如果我们能找到一个好人和一个坏人,我们就可以在 n−2n-2n−2 次询问内确定每个人的身份。 如何找呢?我们对每三个相邻的人进行一次询问。由于 kkk 的限制,所以必然存在两组三个相邻的人结果不同。而这两组中的其中两个人的身份不变,所以我们就可以找出那两个人。总共询问 n−2n-2n−2 次。 所
阅读全文
摘要:感觉是比较好想的。 考虑对于每个点判断从这个点出发能不能到达 111 号点。能到达的必要条件是存在一条从这个点到 111 的路径,其上除了这个点和 111 号点外的所有点都是特殊点。 但这个条件并不充分。由于每到一个特殊点,我们要移动一个其他棋子,所以我们必然想让这条路径尽量短。容易广搜在 O(n+
阅读全文
摘要:有趣的构造题。 考虑到两个字符串最多有 nnn 位不同,而我们最多只能操作一次,不难想到每次操作修改一位,且不影响之前已经操作过的位。 一个数异或 000 不变,所以可以想到不影响之前操作的位等价于将那些数异或上 000。 接着考虑左移和右移如何构造出 000?可以发现左移时,后缀的一段自动补 00
阅读全文
摘要:考虑对此无向图建出 DFS 树,也就是 DFS 一次。 如果这棵树直径 ≥nk\geq \frac{n}{k}≥kn,直接把路径找出来即可。 否则,我们找出所有叶子节点,树上必然至少有 kkk 个叶子。由于每个。点度数大于等于 333,所以每个叶子必然有不小于两条返祖边。假设叶子节点为 uuu,其
阅读全文
摘要:考虑对每个怪物数量二分至少需要多少遗物。假设用了 kkk 个遗物,那么必然选前面这些怪物类型中,能挡住伤害最多的前 kkk 种。问题转化成求前 kkk 大的和。考虑用个平衡树维护之,就是两只 log\loglog 了。 此外我们还需要维护答案,我写了个支持区间覆盖的线段树。 代码。
阅读全文
摘要:先考虑路径长度为偶数,必然每条路径颜色相同。将每个点出发颜色相同的边走到的点放入同一个并查集中。这样只需要判断 uuu 和 vvv 是否在同一并查集中即可。 但路径长度也有可能为奇数,若是这样,最后一条边的颜色可能不同。维护并查集中每个根所在集合,以及这个点为根,多出来那条路颜色不同能到的点的集合。
阅读全文
摘要:考虑先将 bbb 从小到大排序。 先考虑最小数的出现次数,设其为 xxx。那么他与其他点的贡献为 (x2)+x(n−x)\dbinom{x}{2} + x(n-x)(2x)+x(n−x)。于是我们可以求出最小值在原序列的出现次数。 同理其他数也可以,就做完了。
阅读全文
摘要:考虑数 nnn 的另一个性质。 由于是一个排列,所以 nnn 是排列中的最大值! 我们考虑最大值的性质。 区间 [l,r][l,r][l,r] 的最大值所在位置 xxx 一定有这样的性质,[l,x−1][l,x-1][l,x−1] 的逆序对个数和 [l,x][l,x][l,x] 逆序对数相同。 考虑
阅读全文
摘要:考虑对于每个点算贡献。设以其所有儿子为根的子树大小为 sz1,sz2,⋯ ,szksz_1, sz_2, \cdots, sz_ksz1,sz2,⋯,szk。设和为 sss,我们要求一个非空子集,设子集和为 s2s2s2。则贡献为 s2×(s−s2)s2 \times (s-s2)s2×(s−
阅读全文
摘要:考虑类似 LIS 的 DP 做法,设 fif_ifi 为以 iii 为结尾,填了 −1-1−1 进去后,能达成的最长上升子序列。 考虑 fi=max1≤j<i∧aj<aifj+pj,i+1f_i = \max \limits_{1 \leq j < i \land a_j <a_i} f_j +
阅读全文
摘要:考虑 DP。 令 fif_ifi 表示目前如果要使 iii 的点是最大值的最小操作次数。初始时,f1=0f_1=0f1=0,其余的 fff 均为 +∞+\infty+∞。 依次枚举每一个排序区间,则 fri=minj=lirifj+1f_{r_i} = \min \limits_{j=l_i}
阅读全文
摘要:容易发现可以直接转化成费用流模型。将学生分在一边,两个团队分在一边,就是一个二分图上的东西。由于 n≤3000n \leq 3000n≤3000,右边只有 222 个点,所以直接费用流应该是可过的。但是我们考虑更优的做法。 既然可以转化成费用流,不妨考虑模拟费用流。我们考虑增广路的实际意义有可能是以
阅读全文
摘要:考虑枚举三个字符串的全排列,设为 x,y,zx,y,zx,y,z。 分类讨论: 若 yyy 是 xxx 的子串: 若 zzz 是 xxx 的子串,最短的长度为 xxx 的长度。 否则找到 zzz 的最长前缀,满足其是 xxx 的后缀。 否则: 找到 yyy 的最长前缀,满足其是 xxx 的后缀。 设
阅读全文
摘要:看着是比较难做的。 考虑一个转化:若 (i,j)(i,j)(i,j) 的距离 ≤d\leq d≤d,连 i↔ji \leftrightarrow ji↔j 的边。相当于在图上找最大团。 不过最大团搜索算法不一定能过,考虑一个随机化算法:随机若干次,每次对点的顺序 random_shuffle。从前往
阅读全文
摘要:考虑缩点。 发现对于每一个强连通分量的每个点,都满足能到其所在强连通分量的每个点然后走回来。 但是这个点能到其他强连通分量的点走回来吗?并不是的。由于缩点完是有向无环图,所以只有缩点后出度为 000 的强连通分量内的所有点满足题意。 #include <iostream> #include <cst
阅读全文
摘要:考虑 fi,jf_{i,j}fi,j 表示当前 ai<aja_i < a_jai<aj 的概率。 从前往后处理每个操作。 对于 x,yx,yx,y 互换,显然 fx,y=fy,xf_{x,y} = f_{y,x}fx,y=fy,x。那具体等于什么呢,应该是 fx,y+fy,x2\dfrac
阅读全文
摘要:看到回文,考虑回文自动机。然而出现次数貌似不太好做。由于有 O(n)O(n)O(n) 级别的本质不同回文子串,所以每次匹配一次肯定不行。 但是有一个很好的性质!我们发现要求出现次数的字符串一定是回文。不妨对两个串建立回文自动机,用树形 DP 容易求出每个回文子串出现次数。 由于是树,考虑同时 DFS
阅读全文