2024.7.19 近期练习

AGC060C

由于 \(A,B\) 分别位于树的左链和右链,所以我们不妨把这两个链剥出来。
考虑从小到大加数,从根开始向叶子加。
不妨设 \(f_{i,j}\) 表示左链加 \(i\) 个数,右链加 \(j\) 个数,并且最后分别是 \(i\) 先的概率。
传统外向树拓扑序是 \(n!\prod \frac{1}{siz(i)}\),即填到 \(u\) 时,把 \(u\) 子树的点全部分配好,使最小值放在 \(u\) 处。
转移的话,假设从 \((i,j)\) 转移到 \((i+1,j)\),也就是把 \(i\) 子树和 \(j\) 子树的点都分配,使得最小值放在 \(i\) 处。
概率是 \(\dfrac{siz_i}{siz_i+siz_j}\),转移容易。答案是 \(\sum_{i<B}f_{A,i}\)

AGC002E

我们把 \(a_i\) 从大到小排序后可以转换为这样一个模型,有 \(n\) 行格子,从下到上第 \(i\) 行有 \(A_i\) 个。
那么,我们每操作一次就是向右或向上走一格,一开始在最后一行第 \(0\) 个。
我们通过妙手观察发现 \((x,y)\) 这个点的状态等于 \((x+1,y+1)\)
于是我们找对角线上第一个出现的点,这个点只能往右或向上一直走,判断奇偶性即可。

CF623B

考虑枚举 \(\gcd=d\),我们先假设没有 \(a\) 操作,所有数都需要 \(b\) 操作来实现。
那么,形如 \(kd\pm 1\) 的数需要代价为 \(b\)\(kd\) 的数无需代价,然而可能存在没法通过 \(b\) 操作被 \(d\) 整除的数。
若没有上述数呢,我们现在加入 \(a\) 操作,这是一个最大子段和问题,求出一个子段使得省去代价最多。
如果有上述数,那么必存在 \([l,r]\) 是必选的,那么我们左右找省去代价最多的前后缀即可。
然而我们还要枚举 \(\gcd\),观察到 \(A_1,A_n\) 有一个必选,所以 \(d\) 很少。于是我们分解质因数出来即可。

CF653E

如果有解那么去掉 \(1\) 后连通块个数不超过 \(k\),并且 \(1\) 到这些连通块都有边。
我们用 bfs 找连通块,同时维护一个 set,代表还没去过的点,如果当前到 \(u\),那么就在 set 里找 \(v\)
因为只有 \(m\) 条边被删去,所以 \(u\to v\) 最多匹配失败 \(m\) 次,复杂度是 \(O((n+m)\log n)\)

CF1139D

这是个经典的期望模型,不妨设 \(f_i\) 表示 \(\gcd =i\) 时到 \(1\) 要多少步,\(f_1=0\)
我们现在看 \(f_y\) 怎么转移到 \(f_x\),一定满足 \(y|x\),枚举 \(x\) 下一位是什么,
可以列出 \(f_x=1+\dfrac{1}{m}\sum_{i=1}^m f_{gcd(x,i)}\),除去 \(\gcd(x,i)=x\) 的情况,\(\dfrac{m-(m/x)}{m}f_x=1+\dfrac{1}{m}\sum_{i \not |x} f_{gcd(x,i)}\)
\(f_x=\dfrac{m+\sum_{i \not |x} f_{gcd(x,i)}}{m-(m/x)}\),枚举 \(\gcd\),我们即求有多少个 \(i\in[1,m]\) 使得 \(\gcd(x,i)=y\)
即数多少个 \(i\in[i,m/y]\),使得 \(\gcd(x/y,i)=1\)
\(n=m/y\)\(k=x/y\),考虑莫反,即求 \(\sum_{i=1}^n\sum_{d|i,k}\mu(d)=\sum_{d|k}\mu(d)\cdot n/d\).
我们可以预处理约数,总的复杂度约为 \(O(n\sqrt n)\)

CF1088E

我们观察到,如果 \(x_i=x_j\),那么 \(i,j\) 的邻居指定相同(包括本身)。
所以我们发现,邻居相同的,我们可以直接构造他们为相同的权值。
那么,我们把所有邻居相同的缩点出来,形成一张新图,那么图上相邻的两点权值不同。
所以有度数 \(\ge 3\) 的点肯定无解,有环肯定无解,所以最后就是一个链了,顺序染色即可。
可以用哈希来判断邻居集合。

CF547D

考虑一个经典的套路,一个点拆成 \(x\)\(y\),并连接 \(x,y\),现在要给边定向,使得所有点出入度的差 \(\le 1\)
我们联想到了欧拉回路。然而如果有奇点怎么办呢?由于奇点个数是偶数,所以两两配对再连边。
这样的话,图中只有偶点,欧拉回路跑一遍,这样出入度之差为 \(0\),即使奇点间有边也不影响差 \(\le 1\)

P9130 [USACO23FEB] Hungry Cow P

我们第一眼是线段树分治+维护连续的段,然而因为维护连续段是均摊复杂度,所以是做不了的。
我们考虑用线段树维护,每个点 \(A_i\) 转化为 \([i,i+A_i-1]\) 的一段区间,现在考虑合并。
我们要记录的是左边区间超出多少,现在要加到右边去,到底最后会加在哪可以再线段树二分。
类比楼房重建的 \(O(\log n)\) 合并。

P5278 算术天才⑨与等差数列

一个区间是重排成等差序列的条件是,\(\max-\min=d(r-l)\),区间内互不相同, 且差分后 \(\gcd=k\)
区间内互不相同我们对于每个位置维护一个 \(pre\) 代表上一次出现,\(pre\) 最大值一定小于左端点。
可能会联想到 Hash,但是正确性有待商榷。

CF702F T-shirts

我们考虑调换贡献方向,用商品去买人。
那么我们要做的是品质从大到小枚举,并且令所有 \(b\ge c\)\(b\) 全部减去 \(c\)
那么我们如何模拟这个过程呢?注意到 \(b\) 相对顺序事实上会改变,那么我们无法用线段树解决问题。
注意到一个点改变了其所在位置,那么它的 \(b\) 一定减少了超过 \(1/2\),所以总共位置改变是 \(O(n\log V)\)
把平衡树 split 成 \([0,c)\cup[c,2c)\cup[2c,\inf]\) 三部分,第二部分直接插入到第一个部分,第三部分打 tag。
复杂度是 \(O(n\log n\log V)\)

P3665 [USACO17OPEN] Switch Grass P

通过观察题解发现意识到答案一定是一条边,且一定在最小生成树上。
那么我们现在维护一个树上问题。考虑在父亲节点存储其所有儿子的颜色及权值。
用动态开点线段树,每次查前后缀最值。每次修改只需要动父亲的线段树。

CF17C

很巧妙的 dp。如果我们设 \(dp_{a,b,c}\) 表示已经填了前 \(a+b+c\) 位,当前分别有 \(a,b,c\) 个 abc。
我们该如何转移呢?我们发现,我们既可以从前面复制过来,也能从后面复制过来。
所以我们设 \(dp_{i,a,b,c}\) 表示已经填了前 \(a+b+c\) 位,前 \([1,i]\) 已经不能用于复制。
那么转移是 \(i\) 转移到下一个 \(a,b,c\) 出现的位置,用于复制,这个 \(i\)\(a+b+c\) 的大小没有关联。

CF1842H

首先我们把所有数减去 \(0.5\),那么变成所有数在 \([-0.5,0.5]\) 内均匀随机,有若干 \(>0\)\(<0\) 的限制。
限制可以转化为 \(x_i>-x_j\),或 \(x_i<-x_j\),现在我们按照绝对值的大小从小到大加数。
那么最后的概率怎么求呢?我们可以计算合法的方案数除以 \(n!2^n\),即全排列和随机赋正负号。
我们记录当前所有数的状态:是正数还是负数还是未填,转移的时候,我们看限制是否满足。
然而这样做是 \(O(3^nn)\) 无法通过,考虑把“是正数还是负数”压缩一下。
因为当前 \(|x_i|>|x_j|\),所以如果 \(x_i\) 为正,那么 \(x_i>-x_j\),无论正负;反之亦然。
所以复杂度是 \(O(2^nn)\)

P9746 「KDOI-06-S」合并序列

我们处理区间 \([l,r]\) ,要找 \(l\le s\le x\le y\le t\le r\),满足 \([l,s],[x,y],[t,r]\) 合法,并且异或起来为 \(0\)
这样的话转移是 \(O(n^4)\),状态数为 \(O(n^2)\),这是无法优化,所以优化转移。
发现 \(A_i\) 很小,所以把 \(A_i\) 放进状态,于是我们处理 \(g_{s,t,A}\) 表示区间 \([s,t]\) 里是否存在异或为 \(A\) 的区间。
但是空间不够,删减一维放进值里,\(g_{t,A}\) 表示合法的最右边的 \(s\) 满足区间 \([s,t]\) 里存在异或为 \(A\) 的区间。
那么现在转移只需要枚举 \((s,t)\),但还可以优化,我们尝试只枚举 \(s\)
于是我们设 \(h_{r,A}\) 表示 \([s,r]\) 里存在 \([x,y]\otimes [t,r]=A\) 的最右的 \(s\),由 \(g_{r,A}\) 可以转移而来。
这样总体复杂度是 \(O(n^2)\times O(n)=O(n^3)\)

P3765 总统选举

这个题运用了摩尔投票法,具体地,每次消去两个不同的数,剩下的数就是绝对众数。
我们在线段树上维护摩尔投票的过程,显然具有区间可合并性。
然而如果没有绝对众数,最后出来是一个随机的数,所以我们需要再开 set 维护区间数的出现次数。
我们还可以随机 \(k\) 个数出来,检查其出现次数,如果有绝对众数,猜不到的概率是 \(2^{-k}\)

posted @ 2024-07-19 16:46  s1monG  阅读(16)  评论(0编辑  收藏  举报