牛客OI周赛13题解
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