record 4.2-4.10

*! D1 A

想想找一找 fib 串的性质。

你发现一些东西,没有两个相邻的 b。

仔细观察,你发现某种程度上这是 ab,aab 交替出现,你可以记 ab 为 x,aab 为 y。

然后你发现这个 xy 串又有类似的性质。所以这个性质是无穷递归下去的。但是这东西一点做法都没有。

我们先简化问题,考虑怎么判断一个串是 S 的子串。

upd:

a->ab,b->a

我们先写一下场上最后的想法。

你考虑一个串 \(s\)\(S_i\) 的子串,我们找一个最小的 \(i\),这样 \(s\) 就一定跨过中间,那么我们就可以拆分成同一个 \(S_i\) 的一个前缀和一个后缀。

然后你就可以证明,答案不会很大,答案所属的那个 \(S_i\) 也不会很大。这是我们后面做法的基础。

然后说说 sol。

sol 的证明方法是,考虑 \(S_i=S_{i-1}|S_{i-2}=S_{i-2}S_{i-3}|S_{i-3}S_{i-4}=S_{i-2}S_{i-3}|S_{i-4}S_{i-5}S_{i-3}\)。这样,只要中间的 \(S_{i-4}\ge 3n\),我们的串就只会在 \(S_{i-3}S_{i-4}\) 中,也就是说,它在右侧有一个完整出现。所以不会很长。

然后我们考虑去把这个 \(S\) 直接算出来,之后考虑枚举起点暴力匹配子序列。

肯定需要优化。我们发现,类似于线段树,这个 \(S\) 的一个区间可以划分成 \(O(\log)\) 个完整的 fib 串。我们只需要预处理出 \(to_{i,j},len_{i,j}\) 表示 \(t_i\) 开始,去做 \(S_j\) 能做到哪里。

D1 B

Q:为啥更换随机方式是正确的。

具体来说,你有 \(n\) 个元素和一个函数 \(f(S)\) 表示 \(S\) 是否合法,保证若 \(S\) 不合法则 \(S\) 的超集也不合法。

证明:我们每次从当前合法集合 \(S\),从能让 \(S\cup x\) 合法的 \(x\) 中随机选一个,跟先随机一个排列,

额这是显然的。

后面的东西我们之前做过。

* D1 C

这个题跟积分有关的部分我都不太会啊。

首先一个暴力的做法是,我们维护多项式,然后做一些积分一类的东西。比较麻烦,并且每次可能会分出来三段,所以复杂度是个 \(O(3^nn^a)\) 这样的。

注意到 \(x_i\)\(2^{a_i}-x_i\) 的分布完全一致,所以 \(\Pr(x_i>\sum_{j\neq i}x_j)=\Pr({2^{a_i}-x_i>\sum_{j\neq i}x_j})=\Pr(\sum x_i<2^{a_i})\)

这个形式就很好看了。

然后我们考虑实数非常麻烦,我们把实数拆成整数和小数部分。令 \(x_i=y_i+z_i\),然后 \(y_i\in[0,2^a-1]\cap Z,z_i\in[0,1]\)

我们先来研究 \(\sum z_i\) 的概率分布。事实上,我们只关心整数位置的值,也就是说,我们想知道 \(\Pr(\sum z_i\le k)\)

\[\begin{aligned} \Pr(\sum z_i\le k)&=\int_0^1\int_0^1\dots\int_0^1[\sum z_i\le k]dz_1dz_2\dots dz_n\\ &=\int_0^{+\infty}\int_0^{+\infty}\dots\int_0^{+\infty}[\sum z_i\le k][z_1\le 1][z_2\le 1]\dots[z_n\le 1]dz_1dz_2\dots dz_n\\ &=\int_0^{+\infty}\int_0^{+\infty}\dots\int_0^{+\infty}[\sum z_i\le k](1-[z_1\ge 1])(1-[z_2\ge 1])\dots(1-[z_n\ge 1])dz_1dz_2\dots dz_n\\ \end{aligned} \]

而后面这若干项,可以使用乘法分配律展开,变成容斥的形式。事实上,上面这些式子的核心思想就是把概率看成一个单纯的系数,这样我们就无需处理一些跟无穷有关的问题了。

考虑有 \(j\) 项选择了 \(-[z_i\ge 1]\),这一项就是

\[(-1)^j\int_0^{+\infty}\int_0^{+\infty}\dots\int_0^{+\infty}[\sum z_i\le k][z_1\ge 1]\dots[z_j\ge 1][z_{j+1}\ge 0]\dots[z_n\ge 0]dz_1dz_2\dots dz_n\\ \]

也就是

\[(-1)^j\int_0^{+\infty}\int_0^{+\infty}\dots\int_0^{+\infty}[\sum z_i\le k-j][z_1\ge 0]\dots[z_n\ge 0]dz_1dz_2\dots dz_n\\ \]

后面这个,通过一些简单的积分(其实是归纳看出来的),我们知道这是 \(\dfrac{(k-j)^n}{n!}\)

然后我们可以通过卷积在 \(O(n\log n)\) 时间内,计算出 \(\Pr(\sum z_i\le k)\) 的每一项。

接下来我们处理整数部分。很显然这是一个数位 dp 的形式。

我们考虑从低到高 dp,设 \(dp_{i,j}\) 表示考虑了较低 \(i\) 位,当前进位是 \(j\)

转移 \(dp_{i-1,j}\binom{c_i}{k}(\frac12)^{c_i}\to dp_{i,\lfloor(j+k)/2\rfloor}\)

这个也是卷积形式。

对于 \(z\) 的处理,我们只需要给 \(dp_{0,k}\) 赋初始值即可。

总复杂度 \(O(an\log n)\)

QOJ 7736

\[dp_{u,k}=\min_{0\le x\le 1}(c_{u,x}+\sum_v dp_{v,k-x}) \]

通过归纳法我们知道这是凸的。

我们每次,先合并,然后再做闵可夫斯基和。这只需要维护差分数组,然后往里插入 \(\pm 1\)

合并可以长链剖分。

QOJ 1472

考虑暴力。\(dp_{u,k}\),然后做一个树上背包。

\(k\le\sqrt{n}\) 时,复杂度为 \(O(n\sqrt{n})\)

\(k>\sqrt{n}\) 时,你考虑一个 \(u\),有值的 \(dp_{u,k}\) 至多有 \(O(\sqrt{n})\) 个。这是因为,你考虑有 \(x\)\(k\)\(y\)\(k+1\),这要求 \(0\le sz_u-xk-y(k+1)\le k\),然后你发现,只需要记录 \(x\) 的个数即可,\(y\) 可随之确定。其实就是说我们没啥方案。

这样,你合并两个子树 \(x,y\) 的复杂度就是 \(\min(sz_x,\sqrt{n})\min(sz_y,\sqrt{n})\),这复杂度由树上背包的分析方式,是 \(O(n\sqrt{n})\)

事实上,你直接做 dp,用 unordered_map 就是对的。

? QOJ 1522

这个,你直接的想法就是 \(f_{i,v},g_{i,v}\),然后做点值乘积,复杂度 \(O(n^3v)\)

然后有一个比较神奇的思路,就是说,我们考虑在做这个的过程当中,维持值域不是很大。

具体来说,\(dp_{i,j,v}\) 表示考虑了 \(a_{1,\dots,i},b_{1,\dots,j}\),目前 \(\sum a-\sum b=v\)

如果 \(v\ge 0\),我们接下来考虑做一个 \(b\) 的转移,否则做一个 \(a\) 的转移。这样 \(v\) 的范围就很小了。

复杂度 \(O(n^2v)\)

考虑这样做为什么降低了复杂度。因为我们想知道 \(dp_{i,j,v}\) 的时候其实并不关心走 \(i,j\) 的顺序,所以这给了我们一些自由度,我们可以利用这个来达到一些想要的效果。

额,感觉我没啥见解。

Subset sum

利用上面的思想,我们可以做 subset sum。

具体来说,我们先找一个极长的前缀,使得 \(sum_t\le S\)。然后,我们接下来每步有删掉一个前面的,加入一个后面的,这两种选择。

\(dp_{i,j,v}\),我们仍然是根据 \(v\) 的正负考虑下一步转移到哪里,但是你发现这并没有优化。

观察到,\(dp_{i,j,v}=1\Rightarrow dp_{x,y,v}=1(x\ge i,y\ge j)\)

我们可以记 \(f_{j,v}\) 表示最小的一个 \(i\) 满足 \(dp_{f_{j,v},j,v}=1\)

接下来如果要转移一个 \(j\) 是非常好做的,我们把 \(f_{j,v}\to f_{j+1,v},f_{j,v}\to f_{j+1,v+a_{j+1}}\)。如果要转移一个 \(i\) 呢?

你考虑枚举一个 \(p>f_{j,v}\),用 \(p\) 去更新 \(f_{j,v-a_p}\)。这样做复杂度是错误的。

但是我们注意到这里的转移其实跟 \(j\) 没啥关系,也就是说,很可能之前我们已经转移到了这个位置。

具体来说,当 \(p>f_{j-1,v}\) 时,我们已经在 \((j-1,v)\) 处做了 \(p\to f_{j-1,v-a_p}\to f_{j,v-a_p}\),所以我们没必要做这部分转移,因此 \(p\) 只需要在 \(f_{j,v}<p\le f_{j-1,v}\) 范围内枚举,对 \(j\) 求和,这样总复杂度是 \(O(nv)\) 的。

所以我们要求,无论 \(v\) 的大小,都要进行 \((j,v)\to (j+1,v)\) 的转移。

注意到这里的转移有一些顺序上的要求,如果有负数的话,可能会出问题。

事实上,我们考虑选出所有的正数,在这里面找一个初始的接近答案的集合。然后,接下来我们相当于可以添加一个没选过的负数/去掉一个选过的正数,或者添加一个没选过的正数。这样顺序仍然是有保证的。

?* D2 A

这东西怎么做的并不重要,问题是我场上为啥不会?

* D2 B

这个题有点神奇的。

首先我们考虑如何判定一个串能不能被这两个人给删干净。你可以想象我们在二分答案,转成这样一个判定性问题。

你发现这个过程类似于一个括号匹配,我们把 0,1 分别看成左右括号,如果能删干净,那么中间过程的每一步,这个括号序列都必须合法。

你可以倒着考虑,每次往这里头加入一个左括号和一个右括号,这样得到的永远都是合法括号序列。

然后那 Alice 的策略就是尽量让这个括号序列合法,Bob 就是想让它尽可能不合法。

注意到,删除一对括号之后,对这个括号序列的影响,是让中间部分的前缀和 -1,所以 Bob 每次一定会删除最左最右这两个括号。如果这两个括号不匹配,那么已经结束了。

所以 Bob 策略已知,Alice 策略就是尽量让 Bob 删除的时候,两侧括号是匹配的。

那我们考虑当前最外层有若干对匹配好的括号,它们能拖延 Bob 一会。这之内,有分成若干部分分别匹配的括号串,Alice 必须在 Bob 删到这里之前,只保留下来最后的一个,而把其他的都删除。

这个可以看成在括号树上找一个 Alice 需要的步数始终小于等于 Bob 步数的根到叶子路径,是容易在 \(O(n)\) 内解决的。

然后我们考虑原问题,二分答案 \(k\),根据一些直观的贪心感受,我们只需要保留前 \(2k\) 个左括号和后 \(2k\) 个右括号,进行判定即可。

* D2 C

我们考虑给你一个序列 \(A\) 你怎么算 \(f(A,X)\)

最简单的想法是让每个数单独一段,但是这样 \(X\) 会不合法,那就需要跟一些别的东西去合并。

我们把 \(X,0\) 看成特殊的,其余所有数都是等价的。

对于 \(X=0\) 我们特殊考虑,这答案是 \(n(1-\frac1{2^k})\)

根据期望线性性,把答案分拆开计算。

对于每个其余数,它们产生 \(1\) 的贡献。这部分是 \(n(1-\frac2{2^k})\)

对于一个由 \(0,X\) 构成的连续段,我们依据它左右两侧是否有其余数进行分类讨论。

如果两侧都没有其余数,说明整个序列都是 \(0,X\),我们会划分出一段当且仅当前缀和是 \(0\),并且要求整个的前缀和是 \(0\)。这部分贡献是 \((\frac 2{2^k})^{n-1}\times \frac1{2^k}(\frac{n-1}2+1)\)

如果只有一侧有其余数,说明这是一个前后缀。这相当于我们不限制最后一段是什么,我们划分出一段当且仅当前缀和是 \(0\)。枚举长度,这部分贡献是 \(2\sum_{i=1}^{n-1}(\frac2{2^k})^i(1-\frac2{2^k})\frac i2\)

如果两侧都有其余数,说明这是一个中间段。相当于我们选择 \(0/X\),划分出一段当且仅当前缀和是 \(0/X\),所以答案是 \(\max(cnt_0,cnt_X)-1\),枚举长度,这部分贡献是 \((n-i-1)\sum_{i=1}^{n-2}(\frac1{2^k})^i(1-\frac2{2^k})^2\sum_{k=0}^i\max(k,i-k-1)\binom{i}{k}\)

考虑计算 \(c_i=\sum_{k=0}^i\max(k,i-k-1)\binom{i}{k}\),这个我们根据 \(i\) 的奇偶性分讨,把 \(\max\) 拆开来就可以做了。

最后总复杂度大概是 \(O(n)\),不精细实现就是 \(O(n\log V)\)

! CF1810 G

从前往后 dp,\(dp_{i,j,k}\) 表示考虑到 \(i\),目前前缀和是 \(j\),最大前缀和是 \(k\)

我们枚举一个前缀,然后从后往前 dp。这时 dp 只需要记 \(dp_{i,j}\),其中 \(j\) 表示以 \(i\) 为开头的最大前缀和。转移 \(\max(j+v_{i-1},v_{i-1})\to j'\)

但问题是这时我们要枚举前缀做 \(n\) 次 dp。不过,上面这个 dp 可以写成在一个 DAG 上,有一些转移边,问你从某些起点到一个终点的路径上边权之积之和。考虑倒过来,我们固定起点,然后问到不同的终点的这个答案是多少,只需要一次 dp 就可以了。

这个东西好像叫转置原理?

!* D3 A

场上想的是,考虑到系数 \(2^k\) 可以被看成是划分为两个不相干的部分,分别算方案数,我们接下来只需要算方案数。我们去钦定一些偶环,然后容斥简单做一做,复杂度 \(O(3^n)\)

事实上这是矩阵树定理,记邻接矩阵为 \(A\),出度矩阵为 \(O\),我们只需要计算 \(\text{det}(A+O)\)

证明跟矩阵树定理的证明非常类似,我们省略。

事实上我们也可以这么想。对于每个奇环产生 \(2\) 的贡献,偶环产生 \(0\)。我们认为 \(0^0=1\)

然后做一些容斥,容斥之后相当于每个被钦定的奇环产生 \(1\) 贡献,偶环产生 \(-1\) 贡献。

为什么是这样的呢?你考虑奇环贡献是 \(a\),偶环贡献是 \(b\),一个真的有 \(x,y\) 个奇/偶环的方案,它会被计算成:

\[\sum_{i=0}^x\sum_{j=0}^y\binom{x}{i}\binom{y}{j}(a-1)^i(b-1)^j \]

那这个显然拆一拆发现就是 \(a^xb^y\)。这东西一看就可以扩展。

那接下来就是有一些被钦定的点,别的没被钦定的可以乱连(贡献为 \(odeg_u\))。

事实上这是一个排列 \(p\),你认为 \(p_i=i\) 的点可以乱连,\(p_i\neq i\) 的点被钦定连向 \(p_i\)

注意到这种钦定方案,满足 \((-1)^{\#\text{even}}=(-1)^{\#\text{inv}(p)}\),证明可以考虑从 \(p_i=i\) 的情况交换相邻两项交换过来。

那我们发现,我们要算的东西其实就是一个矩阵的行列式,这个矩阵就是上面说的 \(A+O\)

因为 \(p\) 不是质数,所以我们高斯消元的时候需要辗转相除。

* D3 B

你发现我们每次就是乘 \(A,B,A^{-1},B^{-1}\),我们一定不会在进行过一次 \(A\) 之后立刻 \(A^{-1}\)

场上我最后写了 \(\gcd(u,v)=2\) 的时候,看出来一点答案跟 \(u,v\) 没啥关系,但是没仔细看。

我们可以合理进行猜测:任意不同的满足上面条件的序列,最后对应的答案也是不同的。

sol 里的证明非常神秘,有兴趣再去看吧。

那现在我们已经会了一个递推 \(O(n)\) 做法,那其实也就会了一个 \(O(m^3\log n)\) 的快速幂做法。

之后怎么做呢?你把生成函数写出来,发现答案形如 \([x^n]\frac{P(x)}{Q(x)}\),其中 \(P,Q\) 都是次数不超过 \(a+b+c+d\) 的多项式。

这部分就是常系数齐次线性递推。至于求出 \(P,Q\),你可以暴力做卷积一类的东西?或者 sol 说的什么 BM?

* D3 C

这个题之前 spx 随到过。

\(k=1\) 好做。\(k=2\) 分成左右和上下两类,注意到左右的话两个矩形一定是不相邻的,所以可以做一些简单笛卡尔树上 dp 或者用一些更麻烦的做法来做。上下的话,可以做一些李超树一类的。

\(k=3\) 要分很多类讨论,大多数很简单。

左中右:类似于左右。

上中下:类似于上下。

口吕/吕口:首先还是不会相邻,所以你相当于笛卡尔树上选两个独立的子树,然后两个给不同贡献就行了。

凹:最难的部分。

我们的思路就是枚举上面的矩形 \(x\),然后在数据结构里查下面 \(y,z\) 的最优解。

你考虑这要求:\(y,z\) 不交,\(x\)\(y,z\) 的祖先。

我们考虑去除后面这个限制,你发现这样不合法的部分只会算得更小,所以没问题。

这样的 \(x,y,z\) 产生的贡献是 \(s_y(h_y-h_x)+s_z(h_z-h_x)+s_xh_x\),忽略一些不重要的项之后就是 \(-(s_y+s_z)h_x+(s_yh_y+s_zh_z)\),发现我们只关心 \(y,z\) 的合并之后的结果,并且这是一个凸包的形式。

所以我们考虑对每个 \(k=0\dots n\) 算出 \(\max_{s_y+s_z=k}(s_yh_y+s_zh_z)\)

这是 \((\max,+)\) 卷积,哪怕没有 \(y,z\) 的限制也至少要 \(n^2\)。但是我们不需要算出具体值,只需要知道最后的凸包。

\((\max,+)\) 卷积在凸包上做可以闵可夫斯基和。现在唯一需要处理的限制就是 \(x,y\) 不能相交/包含。

你最直观的想法是什么?在笛卡尔树上,每个点维护两个集合 \(L,R\),然后从 \(x\) 开始向上跳,如果这个点是左儿子就加到 \(L\) 去,否则加到 \(R\) 去。最后每个点合并自己的 \(L,R\) 即可。

但是这样一个点被加入就太多次了。考虑扔到线段树上,每个点有仍然维护 \(L,R\),每个点还有一个 dfn 区间 \([l,r]\)

我们从 \(r_x\) 往上跳,如果是左儿子就加到 \(L\) 去。可以证明这样仍然是正确的。

D4 A

你发现只要会 \(O(1)\)\(g(n)=\sum_{m=0}^n\binom{n}{m}\binom{m}{\lfloor\frac m2\rfloor}2^{n-m}\) 就会完了。

事实上 \(g(n)=\binom{2n+1}{n}\)

*?! D4 B

\(f_{i,j}\) 表示当前有 \(i\) 个出现了的,其中 \(j\) 个恰好一次。

\[f_{i,j}=\dfrac{j+1}{n-i+j}f_{i,j+1}+\dfrac{n-i+1}{n-i+j}f_{i-1,j-1} \]

直接递推,可以做到 \(O(n^2+nm)\)

考虑接下来要做,势必要考虑进去 \(j^k\) 的系数。

我们记 \(g_{i,k}=\sum_{j=1}^nf_{i,j}j^k\)。考虑能不能给出一个 \(g\) 的转移式。

呃呃我怎么不会啊。

但是还有另外一种思路。

\[\begin{aligned} ans_k&=\sum_{j=1}^nf_{n,j}j^k\\ &=\sum_{j=1}^nf_{n,j}\sum_{p=0}^kS_2(k,p)j^{\underline{p}}\\ &=\sum_{p=0}^kS_2(k,p)p!\sum_{j=1}^nf_{n,j}\binom{j}{p} \end{aligned} \]

我们记 \(F_{i,p}=\sum_{j=1}^nf_{i,j}\binom{j}{p}\),下面的问题就是算这个。

事实上我们实际的思路可能是,先想到做容斥,也就是 \(F_{i,p}\) 表示目前有 \(i\) 个出现,其中 \(p\) 个被我们钦定为出现一次。然后你发现这个 \(F\) 的定义和上面是一样的。

那考虑递推 \(F\)

\[F_{i,j}=\dfrac{n-i+1}{n-i+j}(F_{i-1,j-1}+F_{i-1,j}) \]

因为我们只需要 \(F_{n,1\sim k}\),所以递推过程中只需要 \(F_{*,1\sim k}\),这复杂度是 \(O(nm)\) 的。

总复杂度 \(O(nm)\)

*? D4 C

并不会做。

但是 \(O(n^2)\) 可以考虑在差分数组上贪心,每次操作是在前面 \(-1\),在后面不超过 \(m\) 距离内 \(+1\)

这贪心是容易 \(O(n^2)\) 左右解决所有区间的。

* D5 A

有个同学给了非常厉害的做法。

我们考虑这个积和式可以理解为二分图完美匹配计数,问题转化成每个边有边权,然后问你所有存在完美匹配的连边方案贡献之和。

考虑怎么处理“存在完美匹配”,一个直接的想法是使用 Hall 定理,这会给每个子集产生一个限制,我们考虑容斥,计数不满足 Hall 定理的数量。问题是一个方案可能很多集合都不满足 Hall 定理。这时可以继续容斥,但是没啥做法。

为了简便,我们称一个方案的不满足 Hall 定理的集合为 proof。

另一种思路是考虑给每个方案钦定贡献到一个集合上头去。简单的思路是我们考虑把所有 proof 排序,然后把方案钦定到最大的 proof 上头去。

一个人类可以想到的排序方法是,我们认为 \((A,N(A))\)\((B,N(B))\) 大,当且仅当 \(|A|-|N(A)|>|B|-|N(B)|\) 或者 \(|A|-|N(A)|=|B|-|N(B)|\) 并且 \(|A|<|B|\)。直观理解就是取破坏限制最严重的一个。

会不会有两个 proof 它们破坏程度一样,并且大小也一样呢?我们证明不会。

我们考查 \(A\cup B\)\(A\cap B\)

因为

\[\begin{aligned} |A\cup B|-|N(A\cup B)|+|A\cap B|-|N(A\cap B)|&=|A|+|B|-(|N(A)\cup N(B)|+|N(A\cap B)|)\\ &\ge |A|+|B|-|N(A)|-|N(B)| \end{aligned} \]

若等号不成立,则 \(A\cup B,A\cap B\) 当中至少有一个更大。若等号成立,这要求 \(|N(A\cap B)|=|N(A)\cap N(B)|\),并且二者分别相等,也就是说 \(A\cap B\) 是更好的(因为它大小更小)。

那么现在我们关心的就是 \(f_{S,S_1}\) 表示 \(N(S)=S_1\) 并且 \((S,S_1)\) 是最大的 proof 这样的方案的权值和。

仍然考虑容斥,用 \(N(S)=S_1\) 的方案减去 \((S,S_1)\) 不是最大的 proof 的方案。

不妨假设最大的 proof 是 \((T,T_1)\)

  • \(S,T\) 不交,那么 \(S\cup T\) 一定是更大的 proof。

  • \(S,T\) 有交但互不包含,那么仿照上述过程,\(S\cap T\)\(S\cup T\) 中一定有更好的。

额上面第二条在瞎扯,我们本来是想证明更优的 \(T\) 一定是超集或者子集,但是证不了。所以我们修改定义。

\(f(S,S_1)\) 表示只考虑 \(S\to S_1\) 的边,\(N(S)=S_1\) 并且 \((S,S_1)\)\(S\) 的子集当中最大的 proof 的权值和,\(g(S,S_1)\) 表示只考虑 \(S\to S_1\) 的边,\(N(S)=S_1\) 并且 \(S\) 的所有子集都是合法的 Hall 定理。

转移仍然考虑容斥,我们算 \(f\) 的时候考虑用 \(N(S)=S_1\) 的概率减掉 \((T,T_1)\) 是一个更好的 proof 的概率。

\[f(S,S_1)=p_{S,S_1}-\sum_{(T,T_1)}f(T,T_1)g(S-T,S_1-T_1)pb(S-T,T_1)\\ g(S,S_1)=p_{S,S_1}-\sum_{(T,T_1)}f(T,T_1)g(S-T,S_1-T_1)pb(S-T,T_1) \]

其实就是说 \(T\to S_1-T_1\) 没边(这是由于 \(N(T)=T_1\)),\(S-t\to S_1-T_1\) 要是合法的(否则从中取出一个不合法 \((C,C_1)\),取 \(C\cup T\) 得到更优解),\(S-T\to T_1\) 边可以任意选(因为有没有边都不影响 \(N(S)=S_1\) 并且因为 \(S-T\) 是合法的,所以不会生成其他的不合法集合)。

* D5 B

额我不是很懂。

\(dp_{u,i}\) 表示 \(u\) 子树,从上面来了 \(i\) 个顺序已经被钦定好的球,方案数。

转移考虑枚举 \(u\) 处的球多少个去了左边多少个去了右边,分讨转移一类的。

D6 A

会的最多的一集。

我们离线下来,变成询问 \(T[l_1,\dots,r_1]\)\(S[l_2,\dots,r_2]\) 当中的出现次数,这是经典问题,使用我喜欢的 SAM 维护即可。

D6 B

为啥我 \(O(nk^22^k)\) 跑不过一点卡常 \(O(n3^k)\)

我们考虑你手头有两个树 \(u,v\) 以及它们对应的点分树,你该怎么把它们合并?

第一步肯定是选择两个根当中的一个作为真的根,然后就是选择这个根有 \(u/v\) 的那个连通块递归下去合并。

你观察到,这事实上就是把 \(u,v\) 到根的路径进行一个几乎任意的。

考虑我们的标号值,你发现这就是要求 \(u,v\) 路径上的值域不交,并且唯一对应于一个合并后的点分树。

记录 \(dp_{u,S}\) 表示 \(u\) 这个子树的点分树,\(u\) 到根上值域是 \(S\) 的方案数。合并就是子集卷积。

复杂度 \(O(nk^22^k)\)

这里还有一点东西没有说完,我们要证明,所有点分树方案都能由上面这个构造出来。

我们考虑逆过程,你把一个点分树断一条 \((u,v)\) 成两个点分树,不妨假设点分树当中 \(dep_u<dep_v\),分裂之后相当于把 \(rt\to v\) 路径上,在原树 \(v\) 子树内的点扔到 \(v\) 的点分树上,其他的扔到 \(u\) 点分树上。这唯一对应一组点分树。所以这是个多对一的映射。

他的 sol 切入角度不太一样,也可以看看。

* D6 C

不难发现,只有 MST 上的边有用。不难发现,整个问题外头可以套一个双指针一类的东西。

所以我们现在需要实现的,就是支持加入 \(G\) 当中的边,删除 \(H\) 当中的边,询问当前连通的点对数量(也可以改成询问在两个图当中都连通的点对数量,好处在于构成等价类)。我们保证这样的操作总数是 \(O(n)\) 的。

考虑维护每个点在两个图当中的连通块编号,用桶维护,每次加边的时候启发式合并,暴力修改较小集合的连通块编号。删除操作可以看成撤销,我们先启发式合并再启发式分裂即可。

这里有一点细节。我们只保证了操作总数是 \(O(n)\),但是我们每次操作复杂度是均摊的,所以总复杂度会爆炸。

考虑精细地实现双指针。我觉得我的做法比 sol 厉害。

唉其实就是你枚举到 \((i,j)\) 的时候,如果不合法就尝试加 \(i\),如果合法就尝试减 \(j\),然后每遇到一个合法状态就更新答案就行了。

D7 A

送温暖。

我们注意到佬克制非佬,菜被所有非菜克制。所以佬一定不能有 \(1\) 边入度,菜不能有 \(1\) 边出度。

但考虑进 \(0\) 边的情况呢?你发现佬连出 \(0\) 边的一定是佬,菜连入 \(0\) 边的一定是菜。

所以考虑对 \(0\) 图缩点,然后就有一些点可以被判定为佬或者菜,并且他们被当成佬或者菜一定会让条件变松。

所以问题变成只有水火两种属性,只需要判一下二分图就行了。

然后 sol 说可以观察这个克制关系的特殊性,发现等价于每个点有属性 \(a,b\)\(u\) 克制 \(v\) 当且仅当 \(a_u>a_v\lor b_u>b_v\),然后说可以把边的限制拆成 2-sat。

我不知道能不能拆,之后看看。

check 过了,真的可以啊!

* D7 B

你发现其实就是要让你凑出来所有的置换。

你很容易发现 \(m=n,m=n-1\) 的情况的做法。

你很容易发现,当 \(m\) 是偶数的时候,整个排列的奇偶性不变。

你猜测,当 \(m\le n-2\) 时,若 \(2\mid m\),那就能凑出来一半的置换;否则能凑出所有的置换。

这是由于我们操作自由度比较高,我们尝试构造一些基本的置换。比如临项对换。

然后对奇偶分类讨论,可能还得自己推一下。

思路就是先把要交换的部分换到最前面(这时无需保证别的东西不变,因为最后要逆回来做一遍),然后操作一下交换,然后再交换回来。

对于奇数,你要构造 \(AB\to BA\),对于偶数,你要构造 \(ABC\to CAB\)

* D7 C

糖丸了。

不是为啥别人的 \(O(n^2)\)\(dp_{i,j}\) 表示 \(i\) 个有效边目前剩 \(j\) 个孤立点的概率,然后算算。

我的 \(O(n^2)\) 是你发现连通块个数就是两个零度点相连的个数,那你就考虑容斥,钦定一些边是零度点相连的,然后算算概率。

我算概率的时候复杂度是 \(O(n^2)\) 的,然后总复杂度是 \(O(n^2)\) 的。

一开始的思路是用那个 \(n!\prod\frac 1{sz!}\) 来着,但是发现这大小限制不是个树啊。

最后我算概率的时候,是先钦定这 \(k\) 个边的顺序,然后考虑从后往前,每次做一个插板算方案数。

但是其实你钦定 \(k\) 个边的顺序之后,这个东西就是一个树了,概率就是 \(\prod\frac 1{sz}\)

然后你发现 \(sz_i=(k-i+1)(2n-2k+2i-3)\)

然后你发现这个东西是 \(\prod_{i=1}^k\frac{1}{sz_i}=\prod\frac{1}{i(2n-2i+1)}=\prod\frac{1}{i}\prod\frac{1}{2n-2i+1}\) 拆成阶乘和双阶乘就全对了。

一个背包

\(n\) 个物品,重量 \(\in [1,W]\),权值 \(\in [1,10^9]\),问容量为 \(M\) 的完全背包最大权值。

\(n,W\le 300,M\le 10^9\)

这个其实跟 THUPC 2023 的一个题很像。

如果 \(M\) 很大,我们最终一定是填了很多个性价比最高的 \((w_i,v_i)\),然后剩下的一部分,我们用其他的东西补一补。问题是剩下的部分多大才能保证得到最优解。

考虑剩下的部分我们填了 \(A\) 这些数,如果有一个 \(S\subseteq A\)\(w_i\mid S\),那我们爆了对吧,一定可以换成更多个性价比更高的这个 \(w_i\)

所以不能有子集是 \(w_i\) 的倍数,这个限制非常强。我们按任意顺序排列,求前缀和,相当于任意两个前缀和不能模 \(w_i\) 同余。

所以最多只会加入 \(O(W)\) 个物品,这样,剩下的重量最多是 \(O(W^2)\),我们对 \(n\) 个物品做 \(O(W^2)\) 大小的背包,然后贪心填,最后枚举我们撤销了几个 \(w_i\) 即可。

另一个等价的思考角度就是,考虑调整添加删除顺序使得任意时刻背包大小都在 \([M-W,M+W]\),然后你发现如果走了两个相同位置可以改成 \(w_i\),就做完了。

但是这个显然可以更强一点。我们变成多重背包,上面的证明过程不变,只不过 \(w_i\) 改成贪心解没用完的性价比最高的那个。

然后我们只需要再对贪心解这些东西做一个背包就行了,最后枚举我们撤销了多少大小就行了。

posted @ 2024-04-15 06:55  PYD1  阅读(6)  评论(0)    收藏  举报