CF1799

A

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

B

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

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

C

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

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

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

D

O(n2) 的 dp 不需要脑子:fi,j 已经处理了前 i 个任务,一个电脑的最后一个任务是 ai,另一个电脑的最后一个任务是 j。然后 fi,j 会转移到 fi+1,j,fi+1,ai,直接 dp 即可。

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

E

不想写!

F

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

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

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

G

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

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

H

F(i) 表示钦定 i 号点在最后的连通块内,删边的方案数。那么最后的答案就是 1ki=1nF(i)

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

然后改成换根 dp 即可,复杂度 O(n3k)

posted @   蒟蒻_william555  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示