即将退役选手休闲做题记录
做题记录
CF1265E
期望dp。
好像很多种推法,设 \(f_i\) 表示从 \(i\) 走到 \(i+1\) 的期望步数。\(f_i = p_i + (1 - p_i)(1 + sm + f_i)\),\(p_i\) 为 \(\frac{p_i}{100}\),\(sm\) 为 \(\sum_{i=1}^{n-1} f_i\)。
最终答案为 \(\sum_{i=1}^{n} f_i\)。
P4051 [JSOI2007] 字符加密
把原串拼一个在后面,求出sa数组后,如果这个位置在原串里,那输出对应结尾的字符。
UVA1223 Editor
给定文本字符串 \(s\),查找文本字符串 \(s\) 中最长的子字符串,使得子字符串至少出现两次。
对于出现两次的子串,一定是后缀排序后相邻的两个的公共前缀,答案即为对 \(height\) 数组取最大值。
P2408 不同子串个数
不同字串的个数就是所有的字串减去相同的字串个数。总的字串个数为 \(\frac{n(n + 1)}{2}\) 。所有后缀产生的相同的前缀个数为 \(\sum_{1}^{n} height[rk[i]]\),相同的字串个数为 \(\sum_{1}^{n} height[rk[i]]\)。答案为 \(\frac{n(n+1)}{2} - \sum_{1}^{n} height[rk[i]]\)。
CF802I Fake News (hard)
设 \(x\) 为该子串在这之前出现的次数。
\(Ans = \sum_{i = 1}^{n} \sum_{pre(sa_i)} 2\times x + 1 = \sum_{i=1}^{n}\sum_{pre(sa_i)} + 2\times\sum_{i=1}^{n}\sum_{pre(sa_i)}x = \frac{n(n+1)}{2}+\sum_{i=1}^{n} \sum_{pre(sa_i)}x\)
然后单调栈即可。
P3181 [HAOI2016] 找相同字符
把两个字符串中间加一个特殊字符合并在一起,求一遍sa和height数组。答案就是 \(\sum _{sa[i]<n+1<sa[j]} \min _{i\le k \le j} height[k] + \sum_{sa[j]<n+1<sa[i]} \min_{i\le k \le j} height[k]\) 。
P2178 [NOI2015] 品酒大会
好题,学到了。
求有多少对后缀的lcp 大于等于r。发现当限制条件为r的时候height数组一定会被一个小于r的分成若干个块。随着r的变小,块会向外扩,可以理解为并查集操作。
P1117 [NOI2016] 优秀的拆分
记 \(a_i\) 为从1到 \(i\) ,有多少个形如AA。\(b_i\) 为从 \(i\) 到1,有多少个形如BB。\(Ans=\sum_{i=1}^{n-1} a[i]*b[i+1]\)
\(O(n^2)\) 有95 赚麻了/
很厉害题。
挂个题解链https://www.cnblogs.com/acfunction/p/10087144.html
P3975 [TJOI2015] 弦论
给定字符串,求字符串的第 \(k\) 小字串。同时每次给 \(t\) ,若 \(t=0\) 表示不同位置相同子串算一个,否则算作多个。
P9475
树形dp,然后再拆位
P3403
同余最短路。
给定 \(x,y , z\),求 \(ax + by + cz=k\) 有多少个。
假设 \(x < y < z\) 。设 \(d_i\) 为只走 \(y,z\) 能到达的最低楼层,再用这些楼层只走 \(x\) 进行拓展就可以计算答案。
P2371
同余最短路。上面题的拓展。
P4052
AC自动机上dp。貌似比较套路
将题目转换为求长度为 \(m\) 的字符串不包括任何一个模式串的方案数记为,答案就是用 \(26^m\) 减去它。
\(f[i][j]\) 表示长度为 \(i\),在 \(trie\) 树上编号为 \(j\) 不经过单词结尾的路径条数。然后标记每一个点是否是单词结尾,如果一个点的后缀是单词结尾,那这个点也不合法,因此跑fail的时候 \(vis[x] |= vis[fail[x]]\) 即可。
若这个点合法,转移方程为 \(dp[i][T[j].son[c]] += dp[i-1][j]\)。
POJ2778
类似上一题,使用矩阵快速幂即可。
P3758
邻接矩阵矩阵快速幂
P7735
树剖典题。
每次给指定链染一个独一无二的颜色,如果一个链的首尾是同一个颜色那说明是重链。线段树维护头的颜色和尾的颜色与答案,查询的时候不能像普通树剖一样修改,因为有顺序要求,所以分成u到lca和lca到v。细节有点多,调了很久
P2486
和上个题差不多
CF715C
点分治。路径分为两种,一种是经过当前根节点,一种是不经过当前根节点。对于第一种路径 ,即求 \(sumx\times 10^{dep[y]} + sumy \ | m\)
因为 \(gcd(10, m) = 1\) ,所以式子可以转换为 \(sumx + sumy \times 10^{-dep[y]} \ | m\),即 \(sumx \% m == (-y\times 10^{-dep[y]}) \% m\)
可以开个map记录一下。
不会写 照着题解写的。
P3195
唐完了,\(n^2\) dp想了好久。\(f_i = min(f_j + (i - j - 1 + sum[i] - sum[j] - L)^2)\)
令 \(s_i\) 为 \(sum[i] + 1\) ,再让 \(L\) 加上1,则
\(f_i = min(f_j + (s_i - s_j - L) ^ 2) = f_j+(s_i-L)^2-2(s_i-L)s_j+s_j^2 = f_j + (s_i-L)^2-2s_is_j+2s_jL+s_j^2\)。
设 \(j1 ,j2 (0 \le j1 < j2 i)\) 为 \(i\) 的两个决策点,若满足决策点 \(j2\) 优于决策点 \(j2\) ,则有
令 \(X(i)\) 为 \(s_i\),\(Y(i)\) 为 \(f_i + 2s_iL + s_i^2\) 。
v 然后推到这就是斜率优化板子,用单调队列维护即可。
P3628
斜率优化dp,式子和上面那个差不多。
CF623B
难绷,神秘题。
题目保证一定有解,然后删掉的区间一定是一整段的,所以 \(gcd\) 一定在 \(a[n], a[n]+1,a[n]-1,a[1],a[1]+1,a[1] - 1\) 这六个的因数里取,然后dp即可。
CF547C
莫比乌斯反演的一个比较复杂做法(
令 \(f(i)\) 表示序列中 \(gcd\) 为 \(i\) 的倍数的数对的个数, \(g(i)\) 为序列中 \(gcd\) 为 \(i\) 的数对的个数,即 \(f(n) = \sum_{n|d} g(d)\) 。
题目要求 \(\gcd(a[i],a[j]) = 1\) 的对数,即为求 \(g(1)\) 的值。
\(f(i)\) 该怎么求?设 \(h(i)\) 为序列中为 \(i\) 的倍数的个数。例如 \(a[] = {1, 2, 3, 4, 6}\), \(h(2) = 3\) 。不难发现, \(f(i) = \frac{h(i) * (h(i) - 1)}{2}\)。
然后就修改的时候改一下 \(h(i)\) 的值即可。
abc350_g
根号分治。不难发现有一个 \(O(\frac{nq}{w})\) 的bitset做法,但这个做法需要开 1e5 个大小为 1e5 的bitset,空间过不去。然后还有一个 \(O(n^2q)\) 的暴力做法,根号分治即可。记每个点的出度,若出度大于 \(M\),记为大点,否则即为小点。大点用bitset记录,若两个点都是大点,直接查询即可,若有一个小点,遍历小点的出边然后判断即可。\(\sum deg[i] = n\),所以复杂度得到保证。
.
梦熊模拟赛题。
不难推出 \(n^2\) 式子:\(ans = min(dis1[x] + dis2[y] + (y-x)^2)\) ,其中 \(dis1[x]\) 表示起点到 x 的最短路,\(dis2[y]\) 表示 y 到终点的最短路,可以跑两边dij处理出。
然后把上面的式子变一下形:
对于点x,若存在点 \(y1,y2(0< y1 \le y2 < x)\) ,\(y2\) 优于 \(y1\) ,即有
然后类似斜率优化用单调队列进行维护,就做完了。
P2634
点分治
P8883
好玩题。
根据欧拉乘积公式 \(\sum_{n\in N^+} n^{-s} = \prod_{x \in P} (1 - p^{-s})^{-1}\)
所以得到答案即为
P4921
\(\binom{n}{k}\) 表示 \(n\) 对座位选出 \(k\) 个,\(A_{n}^{k}\) 表示 \(n\) 对情侣选出 \(k\) 对且顺序可以调换,\(2^k\) 表示每对情侣左右顺序可以换, \(g(n - k)\) 表示剩下的 \(n - k\) 对情侣都不和睦。
对于 \(g(n)\) ,是个类似错排问题。 \(g(x) = 4x(2x - 2)(f[i - 1] + 2(x - 1)f[i - 2])\) 。
P4931
同上。
AT_arc093_d
设 \(f(s)\) 表示 \(s\)中为1的对应位置所表示的组中最小值在a中。
然后不大会了,鸽一下。
CF1043F
\(dp[i][j]\) 表示前 \(i\) 个数,\(gcd\) 为 \(j\) 的选择的最少的个数,答案即为 \(dp[n][1]\) 。
不难发现答案最多有七个,所以记录数字 \(i\) 的倍数在数组里出现的次数为 \(cnt[i]\)。对于当前的 \(gcd\) 为 \(i\),从1-7枚举 \(k\), \(f[i] = \binom{cnt[i]}{k}\) ,但是可能有重复的即为 \(gcd\) 为 \(i\) 的倍数而不为 \(i\),因此 \(f[i]\) 要减去 \(\sum_{i|j} f[j]\) 。
bzoj2839集合计数
容斥。
考虑从 \(n\) 个数里选出 \(k\) 个为交的方案数为 \(\binom{n}{k}\) ,剩下 \(n-k\) 个数,共有 \(2^{n-k}\) 个集合,这些集合选出若干个集合的方案数是 \(2^{2^{n-k}} - 1\) ,答案为 \(\binom{n}{k} 2^{2^{n-k}} - 1\) 。
然后想一想发现,这个东西会算重,因为在 \(n-k\) 个数里选会重复,这个式子意义应为交至少为 \(k\) ,然后容斥一下,答案即为
CF1969C
\(dp[i][j]\) 表示前 \(i\) 个位置替换了 \(j\) 次所得到的最小答案。对于位置 \(i\), 向前枚举 \(t\) ,向后枚举 \(j\),转移即为
AT_agc002_e
讲高度从高到低排序,删去最高的相当于向右走一步,每堆糖果吃掉一个相当于向上走一步。然后把网格图画出来,发现这个点的右边和上边都是必败,那这个点必胜,否则必败。画出来发现除了边界以外,一条对角线上的点的状态是相同的。找到以(0,0) 为左下角的最大的正方方形,判断右上角到左右两边的边界的奇偶性即可。
梦熊十九套T3碟盘子
对于每个点,该点为起点的答案即为从这个点开始的最长上升子序列+从这个点开始的最长下降子序列的和-1。对于求从每个点开始的最长上升/下降子序列可以从用线段树进行优化,时间复杂度 \(O(nlogn)\)。
AT_agc001_c
分 \(k\) 为奇数和偶数两种情况。
若 \(k\) 为偶数,枚举直径上的一个点,向两边dfs有多少点在 \(\frac{2}{k}\) 条边内到达。
若 \(k\) 为奇数,枚举直径上的一条边,向两点的两边同样dfs即可。
AT_agc001_d
好题,人类智慧构造,贴个别人题解。https://www.luogu.com.cn/article/kdvcj5eo
AT_agc001_e
考虑 \(\binom{x+y}{x}\) 的组合意义为从 \((0,0)\) 走到 \((x,y)\) 的方案数,所以题目转换为了从 \((0,0)\) 走到 \((a_i+a_j,b_i+b_j)\) 的方案数。
这个求起来还是 \(O(n^2)\) 的。将所有点平移一下,变成求 \((-a_i,-b_i)\) 到 \((a_j, b_j)\) 的方案数。这个怎么dp呢?让所有的 \((-a_i, -b_i)\) 为起点,求到所有 \((a_j, b_j)\) 的方案数。然后 \(dp[i][j] = dp[i-1][j]+dp[i][j-1]\)。发现这个会算重,会算上 \((-a_i,-b_i)\) 到 \((a_i,b_i)\) 的方案数,所以每次减去 \(\binom{a[i]*2+b[i]*2}{b[i]*2}\) 即可,最后除以2。
不过为什么最后答案直接除以二会wa很多,乘2的逆元就a了,好奇怪的,希望下次不会这样错。
CF875F
\(a[i]\) 和 \(b[i]\) 之间连一条 \(w[i]\) 的边,相当于把公主当作限制条件。
考虑选当前这条边是否合法:
1.若选了当前这条边后变成了一棵树,那即为 \(x\) 个点和 \(x-1\) 个边,可以任意舍去一个点(因为可以有王子不结婚),所以一定合法。
2.若选了当前这条边后,变成了一棵基环树,即为 \(x\) 个点和 \(x\) 条边,那显然一定合法。
重点在于判选了这条边后是否是一个基环树。考虑仍使用 \(kruskal\) 的方法,排序后依次考虑。若当前的边的两端 \(a,b\) 在同一个树内,那连上这条边会让他变成一个基环树,否则的话会变成一棵树。设 \(vis[i]\) 表示以 \(i\) 为根的集合是树/基环树。 \(vis[i] = 0\) 表示树,反之基环树。
不难得知一棵树和一棵树合并一定会变成一棵树,一棵树和一棵基环树合并会变成一棵基环树。然后在加边的时候按照这个进行判断即可,细节看代码。