北京集训记录

前言:你会很显然的发现顺序为:数论,网络流/图论,字符串,构造/贪心。

数论

A:arc147_d

注意到 \(S_i\) 和 \(S_{i + 1}\) 每次只会有一个位置不一样。

如果把集合转二进制相当于异或 \(x_i\)。于是假如定下了初始集合后面的操作每次都有 \(m\) 种方案,于是就是 \(m^{n-1}\)。

现在来考虑初始集合,发现每个数都会出现或不出现,对应到所有的 \(s_i\) 上,总次数为 \(n\),然后出现或不出现都会计入方案数,所以是 \(n^m\)。

答案即为:\(n^m \times m^{n-1}\)。

B:Luogu_P4351

经典套路把贡献拆开算。

首先考虑每个 \(l_i\) 和 \(t_i\) 拆开来算

\(x\)
\(bx\) \(abx\) \(a^2bx\) \(a^3bx\)
\(b^2 x\) \(2ab^2x\) \(3a^2b^2x\) \(4a^3b^2x\)
\(b^3 x\) \(3ab^3x\) \(6a^2b^3x\) \(10a^3b^3x\)

发现 \(l_i, t_i\) 所带的 \(a,b\) 的系数就是向下和向右走的距离。

\(t_i\) 对于答案的影响为 \(\binom{2n-i-2}{n-i} a^{n-1} b^{n-1}\),\(l_i\) 同理。

然后考虑 \(c\) 对于答案的贡献,每一个 \((i,j)\) 走到 \((n,n)\) 有 \(\binom{2n-i-j}{n-i}\) 种走法(重点结论,我以前居然不知道),所以是:

\[c \times \sum_{i=2}^{n} \sum_{j=2}^{n} \binom{2n-i-j}{n-i} \times a^{n-j}\times b^{n-i} \]

然后就是推式子阶段:

\[=c\times \sum_{k=0}^{2n-4} \ \ \sum_{i=\max\{0,k-n+2\}}^{\min\{k,n-2\}} \binom{k}{i}\times a^{k-i}\times b^{i} \]

这里需要化简 \(\min,\max\),于是考虑到:

当 \(k \le n-2\) 时,贡献为:

\[\sum_{k=0}^{n-2} \sum_{i=0}^{k} \binom{k}{i} \times a^{k-i} \times b^{i} c \]

由二项式定理得:

\[c\times \sum_{k=0}^{n-2} (a+b)^k \]

当 \(k \ge n-2\) 时,贡献为:

\[\sum_{k=n-1}^{2n-4} \ \ \sum_{i=k-(n-2)}^{n-2} \binom{k}{i} a^{k-i} b^{i} c \ \ \ = \ \ \ \sum_{k=n-1}^{2n-4} f_k c \]

其中 :

\[f_k = \sum\limits_{i=k-(n-2)}^{n-2} \binom{k}{i} a^{k-i} b^{i} \]

所以:

\[f_k = (a+b)f_{k-1} - \binom{k-1}{k-n+1} a^{n-1} b^{k-n+1} - \binom{k-1}{n-2} a^{k-n+1} b^{n-1} \]

可以通过。

C:arc139_d

从这道题了解到这种期望/总和题都有个套路,就是通过另外一种角度来计算每个元素的贡献。这道题需要用:

\[\sum_{i = 1}^{m}i\times \sum_{j=1}^{n} [a_j = i] \]

这是一个思路计算每个元素的贡献,再套路转化一下:

\[\sum_{i=1}^{m} \sum_{j=1}^{n}[a_j\ge i] \]

考虑枚举 \(i\),假设选择一个 \(v\),考虑一下情况:

  • \(v < i\):不变
  • \(v\ge i\):加一

再考虑删除第 \(x\) 小的数:

  • \(n+1-c<x\):减一

因为每次 \(c+1\) 后都会有这一条判断所以说等于是:\(\min(n+1-c,x)\)

这里方案数感性(容易)理解:

\[(m-i+1)^p(i-1)^{k-p} \binom{k}{p} \]

易做。

D:CF1097G

前置引理

第二类斯特林数。后来想了想,顺便把第一类斯特林数复习了。

定义

第一类斯特林数:\(\begin{bmatrix}n\\k \end{bmatrix}\) 是指将 \(n\) 个不同的元素排成 \(k\) 个有序的环的方案数。

\[\begin{bmatrix}n\\0 \end{bmatrix}=[n=0] \]

\[\begin{bmatrix}n\\k \end{bmatrix}=(n-1)\begin{bmatrix}{n-1}\\k \end{bmatrix}+\begin{bmatrix}{n-1}\\{k-1} \end{bmatrix} \]

第二类斯特林数:\(\begin{Bmatrix}n\\m \end{Bmatrix}\) 表示将 \(n\) 个不同元素放入 \(k\) 个相同容器的方案数。

\[\begin{Bmatrix}n\\0 \end{Bmatrix}=[n=0] \]

\[\begin{Bmatrix}n\\k \end{Bmatrix}=k\begin{Bmatrix}n-1\\k \end{Bmatrix}+\begin{Bmatrix}n-1\\k-1 \end{Bmatrix} \]

一些性质

第一类斯特林数和为:\(\sum_{k=0}^{n} \begin{bmatrix}n\\k \end{bmatrix}=n!\)

第二类斯特林数通项公式:\(\begin{Bmatrix}n\\k \end{Bmatrix}=\frac{\sum_{t=0}^{k}(-1)^t \binom{k}{t}(k-t)^n}{k!}\)

(一些公式)

公式零(好像是个定义式):\(k^n=\sum_{t=0}^k \binom{k}{t} t! \begin{Bmatrix}n\\t \end{Bmatrix}\)

公式一:\(x^n=\sum_{k=1}^n\begin{Bmatrix}n\\k\end{Bmatrix} x^{\underline{k}}\)

公式二:\(x^{\bar{k}}=\sum_{k=0}^n \begin{bmatrix}n\\k \end{bmatrix}x^k\)

公式三:\(x^{\underline{n}} =\sum_{k=1}^n (-1)^{n-k} \begin{bmatrix}n\\k \end{bmatrix}x^k\)

公式四:\((-1)^k x^{\overline{k}}=(-x)^{\underline{k}}\)

正题

带 \(x^k\) 的式子不好化简的时候可以套用上述公式零去掉 \(k\) 次方。

\[ans=\sum_s (f(S))^k \]

\[=\sum_S \sum_{i=0}^{k} \binom{f(S)}{i} i! \begin{Bmatrix}k\\i\end{Bmatrix} \]

\[=\sum_{i=0}^k i! \begin{Bmatrix}k\\i\end{Bmatrix} \sum_S \binom{f(S)}{i} \]

首先外面的 i 完全是可以枚举的,然后看了题解得知可以考虑里面这一坨的组合意义。

即为对于每一个点集组成的生成树,在树里面选出i条边涂色的方案数。(真的不在我能想到的范围内了呀)然后跑背包。

设 \(dp_{x,i}\) 表示 \(x\) 的子树内选出一棵有 \(i\) 条涂了色的边的非空生成树的方案数,方程也差不多,但多了一些分类讨论。

E:LuoguP5400

经典套路当求恰好不舒服的时候,可以恰好转至少,很自然的由二项式反演转过来。

插一句,二项式反演:

形式一:

\[f(n)=\sum_{i=0}^{n}{n \choose i}g(i) \Leftrightarrow g(n) = \sum_{i=0}^{n}(-1)^{n-i}{n \choose i}f(i) \]

形式二:

\[f(n)=\sum_{i=n}^{m}{i \choose n}g(i) \Leftrightarrow g(n) = \sum_{i=n}^{m}(-1)^{i-n}{i \choose n}f(i) \]

但是这里很特殊,定义 \(F_k\) 表示先钦定 \(k\) 个点,后面的随便选,\(G_i\) 表示答案,所以下面的式子很好理解了:

\[F_k = \sum\limits_{i=k}^{R} \binom{i}{k} Ans_i \]

所以二项式反演得:

\[Ans_i = \sum\limits_{i=k}^{R} (-1)^{i-k} \binom{i}{k} F_k \]

\(F_i=\) 选出 \(k\) 个极大数的方案数 \(\times\) 被极大数影响的数的填写方案 \(\times\) 不会被极大数影响的数的填写方案,考虑每一部分单独算:

选出 \(k\) 个极大数的方案数

这个好理解,每个极点不能再同一平面,每次选择了一个极点后,三个维度都会少一,然后注意这里是无序的所以除一个 \(k!\),所以有:

\[\frac{1}{k!} \prod\limits_{i=0}^{k-1} g_i \]

会被极大数影响的数的方案数

因为有 \((n-k)(m-k)(l-k)\) 个数不会被极大数影响,所以有 \(nml-(n-k)(m-k)(l-k)\) 个数会被极大数影响。

所以要先选出这些数,然后考虑位子。

我们可以发现,如果第一个极大数小于第二个极大数,那么如果第一个极大数满足要求,第二个极大数肯定同样满足要求

两个面进行交换,并不影响要求,所以我们可以把面交换后的极大数放在同一条对角线(大概)上,成类似洋葱的样子(就是一层包着一层),同时最外层的最小,所以一个人只管向内的一层。

所以:

\[G_i = nml-(n-i)(m-i)(l-i) \]

\[k! \binom{nml}{G_k} \prod\limits_{i=1}^{k} \frac{(G_i-1)!}{G_{i-1}!} \]

剩下的数的填法

剩下的没有限制,所以: \(g_k!\)。

答案

\[F_k =\frac{1}{k!} \prod\limits_{i=0}^{k-1} g_i k! \binom{nml}{G_k} \prod\limits_{i=1}^{k} \frac{(G_i-1)!}{G_{i-1}!} g_k! \]

\[=\frac{(nml)!}{g_k! G_k!} \prod\limits_{i=0}^{k-1} g_i g_k! \prod\limits_{i=1}^{k} \frac{(G_i-1)!}{G_{i-1}!} \]

因为是算概率,所以理应除以 \((nml)!\) ,即

\[=\frac{1}{G_k!} \prod\limits_{i=0}^{k-1} g_i \prod\limits_{i=1}^{k} \frac{(G_i-1)!}{G_{i-1}!} \]

然后我们发现前面有个 \(\frac{1}{G_k!}\) ,把这个东西放到最后一个 \(\prod\) 里面

\[=\prod\limits_{i=0}^{k-1} g_i \prod\limits_{i=1}^{k} \frac{(G_i-1)!}{G_i!} \]

\[=\prod\limits_{i=0}^{k-1} g_i \prod\limits_{i=1}^{k} \frac{1}{G_i} \]

易得答案。

2025/12/14

THUPC

同组大佬爆切 \(3\) 道题,第四道没开 long long……………… %%%%

其他时间洛谷上面复习了一下线段树优化建图。

网络流、图论

上午讲网络流和图论,实则如听懂了。

E

板子题。

首先将原图进行边双缩点,不难发现可以将 \(s\) 和 \(t\) 都在同一个边双里的询问忽略,因为可以通过给边双内的边定向使得其中任意两点都能互相到达。

于是在缩点后原图就变成了一颗树,那么限制 \((s,t)\) 相当于将树上 \(s\to t\) 的路径上的边全部定向,具体可以通过树上差分计算每条边 \((u,v)\) 被定向成 $ u\to v$ 的次数 \(a\) 和 \(v\to u\) 的次数 \(b\),最后只需 \(dfs\) 一遍判断每条边的 \(a\) 和 \(b\) 是否有一个为 \(0\) 即可。

J:P7368

发现每一个点都被行消除,或列消除。

我们将每个小行星的 \(x\) 坐标与 \(y\) 坐标看成一条边的两个端点。那么形成的这张图中的任意一条边都需要有至少一个端点有武器摆放。

换句话说,问题就是要求出一个最小的点集 \(S\),使得图中任意一条边都有至少一个端点属于 \(S\)。这个问题被称为二分图的最小点覆盖。

故求消除所有小行星的最小代价就相当于求这张二分图的最小点覆盖数。

考试

简直吃屎,考试了…………,jy一点??

T2 P14344 [JOISC 2019] 两道料理 / Two Dishes

首先考虑 \(n^2\) 的 DP,设 \(dp_{i,j}\) 表示前面选了 \(i\) 个第一道菜, \(j\) 个第二道菜。

所以如果 \(j\le pos1_i\) 就可以转 dp[i][j + 1] = max (dp[i][j + 1], dp[i][j] + p[i])。

另一道菜同理。所以有:

For(i, 0, n) For(j, 0, m) {
  if(i != n) f[i + 1][j] = max(f[i + 1][j], f[i][j] + (j <= pos1[i + 1]) * p[i + 1]);
  if(j != m) f[i][j + 1] = max(f[i][j + 1], f[i][j] + (i <= pos2[j + 1]) * q[j + 1]);
}

第一个转移随便做,第二中情况可以转移的位置是一个区间,所以区间 \(\max\) 一下就好了。

发现第二个转移是后缀加,前缀 \(\max\),所以用差分就是 \(O(1)\) 修改,然后如果加负数就把中间那一节删去(>=pos1[i]) 那一段。

用点 STL 插入然后删除,均摊 \(O(n)\) 做完。

T1

不想写了,场了。

T3

字符串

A

这辈子都不想写 KMP。

通过这道题得出一个很重要的性质,把一个字符串拍到线段树上是可以做 hash 合并的。

所以这里建立权值线段树,每次一段一段的匹配,发现下标左移其实就是 \(ans-(1+base+base^2……+base^{n-1})\)。直接做就行了。

注意这里的值离散化一下。 hash 大法好用喵。

D

设 \(len=\sum|S|\),显然 \(len \le 3\times 10^5\),这就是这道题的局限性所在,输入就控制了输出,发现用 hash 插入,删除 \(O(1)\),查询暴力枚举 \(O(len\sqrt{len})\),不同的长度的个数 \(1+2+……+t\le len\),所以这个输入限制了 \(len\) 不同的的个数,做完了。

I

exkmp 模板,略。

J

看的 pyy 大佬的题解,\bx\bx\bx。

首先,这个串的形式一定可以写成 \(ABSBA\),此时显然 \(AB\) 和 \(BA\) 是循环相同的。

设 \(f_i\) 表示 \(A\) 的长度为 \(i\) 时 \(B\) 的最长长度,这里先不考虑这个长度为 \(i\) 的 \(A\) 是否是一个 Border,因为只需要在合法的转移处更新答案。

注意到:

\[f_i\le f_{i+1}+2 \]

这个地方要好好理解一下,因为这里 \(i+1\to i\),前面的 \(B\) 会在开头加入一个字符,后面的 \(B\) 会在结尾加入一个字符,所以最好情况是 \(A\) 的结尾是 \(B\) 的开头,\(B\) 的结尾是 \(A\) 的开头,这时候 \(f_i=f_{i+1}+2\)。

但是会不会出现 \(A\) 结尾的一串,是 \(B\) 前面的一串呢?不会的,兄弟不会的,如果出现了,那么 \(f_{i+1}\) 一定会变大的,抽象)。

反正噼里啪啦说了一通,这种情况是不会出现的,最优的是时候 \(f_i=f_{i+1}+2\)。

这里先直接假设 \(f_i=f_{i+1}+2\),然后判断当前的 \(B\) 是否合法,如果不合法就 --f[i],然后这个过程类似指针,是线性的 \(O(n)\),解决。

构造、贪心

可能构造都是“尝试” \(+\) “人类智慧”的结晶吧\maybe。

A

\(strategy:\) 操作等于把两个数赋值成一样的数,然后把相邻两个数都这样操作,操作完了后就可以看做一个数了,然后又可以合并……这样下去就行了。

B

\(strategy:\) 考虑缩小规模,发现直接在入口和出口建立即可,但是原来在第一行的人将会到第 \(n\) 行,第 \(n\) 行的人将会到第 \(p\) 行,列同理,交换一下就好了,规模一直缩小最后 \(1\times 1\),做完了。

C

\(strategy:\) 和上一道题几乎一模一样

H

\(strategy:\) 准确来说这是一道 \(dp\),没有所谓策略。

非常的智慧,下面用抽象的语言解释一下它的智慧:一开始想的是记 \(f_{i,j}\) 表示选 \(i\) 这个区间,选了 \(j\) 个数的最大值,但是就会发现很难合并,你得先规定这个区间内不出现没有选完的情况,最后再选定这一个数,再看选多少………………虽然能做但是依托。

这里就把上面的思路反向,看不选 \(i\) 这个区间的最大值,最后递归到 \(l=r\) 就能直接算答案,牛逼!

所以反向思维是很重要的

DP

A

trick1:做 dp 先做 sub 再解决题目。

trick2:dp不仅可以表示当前的历史,也可以表示对未来的承诺!

设 \(dp_{i,j}\) 表示当前在 \(i\) 这个位置,保证 \(i+1~n\) 的最大前缀和为 \(j\),的期望。

  • 如果选 \(1\),可以转移到 \(dp_{i+1,\max(j-1,0)}\)。

  • 如果选 \(-1\),可以转移到 \(dp_{i+1,j+1}\)。

具体为(这里倒过来从 \(i-1\to i\) 更好写代码):

\[dp_{i,j}=(1-p_i)\times dp_{i-1,\max(j-1,0)}+p_i\times dp_{i-1,j+1} \]

小技巧:直接将 \(dp_{0,i}\) 赋值为 \(s_i\) 即可。

数据结构

隆畜讲课还是可以的。。。

A

扫描线随便做,具体来说就是扫描下标,然后每次加入 \(nxt_i-i\)。

B

跟 A 差不多,分成 3 种情况做。

  • \(l~i-1\),其中 \(a_i\),是区间第一个出现的 \(a_i\)。
  • \(i+1~r\),其中 \(a_i\),是区间最后一个出现的 \(a_i\)。
  • \(i+1~nxt_i - 1\)。

都挺简单的。

D

好题一道。

注意到公差为 \(d\),所以满足要求的答案序列 \(a_{ansl}\sim a_{ansr}\) 一定满足 \(a_{i} mod\ d = a_{i+1} mod\ d\),其中 \(i=ansl,ansl+1,...,ansr-1\)。且没有相同的数。

对于一个满足 \(a_i mod\ d\) 相等的区间 \([L,R]\),因为最多插入 \(k\) 个数,所以:

\[\max_{i=L}^R - \min_{i=L}^R + 1 - (R-L+1)\le k \]

考虑扫描线枚举 \(R\)。于是把式子中的 \(R,k\) 常数项放在一边:

\[\max_{i=L}^R - \min_{i=L}^R + L\le k + R \]

现在来看左边这一坨怎么维护。

trick:单调栈

可以手玩一下单调栈,假设这是一个从小到大的栈,发现每次加入一个数 \(a_i\) 时,会弹出所有 \(a_j\),满足 \(a_j\le a_i\),假设最后 \(a_k\ge a_i\),那么 \(a_i\) 就是 \(k+1 \sim i\) 的最大值。

然后做两个栈,用线段树维护这个式子的值,注意不要禁锢了思维,因为每次操作保证了 \(a_i\) 是当前要修改的区间的最大值,所以不要把这个操作当成取 \(\max\),把他当成 \(-a_j+a_i\),即一次减法一次加法操作。

注意 \(d=0\) 的情况要特判

然后做完了。

A2

TEST3

T1

和题解一模一样的做法,考场上天真的写了个贪心,瞪了 30min 才看出 hack。

贪心不行就考虑 dp,设 \(dp_{i,0/1}\) 表示 \(i\) 是/否算连接父亲的边的最大价值。

然后考虑转移,设 \(i\) 的儿子为 \(j\),因为每一个 \(j\) 都会被选为 \(f_{j,1}\) 或 \(f_{j,0}\)

所以考虑全部选 \(f_{j,0}\),然后从中挑选至多 \(k\) 个选择为 \(f_{j,1}\),此时的贡献为 \(-f_{j,0}+f_{j,1}\),于是按照 \(f_{j,1}-f_{j,0}\) 排序,直接取就行。

场了。

T2

lc 考过的原题,但是居然没做他。。。

反正 \(n\le 10\),所以假设 \(i\) 这个颜色有 \(a_i\) 个,则 \(a_1,a_2,...,a_n\) 这样为一个状态,状态数不超过 \(42\) 个。

所以直接考虑状态 \(S\) 转到状态 \(T\) 的概率,然后矩阵直接做。o

posted @ 2025-12-14 09:40  FluvLeis  阅读(38)  评论(0)    收藏  举报