To_Heart—题集——孤独的人他就在海上撑着船帆

1.CF1147F

link && submission

是 稳定婚姻匹配 的板子。所以重点是介绍稳定婚姻这一类问题的解决思想。

稳定婚姻问题指的是有 n 个男生和 n 个女生,每个男生内心都对女生喜欢度的排序,每个女生对男生也有各自的喜欢度的排序。现在邀你构造一种匹配使得不存在两组匹配的四个人(以甲女甲男乙女乙男代替)出现甲女更喜欢乙男而不是甲男,乙男更喜欢甲女而不是乙女。 具体的算法流程其实很容易理解,直接将每个人的遍历顺序按照其喜好排序之后跑匈牙利即可,值得注意的是,以男生先开始匹配为例,如果男生寻找的女生本来就有对象且对象比当前男生更喜欢,那么当前男生就要去找下一个男生。

回到这道题。对于这一类在二分图上面行走的问题,可以转换为是否能构造符合题意的完美匹配,如果可以那么后手必胜。所以我们先考虑自己是后手,并假定 A 选择 I,(如果选 D 就转换权值),如果 A 选择开始的点大于 n 那么把整个矩阵转置。然后发现考虑两组匹配 (a,b) (c,d),A 从 a 起手,那么一定有 w(a,b) > w(b,c),w(b,c) < w(c,d) 考虑什么时候只有 (a,b),(c,d) 而没有 (b,c),(a,d)。然后根据上面的关系可以发现匹配一定不存在 w(c,b)<w(a,b) 且 w(c,b) > w(c,d)。你发现这个是稳定婚姻模型。

2.ARC093F

link && submission

首先无论把“我”放在哪个位置的答案是一样的,所以直接固定我在下标为 \(1\) 的位置,最后答案乘 \(2^n\) 就好了。然后发现打败我的 \(m\) 个数不能成为区间 \(\left[ 2^{k-1} +1 ,2^k \right]\) 的最小值,这样它们就能在和 我 相遇之前被比他小的数打败了。但是这样并不好算,考虑容斥。先将 \(m\) 个人按标号从大到小排序,定义状态 \(dp_{i,j}\) 表示 \(m\) 中前 \(i\) 个人组成的最小值状态为 \(j\) 的容斥系数。那么新加入的一个数无非两种情况,一种是增加 \(m\) 中元素是最小值的区间的数量,第二种是直接把这个数放到已经由 \(m\) 中元素成为最小值的区间里面。你发现我们一开始排序了所以这种直接放在哪个区间都是没问题的。而对于第一种的转移,如果要把当前数放进区间 \(k\),一共可以放的数有 \(2^n-j-a_i\) 个,其中 \(a_i\) 表示当前枚举的值, \(j\) 表示枚举的前 \(i-1\) 个数的状态(你发现状态定义的妙处就是可以直接用状态表示数量),那么要选择的数有 \(2^k-1\) 个所以就是 \({2^n-j-a_i} \choose {2^k-1}\) 的方案数(这里可以直接减去 \(a_i\) 是因为排序了)。然后考虑内部的顺序所以在乘一个 \((2^k-1)!\)

最后容斥的时候注意,对于每个状态 \(i\) 我们只规定了 \(i\) 个数的位置以及 \(1\) 的位置,其他数可以随便选地方所以每个容斥系数还要乘 \((2^n-i-1)!\)

3.AGC016F

link && submission

你敢相信我在这道题上面学博弈?

因为两颗石子互不影响,所以最终的先手必胜条件就是状态中满足 1 号节点和 2 号节点的 sg 函数异或和不为 0。这个可以推广到很多颗。

转移较为常规,定义 \(dp_i\) 表示考虑了 \(i\) 里面为 1 的点的联通状态,此时符合条件的方案数。枚举状态子集,根据定义 1 和 2 不能同时出现在子集中。然后就没了?

4.luoguP3959

link && submission

发现 k 和深度有关,所以定义状态 \(dp_{i,j}\) 表示联通状态为 i,当前深度为 j 的最小值。转移的话枚举子集即可。

这道题的启示是在状压里面很多时候是要什么就定义什么,因为状压很多东西的规模都很小。甚至不如把这个直接大胆放到所有的 dp 里面,面向数据设计状态。

5.luoguP8860

link

挺厉害的吧。

先来找规律。发现每次查询的边如果能被删除那么一定是第一次就被删除了,否则后来边越来越少他反而不容易删除。定义 di 表示每条边被查询删除的最早时间,如果没被查询就令 di=n+1(正无穷)。这时候发现肯定要尽量走 di 大的点,所以转换为按照 di 为点权优先走大的,如果一条边不在上面就可以被删除。

这个实现用链式前向星很方便?但是我不会不想写因为口胡即正义!

6.CF1867E2

link && submission

如果说 \(n\%k\)0,那么每次只需要 \(k\) 个为一组的查找就行了。问题在于 \(n\%k\) 不等于 0

然后不等于 0 你发现 \(n\)\(k\) 都是偶数,所以剩下来的 \(n\%k\) 个数一定是偶数。那么把他们分成两半。前一半和前面已经处理过的组成 \(k\) 个,然后根据题目的性质,已经处理过的会倒在后面。这时候我们后面 \(k\) 个处理一下贡献就抵消了。

7.CF1408G

link && submission

把边按边权从小到大排序,依次加边发现一个团可行那么一定在这个过程中这个团会出现。建出 Kruskal重构树,出现了团就把树上当前团最高的点打标记。发现每个团的出现是包含和并列的,不存在相交,所以直接树上背包就好了。

8.CF1874B

link && submission

这道题挺有感觉的,至少我觉得很牛逼。

因为全是位运算,所以直接按位考虑。发现按位考虑后 (a,b,m) 无非 (0/1,0/1,0/1) 这 8 种状态,(c,d) 无非 (0/1,0/1) 这四种状态。我们可以看成一种初始状态对应一种结束状态,那么如果两组相同的初始状态对应的结束状态不同那一定无解。

那么一共 8 种初始状态, 4 种结束状态但是可能有的初始状态并没有出现在任意位中所以还要加 1 种状态叫做不确定。每种初始状态都对应着一种结束状态,所以状态总数是 \(5^8\)。所以我们一开始预处理出来这些状态的答案就好了。具体转移参考 0/1 最短路。值得注意的是不确定的状态,直接从任意一个确定的状态转移过来就好了。

9.CF840C

link && submission

不再低调。算是我认为的容斥神题了。

首先把每个数包含的完全平方数因子先除掉,发现剩下来的数相同就说明原数这两个能组成完全平方数。所以把所有数看成被划分成了 k 种颜色的小球,所求的方案数就是放置方式使得不存在相邻的小球颜色相同。考虑容斥 \(f(i)\) 表示相邻颜色相同的有 i 个的容斥系数。考虑把这 i 个分摊到每个颜色。每个颜色内部的相邻可以反向看作分组。设每个颜色的小球个数为 \(a_i\),分成为 \(b_i\) 组,每组内部相邻。那么显然有: $$f(s)= \frac{(n-s)!}{\prod \limits_{i=1}^m b_i !} \times \prod \limits_{i=1}^m {a_i ! \times{a_i-1 \choose b_i-1}}$$ 其中满足\(\sum b_i =n-s\)。解释的话就是 第 1 坨是每一堆小球的排序方式;第 2 坨是因为原题的颜色相同的小球不等价,所以要计算小球内部顺序;第 3 坨是小球内部的划分顺序。

对于这个式子,你把 \((n-s)!\) 提出来,两个连乘放在一起就是 $$f(s)= (n-s)! \times \prod \limits_{i=1}^m{ \frac{ a_i ! \times {a_i-1 \choose b_i-1}}{ b_i !} }$$

现在的问题是怎么求后面一坨。发现是个背包 定义 \(g_{i,j}\) 表示前 i 种颜色有 j 个块的后面那一坨系数的值。转移是

\[g_{i,j}=\sum \limits_{k=1}^{\min(a_i,j)} \frac{g_{i-1,j-k}\times {k-1 \choose a_i-1} \times a_i!}{k!} \]

除以 k 的原因是顺序全部放到外面去考虑了。你剩下的就是容斥板子了。

10.CF1580C

link

傻逼根号分治。如果 x+y 非常大,可以枚举第几个周期,数据结构维护区间加单点查询;如果 x+y 非常小,可以记录一个数组 qwq[i][j] 表示模 i 余 j 有多少价值。数据结构选择差分。放这道题的原因是第一我考试没做出来第二给你们看看神奇的数据规模从而获得 “n方百万暴力标算” 的感叹。

posted @ 2023-10-06 21:58  To_Heart  阅读(26)  评论(3编辑  收藏  举报