2024.11.17 近期练习

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

P8365 [LNOI2022] 吃

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

qoj # 7864. Random Tree Parking

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

qoj # 8049. Equal Sums

\(dp_{i,j,v}\) 表示 \(\sum_{k\le i} a_k-\sum_{k\le j}b_k=v\) 的方案数。我们只关心 \(dp_{i,j,0}\)
对于 \(dp_{i,j}\) 而言,其不仅能从 \(dp_{i-1,j}\) 转移也能从 \(dp_{i,j-1}\) 转移,但是我们只需要转移一次。
这启示我们要构造一种转移的方式,使得要存的值域变小。
如果 \(dp_{i,j,k}\)\(k>0\) 就从 \(dp_{i,j-1}\) 转移;否则就从 \(dp_{i-1,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 即可,设 \(dp_{i,0/1}\) 表示最低的 \(i\) 位,有无进位的方案数。

qoj # 9489. 0100 Insertion

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

qoj # 8542. Add One 2

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

NFLSPC #7 T2

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

P2779 [AHOI2016初中组] 黑白序列

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

ARC187C 1 Loop Bubble Sort

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

P6383 『MdOI R2』Resurrection

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

posted @ 2024-11-18 21:37  s1monG  阅读(135)  评论(0)    收藏  举报