0还是1

30分做法

爆搜。

60分做法

对于最后一个运算为异或的情况,不管前n个组成了什么,都可以通过最后一个数字调节为1。所以答案就是

100分做法

表示进行了前次运算之后,得到0,1的方案数。

如果当前位置的运算符为&。那么运算后为,只能从转移过来,并且当前位必须为1。

运算后为0,那么可以从转移过来,也可以从转移过来,而且从转移时,当前位置填0或1都是可以的。所以需要乘上2。所以转移方程就是
$$

如果当前位置的运算符为|,与&类似,只是需要将乘2,转移方程就是
$$

如果当前位置的运算符为^,那么不管前面的运算结果是什么,当前位置都只有一种填的方式将他调整为想要的。转移方程就是:
$$

摆动数列

10分做法

爆搜

50分做法

分奇数位较大和奇数位较小两种情况考虑。下面以奇数位较大为例,奇数位较小同理。

首先将所有数字离散化。

显然我们需要将所有满足的二元组选出来。用表示前i个二元组选出的最后一个二元组的y小于等于j最多可以选出二元组的数量。
转移方程就是

100分做法

观察50分做法,发现其实只需要用个树状数组维护单点修改和前缀最大值即可。

星球大战

简化题意

有一棵树。每次可以攻击树上的某棵子树,然后这棵子树上的每条边有的概率消失。定义 若攻击以为根的子树,深度子树剩余点(与连通)的最大深度。共次操作,两种: .新建一个节点,其父节点为.询问若攻击以为根的子树,子树的期望深度。 。允许有一定精度误差。

子节点个数。

Subtask2(10pts):,即

由期望的线性性,考虑计算
我们先考虑这个数据,好像比较好推。
若询问节点,答案为;若询问,z则答案为子树中任意存在一条边则深度为,所以
复杂度

Subtask1(20pts):

因为深度足够小,假设攻击节点,我们枚举其子节点的状态(到的边是否保留),所有状态出现的概率都为;然后对于所有保留了边的子节点,再枚举子节点的状态...然后求每种状态的状态的深度。
好像不太好写。但我们发现若当前节点只有一层子节点,这和是一样的;若有两层,则枚举第一层后,这棵子树深度是1还是2的概率同样可以直接算。
复杂度

Subtask3(10pts):树退化为链

链的话,路径唯一,若树深为当且仅当子树中连向条边都存在,第条边不存在。即答案为

子树最大深度。
复杂度

Subtask4(20pts):,所有询问在1操作之后

放弃枚举,考虑DP。
对于询问,只要有一个子树的深度为且其它子树深度不超过,就可以用更新答案。
所以记表示以为根,的概率。则答案为

考虑如何从转移。每个子节点有两种情况,一是存在边,对贡献的概率;二是不存在该边,概率为
类似多项式,把项乘在一起,即
(比如,深度为0,对应;深度为1,对应与一个......)
复杂度

Subtask5(10pts):

如果新建节点,则影响的点有
因为深度不超过,所以暴力向上更新即可,也就是除掉之前的项,乘上新的项。
复杂度

正解:

小了我们是可以做的。
事实上,我们不需要考虑很大的深度。假如,需要一条长的链,即至少同时存在条边,概率为,非常小。设需考虑的最大高度,则做法同
复杂度

对于的取值,你可能会认为就足够了,因为已经足够小。事实上,考虑一个菊花图,从根节点延伸出条路径,且每条路径长度为。那么以为根树深为的概率为:
这是大于的。

代码

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42452433

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42452433

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42452114