2024.10.18 test

B

\(n\) 次操作,每次操作选择下面三个中的一个:令 \(P\gets P+x_i+S\)\(S\gets S+y_i\)\(D\gets D+z_i\)
在每次操作后,\(S\gets S+D\)。询问 \(P\) 的最大值。\(n\le 80,x,y,z\le 1e9\)

由于不可能把 \(P,S,D\) 存进状态里,考虑拆贡献,即计算每个操作对后面的贡献。
\(D\gets D+z_i\),那么对于后面每次 \(P\) 的增加操作,设操作位置是 \(j\),那么都增加了 \(z_i(j-i)\) 的贡献。
\(S\gets S+y_i\),那么对于后面每次 \(P\) 的增加操作,都增加了 \(y_i\) 的贡献。
所以后往前 dp,设 \(f_{i,j,k}\) 表示当前到第 \(i\) 次操作;增加 \(P\) 的位置下标和 \(=j\);有 \(k\) 个这样的位置。
状态数 \(O(n^4)\),转移 \(O(1)\)

C

\(1\sim 10^{115}\) 个盒子,每个盒子里有 \(A\) 个火柴,打开了第 \(i\) 个盒子,就必须用火柴拼出其数字,拼数字 \(j(j\in[0,9])\) 需要划分 \(a_j\) 火柴。火柴可以留下来,问第一个不够拼的盒子。

考虑 dp,划分子任务。若我们在首位填了 \(1\) 之后,那么就相当于后续的 \(A\) 都减少 \(a_1\)
\(f_{i,j,0/1},g_{i,j,0/1}\) 表示当前还有 \(i\) 位,当前 \(A\) 的取值为 \(j\),填完后面位置前缀最小值以及总和是多少。
转移比较简单。这个是有结合性的,类比线段树维护前缀最小值的两个区间合并。
最后贪心的大到小填每一位即可。

D

一个无向图,给每条边赋 \(0,1,2\) 中一个权值,满足每个简单环权值都是奇数,且一个点的连边不能有两条边权值 \(\bmod 3=1\)。问最小权值。\(n,m\le 10^5\)

观察得出,环不能有共用边,否则无法满足每个环权值都为奇数。
所以这是一个仙人掌,建出圆方树后简单 dp 即可。

posted @ 2024-10-18 15:31  s1monG  阅读(9)  评论(0编辑  收藏  举报