Solution Set -「LOCAL」冲刺省选 Round X
\(\mathscr{Summary}\)
时间利用效率?
同学,你的效率呢?
我真不知道中途几个小时干了啥,我也不知道我实在划水、神游还是真的在自闭想题。
虽然真实考场肾上腺素不会允许我这么做,但模拟赛还是得提起精神啊。
哦,我不是生竞的,上面那句话当成伪科学。
\(\mathscr{Solution}\)
\(\mathscr{A}-\) 下落的数字
给定以 \(1\) 为根的带点权树,定义 \(k-\)travel 为:从根出发,每次走到孩子点权集合中取到 lower_bound \(k\) 的点,若不存在则停下,设最后到达结点 \(u\)。现进行 \(m\) 次操作:
- 修改单点点权;
- 给定 \(k\),求当前树上 \(k-\)travel 的终止点。
\(n,m\le 2\times10^5\)。
树剖。线段树维护穿过一整段重链时,travel 值的取值区间。询问时模拟跳重链。复杂度 \(\mathcal O((n+q)\log n)\)。
\(\mathscr{B}-\) 序排速快
给出一个排序方法:
其中,称 \(i\) 为 partition point,当且仅当 \(\max_{j\le i} A_i\le\min_{j\ge i}A_j\)。对于 \(n=L..R\),求所有 \(n\) 阶排列在该方法排序完成后的 \(\textit{cnt}\) 值之和。
\(L\le R\le10^7\)。
缺的不是所谓结论,而是好看的结论。不要抓着“等价转化”不放,因而舍弃一条捷径。
显然应该对 \(A\) 的每个位置分别求被冒泡了多少次。考虑 \(A_i\) 经历一次冒泡时:
- 若 \(\exist j<i,A_j<A_i\),则这样的 \(j\) 减少一个;
- 否则若 \(\exist i\le j<k,A_j\ge A_i>A_k\),则这样的 \(j\) 减少一个;
- 否则,\(i\) 是 partition point,不会被冒泡。
结论比起我想到的要冗长,但是它“好看”——它是单纯的计数,没有取 \(\max\) 之类的数值讨论。
接下来,讨论计数。对于第一类贡献,发现就是逆序对个数。令 \(f(n)\) 表示所有 \(n\) 阶排列的逆序对数量,那么
对于第二类贡献,注意到贡献中对 \(A\) 的大小要求比较复杂,而根据排列具有的多样“子问题”处理方式,我们可以枚举 \(n\) 所在的位置 \(j\),统计满足条件的 \((i,j,k)\) 的数量。注意 \(k\) 实际上没有参与数量贡献,而对于一个 \(i<j\),显然已有 \(A_j\ge A_i\),若 \((i,j)\) 有贡献,则 \(\exist k>j,A_k<A_i\)。这一步用一个小 trick:概率问题与计数问题可以相互转化来简化讨论。我们求 \(\exist k\) 的概率,显然这些下标的具体值都不影响概率,问题就是——排列里有 \(n-j+1\) 个数,求第一个数不是最大值的概率,显然嘛,\(\frac{n-j}{n-j+1}\)。因而,设 \(g(n)\) 表示所有 \(n\) 阶排列的第二类贡献和,那么
后面那一坨随便整理一下就能递推求了。复杂度 \(\mathcal O(R)\)。
\(\mathscr{C}-\) 树
给定含 \(n\) 个点 \(m\) 条边的点双连通图及其两棵生成树 \(T_1,T_2\),每次操作取 \(T_1\) 的一片叶子,去掉它与父亲在 \(T_1\) 内的连边,并指定其新父亲。构造把 \(T_1\) 变成 \(T_2\) 的操作方案。
\(n\le100\)。
被卡了一个点 qwq,简单胡一下。
搜索,但是有条理。我们为两棵树指定同一个根,然后自上而下递归地构造出每条正确树边。需要做到一个清空 \(T_1\) 内某结点子树的操作,暴力递归进去,把每个点丢到子树外即可。讲错了不负责。(
我本来浅写了一下,没有精细的限制,大概 \(50\) 分,然后加上一个“每次遍历邻接点,按一个随机排列的顺序遍历”,就只剩最后一个 subtask 的最后一个点过不了。事实证明乱搞的时候应当随机起来。(