多校A层冲刺NOIP2024模拟赛25
多校A层冲刺NOIP2024模拟赛25
前言
唐了,T2重构了两遍,但把一开始的代码调整一下便可通过,唐到用一个有4种取值的vis分讨。😡
图
签,bitset。
题解是用long long将 m 状压,感觉不如 bitset 🤓
序列
先考虑确定了有哪些操作后怎么做,显然最优的顺序是先赋值,再进行加法,最后乘法。
现在考虑如何将所有操作统一起来一起维护。
对于赋值,肯定只会赋值一次,所以直接处理出来即可,$ ans = ans \times \frac{y}{a_i},a_i = y $。
对于乘法,直接乘即可 $ ans = ans \times y $。
对于加法,肯定要先加大的,所以每个 \(i\) 肯定是从大到小依次加入 \(ans = ans \times \frac{a_i' + y}{a_i'},a_i = a_i + y\),此处的 \(a_i'\) 表示 \(a_i\) 在当前的值(算上已经计算过的加法与赋值操作)。
所以每次便是乘上一个数 \(k\)
\( t = \begin{cases} \frac{y}{a_i}, &t = 0 \\ \frac{a_i' + y}{a_i'}, & t = 1 \\ y, & t = 2 \end{cases} \)
用优先队列维护即可。
树
先考虑一棵树。
很容易求出在 \(root = 1\) 下所有点的输赢情况。
考虑接入一颗树,由于是同一颗树,所以可以在原树上直接考虑 (后话)。
当我们接入一个根为必败的树时,接入的点一定会变为必胜点。
接入必胜点时,对任何点都没有影响(因为不会有人想要走这里)。
所以设 \(dp_{i,0/1}\) 为 \(i\) 子树内接入一棵树后这个点必输/必胜的方案数。
但是我们接入一个树,这棵树的根不一定是原来的根,所以需要对每一个点都求出以这个点为根的 \(dp\) 值。
所以需要换根(后面再提,先说思路)。
现在将问题扩展到D颗树,由于每次都是相似的转移,所以可以从后向前求答案。
我们设 \(sum_0\) 为所有(当前考虑到了的所有树)的必输方案数(为根),\(sum_1\)则为必胜。
设 \(cnt_{0/1}\) 为单个树中必输/必胜的点的数量。
\(sum\) 的转移可以枚举后缀和与当前的树的情况。
- 连入一个必输的根 \(sum_0 = sum_0 \times \sum dp_{i,0},sum_1 = sum_0 \times \sum dp_{i,1}\)。
- 连入一个必胜的根,都不变,连在任意处都可以 \(sum_0 = sum_1 \times cnt_0,sum_1 = sum_1 \times cnt_1\)。
发现可以直接使用矩阵快速幂维护。
转移矩阵:
\( \begin{vmatrix} sum_0 & sum_1 \end{vmatrix} \times \begin{vmatrix} \sum dp_{i,0} & \sum dp_{i,1} \\ cnt_0 & cnt_1 \end{vmatrix} \)
好了,最后就是如何换根了。
对于一个点,枚举儿子进行转移。
如果这个点没有任何必输点或当前的儿子就是它唯一的必输点,则它无法进行必输转移,因为还有其他的必输点。
否则,儿子的输赢根本不用管。
换根的话直接将父亲放在它儿子,像儿子一样处理即可(有空再补吧,希望我还能记得这个逆天东西)。
然后在回溯回去就行了。
字符串
严格小于 T3,线段树维护相邻字符的数量,答案就是逆序对个数 +1。
后记
感觉整场都在打T2,有点失败,希望最后几场模拟赛能再提升提升实力。