即将退役选手休闲做题记录

做题记录

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\) ,则有

\[f_{j_2}+(s_i-L)^2-2s_is_{j2} + 2s_{j2}L + {s_{j2}}^2 \le f_{j_1}+(s_i-L)^2-2s_is_{j1} + 2s_{j1}L + {s_{j1}}^2 \]

\[f_{j2}-2s_is_{j2} + 2s_{j2}L + {s_{j2}}^2 \le f_{j1}-2s_is_{j1} + 2s_{j1}L + {s_{j1}}^2 \]

\[-2s_i(s_{j2} - s_{j1}) \le f_{j1} + 2s_{j1}L + {s_{j1}}^2 - (f_{j2}+2s_{j2}L + {s_{j2}}^2) \]

\[2s_i \ge \frac{2s_{j2}L + {s_{j2}}^2 - (2s_{j1}L + {s_{j1}}^2)}{s_{j2} - s_{j1}} \]

\(X(i)\)\(s_i\)\(Y(i)\)\(f_i + 2s_iL + s_i^2\)

\[2s_i \ge \frac{Y(j_2) - Y(j_1)}{X(j_2) - X(j_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)\)

\[f(n) = \sum_{n|d} g(d) \]

\[g(n) = \sum_{n|d} \mu(\frac{d}{n})f(d) \]

题目要求 \(\gcd(a[i],a[j]) = 1\) 的对数,即为求 \(g(1)\) 的值。

\[g(1) = \sum_{n|d} \mu(d)f(d) \]

\(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处理出。

然后把上面的式子变一下形:

\[ans = min(dis1[x] +x^2+ dis2[y] + y^2-2xy) \]

对于点x,若存在点 \(y1,y2(0< y1 \le y2 < x)\)\(y2\) 优于 \(y1\) ,即有

\[dis1[x] + x^2 + dis2[y2] + {y2}^2 - 2xy2 \le dis1[x] + x^2 + dis2[y1] + y1^2 - 2xy1 \]

\[-2x(y2 - y1) \le dis2[y1] + y1^2 - (dis2[y2] + y2^2) \]

\[2x \le \frac{dis2[y1] + y1^2 + (dis2[y2] + y2^2)}{y2 - y1} \]

然后类似斜率优化用单调队列进行维护,就做完了。

P2634

点分治

P8883

好玩题。

\[ans = 1 - \prod_{p \in P} (1- \frac{1}{p^2}) \]

根据欧拉乘积公式 \(\sum_{n\in N^+} n^{-s} = \prod_{x \in P} (1 - p^{-s})^{-1}\)

\[\sum_{n\in N^+} n^{-2} = \prod_{x\in P} (1 - p^{-2}) ^ {-1} \]

\[\frac{1}{\sum_{n\in N^+} n ^ 2} = \prod _{x \in P} (1 - p^{-2}) \]

\[\sum _{n\in N^+} n^2 = \frac{\pi ^ 2}{6} \]

所以得到答案即为

\[ans = n(1 - \frac{6}{\pi ^ 2}) \]

P4921

\[f(n) = 2^k\times \binom {n}{k}\times A_{n}^{k} \times g(n - k) \]

\(\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中。

\[ans = 2^n (\sum_s (-1)^{popcount(s)} f(s)) \]

然后不大会了,鸽一下。

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\) ,然后容斥一下,答案即为

\[\binom{n}{k} \sum_{i=0}^{n} (-1)^{i}\binom{n}{i}2^{2^{n-k}} - 1 \]

CF1969C

\(dp[i][j]\) 表示前 \(i\) 个位置替换了 \(j\) 次所得到的最小答案。对于位置 \(i\), 向前枚举 \(t\) ,向后枚举 \(j\),转移即为

\[dp[j][j -i + t] = min(dp[i -1][j]+minn * (j - i + 1) \]

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\) 表示树,反之基环树。

不难得知一棵树和一棵树合并一定会变成一棵树,一棵树和一棵基环树合并会变成一棵基环树。然后在加边的时候按照这个进行判断即可,细节看代码。

posted @ 2024-04-17 10:18  你说得太对辣  阅读(16)  评论(0编辑  收藏  举报