趣题泛做-一定不咕

题集

数学

随机化

[CF1305F]Kuroni and the Punishment

题意:给你一个长度为 \(n\) 的序列,你一次操作可以把这个序列的一个数加一或者减一,求使得这个数列的 \(\gcd > 1\) 的最小操作次数。

我们考虑,答案一定不超过 \(N\)(把每个数都调成 \(2\) 的倍数),然后考虑一个性质,就是对于最优答案来说,至少有 \(\frac{n}{2}\) 个数字,被调整了少于 \(2\) 次。

证明,如果少于 \(\frac{n}{2}\) 调整少于 \(2\) 次,那么总调整次数大于 \(n\),不是最优答案。

那么,我们每次,从数列里选出来一个数字 \(x\),对 \(x,x-1,x+1\) 的所有因数对于这个检验答案即可。这样做一次的正确率是 \(\frac{1}{2}\)。多做几次即可。

线性代数

[CF1067E]Random Forest Rank

题意:给你一个 \(n\) 个点的树,每条边有 \(\frac{1}{2}\) 的概率出现或者不出现,求这个最后的森林的的邻接矩阵的秩。

结论题,被爆杀了。

结论:对于一个树来说,他的邻接矩阵满秩,当且仅当他存在一个完美匹配。下面,开始我的胡扯,我们首先考虑一个事实,对于一个树,完美匹配数量不超过 \(1\)

然后,考虑,满秩的时候,\(\det(A)=\sum (-1)^{\tau (\pi)}\prod _{i=1}^n A_{i,\pi (i)}\not = 0\),事实上,我们考虑,这些 \(\pi\) 排列会产生一个环,那么一个排列的权值自然是这些环的乘积。不难发现,这些环的长度不能是 \(1\),因为树没有自环,所以只可能是一个二元环,那么这个形式其实就是一个匹配。

那么,我们考虑怎么算答案。我们只需要算期望的匹配数量,然后最后答案就是匹配数量乘二。

那么,我们就是要 \(dp\)(以贪心的策略),令 \(f_v\) 表示 \(v\) 和一个儿子匹配的概率,那么答案就是 \(2\sum f_i\),转移方程 \(f_i=1-\prod_{v\in son_i}(\frac{1+f_v}{2})\),表示这条边断开了还是连上了。

那么,这个问题就解决了。

[CF1344F]Piet's Palette

题意:给你一个由 RYB. 组成的字符串,然后你可以实行四种操作,问这个字符串是啥,给出一个合法的即可。

  1. mix 从前往后扫,有俩一样的都消掉,有俩不一样的变成第三个颜色,然后直接删掉空的。
  2. RY YB RB 交换两种颜色。

考虑在模 \(2\) 意义下的运算,如果把这四种颜色都看成一个 \(2\times 1\) 的列向量,那么第一个操作就是一个向量的加法。

\[W=\begin{bmatrix}0\\0\end{bmatrix},\ R=\begin{bmatrix}1\\0\end{bmatrix},\ Y=\begin{bmatrix}0\\1\end{bmatrix},\ B=\begin{bmatrix}1\\1\end{bmatrix} \]

这玩意,然后分别的,那三种操作就变成了线性变换,就是乘上三个矩阵。

\[\mathrm{RY}=\begin{bmatrix}0&1\\1&0\end{bmatrix},\ \mathrm{RB}=\begin{bmatrix}1&0\\1&1\end{bmatrix},\ \mathrm{YB}=\begin{bmatrix}1&1\\0&1\end{bmatrix} \]

然后,发现就是把两行交换,前一行加到后一行,后一行加到前一行上。

我们刚开始有 \(2n\) 个未知数,然后设 mix 总数为 \(M\),那么应该就会有 \(2M\) 个方程。

只要高斯消元求出来一组可行解即可。

概率期望

[CF1295F]

题意:给你一个长度为 \(N\) 的二元组 \([l_i,r_i]\),一个长度为 \(N\) 的数列 \(a\),满足 \(a_i\in [l_i,r_i]\),求这个 \(a\) 是不增数列的概率。

首先考虑把一个闭区间 \([l_i,r_i]\) 变成开区间 \([l_i,r_i+1)\) 记为 \([L_i,R_i)\),然后离散化每个区间。

我们考虑求出来所有的不增数列的方案数,然后最后除以 \(\prod _{i=1}^N (R_i-L_i)\)

我们考虑令 \(dp[i][j]\) 表示做到 \(i\) 个数字,第 \(i\) 个数字选择的是 \(j\) 的不增数列的方案数。

然后,我们的方案总数就是 \(\sum_v dp[N][v]\),考虑如何转移

\[dp[i][j] = \sum_{k\ge j} dp[i-1][k] \]

这玩意,我们就可以 \(O(NV)\) 的做了。

然后,我们考虑离散化,令 \(dp[i][j]\) 表示,我们做到第 \(i\) 个,上一个是第 \(j\) 段的数即可。

每次的转移,我们枚举一个 \((k,i]\) 的区间,这些 \(a\) 都在 \(j\) 段里即可。设 \(j\) 段的长度为 \(l_j\)

\[dp[i][j] = \sum_{k=0}^{i-1}[k+1\sim i 这些区间都包括第j段]\binom{l_j+i-k-1}{i-k}\sum_{o>j}dp[k][o] \]

这玩意复杂度是 \(O(N^3)\) 的。

我们发现,这个东西,其实类似于一个每次给一个 \(\binom{c}{t}\) 的转移

[CF605E]Intergalaxy Trips

题意:给你一个 \(N\) 个点 \(M\) 条边的图,每个时刻 \((i,j)\) 这条边有 \(p_{i,j}\) 的概率出现。你永远按照最优策略走,然后问你从 \(1\) 走到 \(N\) 的期望时间。

好奇怪,由于你特别聪明,所以很厉害。

我们考虑,肯定的走法就是,每次走向一个期望时间比自己小的才行,否则直接原地休息。

\(E(x)\) 表示 \(x\) 点到 \(N\) 点的期望时间,显然有 \(E(N)=0\)

然后,我们按照类似于 \(\text{dijkstra}\) 的更新方法,每次找到一个已经知道的最小的 \(E(x)\),然后来更新其他的点即可。

咋更新,我们考虑比如说你先在一个点 \(x\),然后他旁边有一堆比他期望时间小的后继 \(y_i\),按照 \(E\) 排序。

然后应该有的是

\[E(x)=\frac{\sum_{i}\prod_{j<i}(1-p_{x,y_j}) E(y_i)}{\prod_j(1-p_{x,y_j})} \]

下面除的这个东西,表示可能会这些边全都断掉,然后原地等待。

然后就这么转移就行了。

数据结构

轻重链剖分

[CF1633F]

题意:给你一个 \(n\) 个节点的树,然后刚开始只有 \(1\) 节点是激活的,每次你可以激活一个和现在激活节点集相邻的节点,然后问你现在这个点集可不可以完美匹配。强制在线。

我们考虑,怎么去在树上做一个完美匹配,自然是贪心的策略。每次选出来一个叶子和他的父亲,一起删掉即可。那么,我们考虑,按照每个节点的 \(sz\) 进行分类,分为偶数节点和奇数节点,然后每次就是删掉一个奇数节点和他的父亲偶数节点。

注意到这种操作对于其他的节点的的奇偶性没有改变,所以说,其实我们要求完美匹配的条件是,对于一个偶数节点,他恰有一个奇数节点,对于一个奇数节点,他的父亲是偶数节点。

那么,条件可以转化为,两种节点的数量相等。我们每次添加一个叶子节点,相当于是把一条路径上的节点性质翻转。可以用 Link-Cut-Tree 完成,但由于是给定的树,直接用轻重链剖分维护即可。

动态规划

很思维的DP

[CF830D]Singer House

题意:给你一个 \(N\) 个点的完全二叉树,每个点额外向他子树内的所有节点连边,求有多少个不同的路径。

我们设 \(dp_{i,j}\) 表示一个高度为 \(i\) 的这个图,里面一共有 \(j\) 个路径的方案数。

那么,明显答案就是 \(dp_{n,1}\)

奇怪的dp状态定义。

然后,我们可以写出来转移方程,一共有四种情况,从高度 \(i\) 转移到高度 \(i+1\) 的图上:

  • 不选根节点,在两个子树里分别选出来 \(j\) 个和 \(k\) 个,\(dp_{i,j}\times dp_{i,k}\) 贡献到 \(dp_{i+1,j+k}\)
  • 选根节点,在两个子树里分别选出来 \(j\) 个和 \(k\) 个,\(dp_{i,j}\times dp_{i,k}\) 贡献到 \(dp_{i+1,j+k+1}\)
  • 选根节点,并且跟其中一个路径连上,两个子树分别选 \(j\) 个和 \(k\) 个,\(dp_{i,j}\times dp_{i,k}\times 2 \times (j+k)\) 贡献到 \(dp_{i+1,j+k}\)
  • 选根节点,和两个都连上那个,两个子树分别选 \(j\) 个和 \(k\) 个,\(dp_{i,j}\times dp_{i,k}\times 2 \times \binom{j+k}{2}\) 贡献到 \(dp_{i+1,j+k-1}\) 里。

注意到路径数大于 \(N\) 的状态是不必要的,我们只需要转移第二维 \(N\) 以内的就可以得到正确答案。

数据结构优化DP

[CF1129D]Isolation

题意:给你一个长度为 \(n\) 的序列和 \(K\),你把这个序列分成若干个出现一次的数字不超过 \(K\) 次的段的方案总数是多少。对于 \(998244353\) 取模。

我们考虑,一个暴力 \(dp\) 的意思,设 \(f_i\) 表示第 \(i\) 个是一个段位置结束的方案总数,那么有

\[f_i=\sum_{j<i \and num(j+1,i)\le K}f_j \]

其中 \(num(l,r)\) 表示 \(l\sim r\) 中出现次数为一的数字的个数。

我们考虑,能否动态的维护这东西,考虑一个区间怎么才能合法,比如设当前到 \(r\),第 \(l\) 位置的出现次数为一的数字的个数为 \(c_l\),我们当前这个数字是 \(x\),不妨设他上一次出现的位置是 \(p_1\),上上次出现位置为 \(p_2\),没有则为 \(0\)

那么应该是对于 \(l\in [p_1,i)\) 来说 \(+1\),对于 \(l\in [p_2,p_1)\) 来说 \(-1\) 即可。然后对于这些段里的,我顺手还有维护 \(c_l\)\(\le K\) 的那些位置的 \(f\) 的总和。

发现可以用分块维护,令 \(B(i,j)\) 表示第 \(i\) 块中,\(c\)\(j\)\(f\) 的总和,对于块内修改直接暴力重构,对于整块的修改可以打标记,由于只会实现加减一操作,直接把对应位置的值减去或者加上即可。

我们可以在暴力重构的时候下放标记,否则可能会出现 \(c_l<0\) 的情况导致数组越界。

还有一个有趣的就是 \(c_i\) 的值其实不会超过 \(\frac{N}{2}\) 的。

杂题

树的直径

[CF842E]Nikita and game

一个奇怪的题目,问你给树每次添加一个叶子,然后问有多少个叶子可能是直径的端点?

emmm,奇怪的复杂度分析,我怎么刚开始就像不到呢。考虑,树里的直径在树上肯定有一个公共部分。于是直接用两个集合 \(S\)\(T\) 来维护这个公共部分两边的集合。

然后加入一个叶子的时候,和 \(S\) 里的一个东西,和 \(T\) 里的一个东西看一下距离。

然后如果是直径那么长,就分别加到 \(S\) 或者 \(T\) 里。

否则,如果比直径还长,不妨设到 \(S\) 的距离比直径长,那么 \(T\) 集合就变成了这个新的叶子。

需要注意的是,可能之前的 \(T\) 集合里的叶子也会变成新的直径的端点,所以不能直接删,要扫一遍 \(T\) 集合然后可以的加到 \(S\) 集合里。

值得注意的是,这样子做的复杂度是对的,因为一个叶子不可能反复横跳。

证明大概就是,我们考虑一个节点 \(u\) 能从 \(T\) 变到 \(S\),那说明他到这个新叶子 \(l\) 的距离比到 \(S\) 的距离要长(只长一个长度),那么只可能是原来到 \(S\) 里的点的距离和他原来到 \(T\) 里的点相等才行,那么下次如果他还能反复横跳,只可能是 \(S\) 这边又添加了一个节点 \(x\)。但是,新的节点明显到 \(l\) 的距离比到 \(u\) 的距离长。所以不可能。

网络流

费用流

ARC137-E - Bakery (atcoder.jp)

非常diao的一个题目。。

我们考虑,我先想了一手能不能dp,发现不行,这个面包的状态不太好处理啊。

然后发现就很网络流啊,我们如果是跑费用流啥的,自然可以限制住每天的流量,然后一个面包师自然可以是建立一条边。

我们不妨把面包看成是流量,然后假设我们可以整所有的面包利润,那么就是 \(D\sum _{i=1}^N A_i\)。然后减掉跑网络流的费用。

我们考虑,如果浪费一个面包,这个利润就会少 \(D\)。强制每天的最大流量都是 \(M\),于是对于每一天 \(1\le j \le M\),连边 \((j-1,j,A_j,D)\)\((j-1,j,M-A_j,0)\)

然后考虑,面包大师傅的改变。连边 \((l_i-1,r_i,1,C_i)\)

然后考虑总的答案减去这个最小费用即可。

然后注意的是,spfa会 TLE。我们可以跑 dijkstra 费用流。

就是说,每次的边变成了 \(w+h[x]-h[y]\),然后最后的距离应该减去一个 \(h[S]-h[T]\)。每次势函数的变化就是这次的 \(dis[x]\)

然后费用流就别写 Dinic,直接跑EK吧,时间复杂度 \(O(MN\log N)\)

posted @ 2022-02-02 19:54  siriehn_nx  阅读(82)  评论(0编辑  收藏  举报