07 2023 档案
摘要:SAM 板题。 考虑对于一个点 uuu,其状态对应所有字符串的长度都在 [lenfau+1,lenu][len_{fa_u}+1, len_u][lenfau+1,lenu] 间,且连续。 容易在后缀链接树上 DP 求出子串出现次数。于是我们用线段树做区间取 max\maxmax,单点查询即
阅读全文
摘要:考虑后缀自动机。 显然我们可以求出自动机每个状态对应的子串集合在原串中出现次数,这是经典应用。 我们设其为 fif_ifi,对于 fi≥2f_i \geq 2fi≥2,将 lenilen_ileni 算进对答案的贡献即可。复杂度线性。 #include <iostream> #include
阅读全文
摘要:考虑建出子序列自动机,然后在上面广搜即可。因为是广搜,所以可以保证找出的是最短的符合条件的字符串。注意广搜时要判 vis。复杂度线性。 #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #inclu
阅读全文
摘要:考虑到由于字符集只为 000 或 111,可以字符串哈希。容易发现 000 不会对哈希结果造成影响。对于一段排序,肯定是前面一段 000,后面是一段 111。前面的 000 对哈希值的贡献都为 000,只需要管后面的 111 的数量。 所以我们可以预处理 fif_ifi 表示有 iii 个 111
阅读全文
摘要:容易发现只与字符串中每个字符出现次数有关,与字符本身的排列无关。 对于一个字符串 SSS,能在他后面接龙的不同的出现个数的字符串最多 262626 个。又因为后面的字符串长度比 SSS 多 111,所以如果建图是有向无环的。将每个字符出现次数哈希,建图,转化为最长路,DP 即可。 #include
阅读全文
摘要:我们先要保证奖赏尽量多,其次费用尽量小。应该可以看出,是一个最小费用最大流。如何建模? 考虑拆点。 每个岛屿分成一个入点一个出点。对于有雇佣兵的岛屿,源点向这个入点连容量为 111,费用为费用的边。对于怪兽的岛屿,连这个点的入点和出点,容量为 +∞+\infty+∞,费用为打怪兽的价格。对于桥梁,连
阅读全文
摘要:考虑一个动态规划,fif_ifi 表示前 iii 个字符的划分方案。枚举 iii,对于 sss 前 iii 个字符的某个后缀,如果出现在字典里,就转移。形式化地,如果 s[j⋯i]s[j \cdots i]s[j⋯i] 为一个在字典的后缀,那么 fi=∑jfj−1f_i = \sum \limit
阅读全文
摘要:提供一个非常容易的做法。 还是考虑点分治,但不用莫反,也不用容斥。 考虑找出重心后深搜,找到每个点到重心的路径的点权 gcd\gcdgcd。把他们全都扔到 set 里面,直接枚举 set 里面两个数就好。 这看起来很暴力,其实是个经典套路。由于 gcd\gcdgcd 在 O(logv)O(\l
阅读全文
摘要:如果只是求本质不同子串个数,显然的经典后缀自动机。考虑建出自动机后,相当于统计这个有向无环图上从起点开始路径个数。容易通过 DP 做到线性,具体的,令 fuf_ufu 表示以 uuu 开始路径数。则 fu=1+∑(u,j)∈Efjf_u = 1+\sum \limits_{(u,j) \in E}
阅读全文
摘要:看着就像点分治,但会发现和模板有些不同,多了一维。 我们还是照着模板的做法,分治求出重心,然后深搜找出每个点到重心的距离。不过我们这里要求两个,分别是长度 dud_udu 和边权和 pup_upu。 考虑枚举一个点 uuu。如果这个点和另外一个点 vvv 是满足条件的,那么必有 du+dv≤ld
阅读全文
摘要:经典后缀自动机题。 考虑对 sss 建立后缀自动机,然后从前往后枚举 ttt 的每个字符,从后缀自动机起点开始搜,如果现在的点往这个字符有边,直接往这边走,并且长度 +1+1+1。否则一直跳 fafafa,更新长度即可。 复杂度 O(n+m)O(n+m)O(n+m),拿下了 Rank 1。 #inc
阅读全文
摘要:先最大流一次,如果此时流量大于等于 CCC,那我们一定可以通过将一些边的流量减小而到达 CCC。 如果不行,我们考虑枚举每一条流满的边,将容量设置为 +∞+\infty+∞ 后再跑一次。容易发现如果一条边没有满流那么增加容量没有意义。他的流量已经被前面的边限制了。 这样我们每次更改容量,重新跑最大流
阅读全文
摘要:简单 DP。 考虑 fi,0f_{i,0}fi,0 和 fi,1f_{i,1}fi,1 分别表示 iii 点不选和选的情况下以 iii 为根的子树的最小点覆盖。 对于叶子节点 uuu,fu,0=0f_{u,0}=0fu,0=0,fu,1=1f_{u,1}=1fu,1=1。 对于非叶子节点,f
阅读全文
摘要:很套路的一个题。 首先发现,当左端点固定,随着右端点增加,区间 or\operatorname{or}or 和区间 max\maxmax 都是单调不递减的。 但是这个性质还不够强!我们发现,左端点固定,右端点增加时,每一次区间 or\operatorname{or}or 发现改变,二进制至少有
阅读全文
摘要:首先可以发现答案小于等于 n+2n+2n+2.于是可以考虑枚举 xxx,判断 xxx 是否为一个子段的 mex\operatorname{mex}mex。 考虑如果 xxx 为 mex\operatorname{mex}mex 的条件是什么?区间内没有 xxx,但包含 1∼x−11 \sim x
阅读全文
摘要:考虑 DP。 我们令 ai,bi,ci,dia_i,b_i,c_i,d_iai,bi,ci,di 为每名英雄的四个属性,顺序如输入格式所描述。 显然有 fi=maxj∣aj<ai∧dj≤bi∧cj≤difj+1f_i = \max \limits_{j|a_j<a_i \land d_j
阅读全文
摘要:由于 kkk 固定,考虑处理 hih_ihi 为以 iii 开头的后缀的前 kkk 个字符的哈希值。 两个后缀的最长公共前缀 ≥k\geq k≥k 等价于这两个后缀前 kkk 个字符相同,于是可以转化为 hi=hjh_i=h_jhi=hj。 于是变成了经典的类似区间数颜色的问题,使用莫队,块长
阅读全文
摘要:容易发现当 n≤1n \leq 1n≤1 时,由于 nnn 在 int 范围内,所以 p<31p < 31p<31。考虑从小到大枚举 ppp 并二分 np\sqrt [p]{n}pn,判断是否是整数即可。 #include <iostream> #include <cstdio> #include
阅读全文
摘要:这里介绍 Xor-Hash 的树哈希换根做法。 令 fif_ifi 为设树根为 111,以 iii 为根的子树的哈希值,有 fi=1+∑j∈sonuF(fj)f_i = 1 + \sum \limits_{j \in son_u} F(f_j)fi=1+j∈sonu∑F(fj),FFF 是
阅读全文
摘要:如果是有根树,我们只需要从根开始树哈希即可。如果是无根树,一种方案是,依次选取每个点作为根,但复杂度无法接受。当然可以换根 DP,但有一个比较聪明的方法。 找到两棵树的重心进行树哈希。注意重心最多有两个,所以要进行两次树哈希,对哈希值进行对比。 令 fif_ifi 为以 iii 为根的子树的哈希值
阅读全文
摘要:有趣的题。 首先第一个和第二个条件可以暴力枚举,复杂度 O(n2)O(n^2)O(n2)。 可以发现如果满足了第一个和第二个条件,这个矩阵其实就是一个无向完全图的邻接矩阵,ai,ja_{i,j}ai,j 表示 i↔ji \leftrightarrow ji↔j 的边权。 接着思考第三个。 我们发现
阅读全文
摘要:考虑拆点,每个点对 (x,y)(x,y)(x,y) 拆成入点 uuu 和出点 vvv。连 x→cap=+∞,cost=0yx \xrightarrow{cap=+\infty,cost=0} yxcap=+∞,cost=0y。如果这个地方有石头,再连一条 x→cap=1,cost=1yx \xri
阅读全文
摘要:简单费用流。 考虑每个点 (x,y)(x,y)(x,y) 转化成 (x−1)×(p+1)+y+16(x-1) \times (p+1) + y+16(x−1)×(p+1)+y+16。加上 161616 是为了避免结果为负数或 000。 题目限制只能往上或往右,于是对于每个点 uuu,找到上边和右边的
阅读全文
摘要:考虑每行一个点,每列一个点。源点 SSS 向每行连边,每列向汇点 TTT 连边,容量都是 111。 对于每个棋子,新开两个点,一个是行对应的点 xxx,另一个是列对应的 yyy。 发现其行可以在 [Ai,Ci][A_i,C_i][Ai,Ci] 中任取,列可在 [Bi,Di][B_i,D_i][B
阅读全文
摘要:首先发现答案可以二分,考虑如何判定。 首先用最短路算法跑全源最短路预处理 di,jd_{i,j}di,j 表示 iii 到 jjj 最短路。用 Floyd 做复杂度是 O(n3)O(n^3)O(n3) 的,若使用 Dijkstra 算法则是 O(nmlogm)O(nm \log m)O(nmlo
阅读全文
摘要:莫队板子。若 iii 出现 cic_ici 次,我们能要求的是 ∑i∈N⌊ci2⌋\sum \limits_{i \in \mathbb{N}} \lfloor \frac{c_i}{2} \rfloori∈N∑⌊2ci⌋。 简单莫队维护即可,复杂度 O(qn)O(q \sqrt n)O(q
阅读全文
摘要:有趣的网络流。 首先,除了 222,所有质数都是奇数,所以只能被表示成两个奇偶性不同的数的和。所以我们先抛开 222 不谈。 如果抛开 222,意味着原序列没有 111。若是这样,我们可以直接最大流解决,具体是这样: 考虑对于 ai+aja_i+a_jai+aj 为质数且 aia_iai 是奇
阅读全文
摘要:首先可以二分答案,接着考虑如何写 check。 我们发现尽管我们二分了最大和最小的差,但我们仍然无法确定这个区间,这是因为最小值不固定。 由于 B≤20B \leq 20B≤20,所以我们可以枚举最小值,求出对应区间。也就是说,每头牛去的牛棚在 [i,i+x−1][i,i+x-1][i,i+x−1]
阅读全文
摘要:首先可以发现可以二分答案。接着考虑如何 check。 假设二分当前距离最大值为 xxx,显然对于点对 (i,j)(i,j)(i,j),当 dis(i,j)≤xdis(i,j) \leq xdis(i,j)≤x 时,iii 的所有奶牛可以到 jjj 点避雨。可以最短路预处理 disdisdis。然而题
阅读全文
摘要:考虑根号分治。 若 kkk 固定,怎么做? 容易发现我们可以从树的叶子节点开始往上走,每走到一条合法的链就拼起来,贪心即可,复杂度 O(n)O(n)O(n)。 此外,我们还发现,令 ansians_iansi 为 k=ik=ik=i 时的答案,那么由于每条链不相交,所以 ansi≤⌊nk⌋ans_
阅读全文
摘要:容易发现答案为 ∑i=1b[gcd(i,n)=1]−∑i=1a−1[gcd(i,n)=1]\sum \limits_{i=1}^b [\gcd(i,n)=1]-\sum \limits_{i=1}^{a-1} [\gcd(i,n)=1]i=1∑b[gcd(i,n)=1]−i=1∑a−1[gc
阅读全文
摘要:有趣题。 容易发现答案可以二分,重点在于怎么写 check。 我们假设现在二分的是 xxx,我们要判断若对于每条边,只能经过 xxx 次,kkk 个点是否可以全部到达 111。容易发现这个东西可以转化为网络流,从源点 SSS 向 kkk 个特殊点连容量为 111 的边,原图上每条边的容量为 xxx。
阅读全文
摘要:容易发现整个序列和的绝对值 ≤1014\leq 10^{14}≤1014,令其为 VVV。 那么当 k≠±1k \neq \pm 1k=±1 时,kkk 的非负整数幂只有 O(logkV)=O(logV)O(\log_k V) = O(\log V)O(logkV)=O(logV) 个不同的
阅读全文