======2020牛客暑期多校第九场====== [[https://ac.nowcoder.com/acm/contest/5674|比赛链接]] =====A.===== **solved by Bazoka13** ====题意==== 给一个$2$进制表达式,求出十进制结果 ====题解==== 使用$python$的$eval+replace$,一行$AC$ =====B.===== **upsolved by JJLeo** ====题意==== 给出一棵以$1$为根的有根树,节点数为$n$,你需要做一次dfs,每一次经过一条边都要减少权值,第一次到每个点可以增加权值,要求任意时刻权值不为负,你可以在任意点花费任意秒增加对应的权值,经过边不耗费时间,问最少需要耗费多少秒。$(n \le 10^5)$ ====题解==== 处理出以每个节点为根的子树中,如果以$0$权值进入那么全过程所处权值最小值的最大值$a_i$,以及子树权值和(边两次,点一次)$b_i$。进入某个节点,考虑合并,即遍历子树的顺序,先走$b_i>0$的,再走$b_i<0$的,前者按$a_i$从大到小排序,后者按$b_i+a_i$从大到小排序,最后答案是$a_1$,正确性证明过于离谱。注意进入每个点后要考虑这条父边的负边权,进入后可以获得这个点的权值,另外每个点回溯到父亲时也要再次考虑这条边的负边权。 =====C.===== **upsolved by JJLeo** ====题意==== 给定$n$个区间$[l_i, r_i]$,边界均为非负整数,每个区间有$\frac{1}{2}$的概率被选,求选择区间交集整点个数平方的期望,对$998244353$取模。$(1 \le n \le 5 \times 10^5, 0 \le l_i,r_i \le 10^9)$ ====题解==== 首先注意并不是求区间长度,而是整点个数,因此离散化时右端点要加一。\\ 其次考虑如果求整点个数之和的期望怎么做,只需要离散化后扫一遍确定每个区间被覆盖了几次即可,设离散化后的一个区间出现了$x$次,该区间的整点个数为$y$,则对分子的贡献为$y(2^{x}-1)$,最后除以分母的$2^n$即可。\\ 而本题需要求平方的期望,因此对于离散化后的一段区间,不能仅仅单独考虑它自己,还要考虑当它是交集一部分时与其它同处于交集一部分区间互相之间形成的贡献。例如对于一段区间整点个数的平方和可以进行如下分解$${(x+y+z)}^2=x(x+y+z)+y(x+y+z)+z(x+y+z)$$因此对于每一个离散化后的区间$i$来说,若考虑所有覆盖它的原始区间,可以得到离散化后的所有区间各被覆盖了多少次,设一个区间被覆盖次数为$x$,整点个数为$y$,则区间$i$对于分子的贡献即为$$y_i\sum_jy_j(2^{x_j}-1)$$整个过程使用线段树来一遍扫描线,线段树维护每一段整点个数乘以权值(因此区间加的时候要乘以整点个数),通过$\times 2 + 1$与$-1\times \frac{1}{2}$即可完成对上述值的维护。最后除以分母的$2^n$即可。 =====D.===== **upsolved by JJLeo** ====题意==== 给定一棵$n$个点的树,$i$号点上有$i$号人,第$i$条边只能允许$[l_i,r_i]$的人通过,每个人可以强行走$k_i$次不允许走的边,问$i$号人能到达点的个数。$(2 \le n \le 10^5, 0 \le k_i \le 1)$ ====题解==== 首先dfs一次确定所有点的父亲以及深度。接下来上线段树分治,启发式合并维护一个比较特殊的并查集,每个并查集里面是一个连通块,除了常规的fa和siz,还要维护连通块最浅点以及所有“儿子”的siz之和。最后答案如果$k_i=0$则直接返回siz否则返回siz加上最浅点父亲所在连通块大小以及所有儿子的siz之和。可以发现这几个东西都是可以撤销的,细节比较多,一定要注意每个量的具体含义以及操作的顺序。 =====E.===== **solved by 2sozx** ====题意==== 求 $\prod_{i=a}^{b}\prod_{j=c}^{d}gcd(x^i,y^j)$,$0\le a,b,c,d\le 3 \cdot10^5,0