2024.11.17 近期练习

这大概是最后一篇近期练习了。

P8365 [LNOI2022] 吃

与 CF2023F 很相似,对于 ai 分类,ai 相同的最多只会选 bi 大的前 logaiV 用于加。
所以考虑 dp,设 fv 表示少乘了 v 的贡献后最多可以加多少。转移考虑背包。
复杂度 O(VlogVloglogV)
但是,观察到:ai=1 的指定是选择加法。将这些数累加到 x 里。
假设选择两个 ai>1 的,不妨取 bi 更大的那个,显然更优因为 2max(bi,bj)bi+bj
所以,只会选择一个 ai>1 的物品用于加法。那么就很容易做了。选出最大的 x+ba 的物品。

qoj # 7864. Random Tree Parking

考虑先找充要条件,可以转化为开进 u 的车的数量不超过 u 到根的路径点数,且必须有 1 辆。
那么 dp 状态就可以设出,设 dpu,k 表示 u 往上开的车的数量为 k 的方案数。
由于是随机树所以 k 的取值很少。
转移枚举当前位置有 cu 辆选择。考虑多重集排列计数,只需要算所有方案的 1cu! 的和乘 n!

qoj # 8049. Equal Sums

dpi,j,v 表示 kiakkjbk=v 的方案数。我们只关心 dpi,j,0
对于 dpi,j 而言,其不仅能从 dpi1,j 转移也能从 dpi,j1 转移,但是我们只需要转移一次。
这启示我们要构造一种转移的方式,使得要存的值域变小。
如果 dpi,j,kk>0 就从 dpi,j1 转移;否则就从 dpi1,j 转移,这样值域是 [V,V] 的,减少一个 n
前缀和优化,复杂度是 O(nmV)
虽然我们减少了某些状态的存储,但是他们对答案都是没有贡献的(无需贡献)。
也就是每种方案都有唯一的方式确定。

qoj # 9479. And DNA

考虑拆位处理,从最低位开始。
如果该位 m=1,那么相邻三个数是 101,011,110,010 的一种,考虑矩阵快速幂求方案数。
如果为 0,那么相邻三个数是 000,001,100,111 中的一种,注意到只能是全 0 或全 1
考虑有进位,相当于 m=0/1 的情况调换。
所以 dp 即可,设 dpi,0/1 表示最低的 i 位,有无进位的方案数。

qoj # 9489. 0100 Insertion

考虑将序列翻转,变为 0010。
考虑用折线描述这个 0010,考虑 0 设为 11 设为 +3,那么形成 1,2,+1,0 的形式。
充要条件为:和为 0;不存在相邻的 1;且对于每个 1,设高度为 h,则之前最大值必须不小于 h1
因为一个 0010 和为 0,所以在 0010 里面插入是没有影响的。
dp,设 fi,j,k,0/1 表示当前填到第 i 个,历史最大值为 j,当前和为 k,上一个是 0/1 的方案数。

qoj # 8542. Add One 2

神仙题了。方便起见将序列两端放一个极大的数 b0=bn+1=M。考虑一个 b 序列如何合法。
加法倒过来变为减法。差分,如果 bi>bi+1,那么必须存在至少 bi+1bii 前缀减。
反之同理。那么充要条件是对于 ibij=inmax(bj+1bj,0),bii=1jmax(bjbj1,0)
注意到,只需要 b0,bn+1 都满足条件即可,比如对于第一个条件,显然是 i 越小条件越苛刻。
因为 M 足够大,且 b0=bn+1,所以 j=0nmax(bj+1bj,0)=i=1n+1max(bjbj1,0),下降=上升。
所以二式可以相加,则 j=0n|bjbj+1|2M
现在相当于 bi=ai,可以花费 1 的代价使得 bibi+1,最后使得 j=0n|bjbj+1|2M
考虑建出大根笛卡尔树,只有把一个区间里的全部抬升才会减少上式,按照区间大小贪心即可。

NFLSPC #7 T2

考虑计算一种情形的最小分组个数。从小到大分组,考虑值域的前缀的答案。
如果 i 的有 cnti 个,每组最多 i 个,那么势必要分 cnti/i 向上取整组。这是将大限制拆成小限制。
要想得到这个限制呢,你可以考虑检验一个分组个数 k,那么必须有 cntiik 对吧。
那么问题就变成了:后缀加 1,全局查询最大的 ai/i 向上取整。
考虑拿出所有的 ki+1,当这么多值的时候,贡献为 k+1,二分出这样的位置即可。
考虑扫描线枚举 i,并维护当前的每个时间加的值,树状数组维护,然而 O(nlnnlogn)

P2779 [AHOI2016初中组] 黑白序列

显然的 dp,设 dpi 表示前缀 i 的答案,枚举最后一个黑白序列的长度,设从 j 转移。
求出 ri 表示 i 右边第一个 W 的位置,li 表示 i 左边第一个 B 的位置。
那么转移的条件是 lii+j2rj+1,拆开成 j2lii,i2rj+1j
我错认为这是三维偏序,但事实上,因为偏序里存在 i,我们递推时间轴的时候是存在单调性的。
也就是说,当时间 2rj+1j 的时候,j 才可能有贡献,这样第二个条件就已经解决;
于是我们只需要一个树状数组维护第一个条件即可。

ARC187C 1 Loop Bubble Sort

根据冒泡排序的性质,每次操作是将第一个数移动到第一个比它大的位置前,然后这个位置继续移动。
所以对于一个位置,如果其前面没有比它大的数,那么它就会往后移动;否则向前移动 1 个位置。
也就是经典结论:设 ci 表示 1i1ai 的个数,冒泡一次就是整体减一,跟 0max 再左移。
注意到:对于一个固定的 P,答案为 2x1,其中 xci=0 的个数。即为除去 n,对应原来 c1/0
ci=0 的个数相当于前缀最大值的个数。按照计数排列的套路,考虑从大到小填入数字。
所以直接设 dpi,j 表示填了 i 的数,当前第一个前缀最大值在 j。考虑前缀和优化即可。
但是需要保证填出来的 P 合法。只需要保证最后一个位置为 n 即可。

P6383 『MdOI R2』Resurrection

我躺尸。考虑将 G 定向,从小的定向到大的,不难发现每个点只会有一条出边,即形成一个内向树。
所以我们决定每个点的出边连向哪里即可。
先考虑链的情况,然后得出充要条件是儿子连的点势必比父亲连的点小。这个非常关键。
然后树形 dp 即可。

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