多校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\) 的转移可以枚举后缀和与当前的树的情况。

  1. 连入一个必输的根 \(sum_0 = sum_0 \times \sum dp_{i,0},sum_1 = sum_0 \times \sum dp_{i,1}\)
  2. 连入一个必胜的根,都不变,连在任意处都可以 \(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,有点失败,希望最后几场模拟赛能再提升提升实力。

posted @ 2024-11-22 20:58  碧蓝新星  阅读(39)  评论(3编辑  收藏  举报