CF1801/1802 记录

下面是自己想到了做法的题。


下面是现场过的题。

Likes

考虑赞数最多的方案一定是所有人先赞然后取赞;赞数最少的方案一定是能取赞的人最先点赞并立即取赞。

代码

Settlement of Guinea Pigs

考虑每次检查性别之后的最坏情况是只有一只宠物和其他宠物性别均不同;而检查之后新的宠物一定需要单开住所。模拟即可。

代码

The Very Beautiful Blanket

考虑如何利用每个 \(2\times 2\) 的矩阵有占有了两行/两列各两个元素以抵消影响。此时可以将矩阵中第 \(i\) 行第 \(j\) 列的元素设为 \(2^8i+j\) 以抵消对应影响。

代码

Music Festival

考虑“存在前缀最大值”的序列一定可以占据一段前缀且按照最大值大小升序排列。此时对于每段子序列,查询出对应所有前缀最大值的位置;则其作为“存在前缀最大值”的序列时,之前接的最长序列一定是最长且满足比某个前缀最大值小的序列。枚举前缀最大值即可。

代码


下面是赛后过的题。

Buying gifts

考虑钦定了 \(a\) 对应的最大值之后,如何将 \(b\) 的最大值最优。此时比当前 \(a\) 大的二元组一定取了 \(b\),不比当前 \(a\) 大的二元组可以任取。此时后一部分一定有取最接近 \(a\) 的两个数进行讨论最优。

代码

The way home

考虑将路径钦定好之后,最优演出方案一定是在某个前缀最大值处演出到当前的钱刚好够到达下一个前缀最大值,如果能多走就一定会多走(意味着初始钱数还够就绝对不会停留)。此时只需要在前缀最大值处统计答案。到达某个前缀最大值点之后,一定有当前能剩余的钱变化后,对这个前缀最大值的决策影响不超过 \(1\) 天。所以只需要维护到达这个点的最小天数和对应能剩余的最多钱即可。

代码


下面是赛时想不到但是赛后想到的题。

Gasoline prices

考虑树是一条链的情况。此时问题就变成了 P3295 [SCOI2016]萌萌哒 但是每个数都有自己的范围并且强制在线。每个数有自己的范围不难处理(此时所有数均必须取所有范围的交内的某个数),强制在线不太好直接沿用离线做法。不过可以同样考虑并查集,将钦定相同的数的并查集合并,对所在集合不同的数的合并次数为 \(O(n)\) 次,找到从某个位置开始第一个所在集合不同的数可以二分 + Hash(可以使用树状数组 + Sum/Xor Hashing 维护对应哈希值,这样在修改某个节点的集合时能更加方便地维护所在链的 Hash 值)。在线时直接将对应链的 Hash 值拼起来即可。

代码(暂缺)

Another n-dimensional chocolate bar

为什么我一直没有看这道题啊

\(dp_{i,j}\) 为取过前 \(i\) 个数之后,满足 \(\frac k{\prod_{j=1}^i b_i}\le j\)(此时可以直接取 \(j\) 最小的部分值,则该限制可以修改成 \(\left\lceil\frac k{\prod_{j=1}^i b_i}\right\rceil=j\),此时 \(j\) 只有 \(O(\sqrt k)\) 种)时的对应 \(\max\prod_{j=1}^i\left\lfloor\frac{a_j}{b_j}\right\rfloor\)(在知道其他方案不可行之前不太能想到这一步)。则初值为 \(dp_{0,j}=[j=k]\),转移为 \(dp_{i-1,j}\left\lfloor\frac{a_i}{b_i}\right\rfloor\to dp_{i,\left\lceil\frac{j}{b_i}\right\rceil}\)(可以证明 \(\left\lceil\frac a{bc}\right\rceil=\left\lceil\frac{\left\lceil\frac ab\right\rceil}c\right\rceil\))。使用整除分块优化,可以证明单次转移的时间复杂度为 \(O(k^{\frac 34})\) 的。

代码(暂缺)

posted @ 2023-03-10 19:54  Fran-Cen  阅读(60)  评论(0编辑  收藏  举报