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{sumlimits_{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]=sumlimits_{i=1}^{k}C_k^i(x-1)^{k-i}$
组合数的理解,比较显然。
枚举从k中选取几个最大值,其他在最大值一下随便选取,求和为答案。
柿子三(remarkable):$g(x)=sumlimits_{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位必须选择最大值。
且后者一定不包含最大值,所以两者相加是不重不漏的。