首页 > 其他分享 >CF1799

CF1799

时间:2023-02-28 20:56:07浏览次数:29  
标签:复杂度 所有 然后 CF1799 枚举 操作 dp

A

读懂题后直接模拟,重点是读懂题!

B

如果所有数不相等且最小值为 \(1\),无解,因为无法将一堆大于 \(1\) 的全部变为 \(1\)。

除此以外的情况一定有解,可以发现所有值除以一个比自己小的数,一定都不会变为 \(1\)。于是我们可以每一轮让所有大于最小值的数除以最小值,这样最大值一定会变小,每个数至多操作 \(\log\) 次,然后所有数都将相等。

C

大体上的思路是,从两边往中间填,每次往左右放最小的两个字符,如果左右不一样大了,就把剩下的字符从小到大放在大的那边。

但是观察样例发现如果当前剩下的字符形如 "abb...b",会把这个 'a' 放在最中间。

然后特判这种情况即可,注意实现。

D

\(O(n^2)\) 的 dp 不需要脑子:\(f_{i,j}\) 已经处理了前 \(i\) 个任务,一个电脑的最后一个任务是 \(a_i\),另一个电脑的最后一个任务是 \(j\)。然后 \(f_{i,j}\) 会转移到 \(f_{i+1,j},f_{i+1,a_i}\),直接 dp 即可。

然后发现这个转移很傻,每次是全局加,单点改,维护全局最大值。就可以直接打标记,再记录最大值,复杂度 \(O(n)\)。

E

不想写!

F

这个题面真的是!它这个 “choose some 1<=i<=n",不知道有多少人跟我一样认为一次可以选多个 \(i\),然后对着样例看了好久……

先把所有数从大到小排序,对于大于 \(b\) 的所有数,一定是选一个前缀做 "12" 操作,然后一段区间做 ”1" 操作,再一段做 “2” 操作。
对于不大于 \(b\) 的所有数,一定是一个前缀做 "2" 操作,然后接下来一段做 “1” 操作。

综上,最后的操作一定是 "12"+"1"+"2"+"1" 于是我们枚举前两段的长度,然后就确定了每一段的长度,就可以直接前缀和算出答案。

G

把同一类的缩在一起,那么对于每个点,都有出度 \(out_i\),入度 \(in_i\)。然后就要统计有多少满足条件的图(边带编号)。

于是就直接 dp:\(f_{i,j}\) 表示前 \(i\) 个点,有 \(j\) 条出边连向 \(i+1 \sim n\)。\(i,j\) 确定的时候,还需多少入边也就确定了,然后枚举 \(i\) 有多少出边和入边与前面匹配。分析一下复杂度,可以发现是 \(O(n^3)\)。

H

设 \(F(i)\) 表示钦定 \(i\) 号点在最后的连通块内,删边的方案数。那么最后的答案就是 $ \frac 1 k\sum_{i=1}^n F(i)$。

求一个 \(F(i)\) 可以以 \(i\) 为根树上 dp:设 \(dp_{x,s}\) 表示 \(x\) 子树内进行了 \(s\) 集合的删边操作。然后合并的时候枚举子集,一次合并复杂度 \(O(3^k)\)。枚举根来进行 dp,复杂度 \(O(n^2 3^k)\)。

然后改成换根 dp 即可,复杂度 \(O(n 3^k)\)。

标签:复杂度,所有,然后,CF1799,枚举,操作,dp
From: https://www.cnblogs.com/william555/p/17165934.html

相关文章