A. 辣鸡(ljh)

模拟。

对于同一块内的答案,直接统计。

对于不同块内的,

枚举i和大于i的$j=i+1~n$,

一个有效的剪枝:

以$x_1$为第一维排序,当$x_{1j}>x_{2i}+1$时break退出循环。

然而如果用纵向链状的数据还是会被卡成$O(n^2)$,然而出题人没有卡。

一个更好的方法是每次按不同条件排序,二分查找真正有效的区间并统计答案。

总的氢键区间个数与N线性相关(至少我构造不出特殊数据),可以保证复杂度为排序和二分的$O(nlogn)$。

然而我调不出来。

 

 

 

B. 模板(ac)

考场上打了70分算法:

对于前30分,直接暴力翻父亲。

然而我忘记了使用给定的桶数组,一分没有。

对于k>=m的数据,无需考虑桶数组。

由叶节点向根合并线段树即可。

然而我的快读打错了,判断负号位置错了,只拿了15分。

正解:

以时间(操作时间)为下标的线段树,启发式合并。

线段树中维护的是当前节点每个操作后的cnt(球的个数)和sum(答案)。

处理每个节点的重儿子(在本题中为子节点数+操作数最大的儿子),

对于每个节点,首先dfs轻儿子,并清空线段树。

然后dfs重儿子,并将线段树继承。

接着用另一个函数dfs每个轻儿子及轻儿子的子树,把这些信息补充到线段树里。

线段树的信息完全了,我们的要求是 cnt数恰好为$k(x)$ 或 全部操作结束

之前的sum值总和,以平衡树找k小值的思想,在线段树上二分查找即可统计该点的答案。

应当注意的是,每种颜色的球只在它第一次出现,对答案作贡献。

但第一次更新不意味着第一次出现,可以维护一个数组表示每个颜色第一次出现的位置,可以更新数组时就更新。

关于复杂度:

每次对于一个节点,继承它的重儿子的信息。

因为每个节点到根节点的轻边数不超过$logn$,

所以每个节点当且仅当它的祖辈被当作轻儿子时被dfs扫描,

所以每个节点被dfs不超过$logn$次。

线段树单次操作为$O(nlogn)$,故总复杂度为$O(nlog^2n)$

 

 

 

C. 大佬(kat)

最简单的一道题,然而考场上只想到了k=2的做法,打了n<=8的暴搜。

当时的想法是:

第一道题只在第一天有效,最后一道题只在最后一天有效,

然而中间的题会在总共k天有效,显然不能处理每个k道题,最后乘$(n-k+1)$啊。

 

然而被事实打败了:

不妨考虑方案数,不管在哪一位,每种状态的方案数都是相同的。

处理每个k道题,

以下三式中g(x)均为k道题中最大难度为x的方案种数。

$ans=\frac{\sum\limits_{i=1}^{m}g(i)*w[i]}{m^k}*(n-k+1)$

即化为总权值,除以总方案数,得到期望。

 

柿子一:$g[x]=x^k-(x-1)^k$

则每道题有x种选择,要除掉不合法的状态,即最大难度不是x,

根据简单的容斥,答案为$x^k-(x-1)^k$。

 

以下两式参考Yu-shi

柿子二(DuanYue):$g[x]=\sum\limits_{i=1}^{k}C_k^i(x-1)^{k-i}$

组合数的理解,比较显然。

枚举从k中选取几个最大值,其他在最大值一下随便选取,求和为答案。

 

柿子三(remarkable):$g(x)=\sum\limits_{i=0}^{k-1}x^i(x-1)^{k-1-i}$

不会直观理解,但是是对的。

由数学归纳法,

显然当$x=1$时,$g(x)=1$,是正确答案。

当$x>1$,$g(x)=g(x-1)*x+x^0*(x-1)^{k-1}$,

$g(x-1)$为$x-1$时的合法方案,一定包含至少一个最大值,所以第k位可以任意选择。

$(x-1)^{k-1}$为$x-1$时的非法方案,第k位必须选择最大值。

且后者一定不包含最大值,所以两者相加是不重不漏的。