Solution Set -「LOCAL」冲刺省选 Round X


\(\mathscr{Summary}\)

??时间利用效率?

??同学,你的效率呢?

??我真不知道中途几个小时干了啥,我也不知道我实在划水、神游还是真的在自闭想题。

??虽然真实考场肾上腺素不会允许我这么做,但模拟赛还是得提起精神啊。

??哦,我不是生竞的,上面那句话当成伪科学。

\(\mathscr{Solution}\)

\(\mathscr{A}-\) 下落的数字

??给定以 \(1\) 为根的带点权树,定义 \(k-\)travel 为:从根出发,每次走到孩子点权集合中取到 lower_bound \(k\) 的点,若不存在则停下,设最后到达结点 \(u\)。现进行 \(m\) 次操作:

  1. 修改单点点权;
  2. 给定 \(k\),求当前树上 \(k-\)travel 的终止点。

??\(n,m\le 2\times10^5\)


??树剖。线段树维护穿过一整段重链时,travel 值的取值区间。询问时模拟跳重链。复杂度 \(\mathcal O((n+q)\log n)\)

\(\mathscr{B}-\) 序排速快

??给出一个排序方法:

2022-03-16 22-09-00 的屏幕截图.png

其中,称 \(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,则这样的 \(j\) 减少一个;
  • 否则若 \(\exist i\le jA_k\),则这样的 \(j\) 减少一个;
  • 否则,\(i\) 是 partition point,不会被冒泡。

??结论比起我想到的要冗长,但是它“好看”——它是单纯的计数,没有取 \(\max\) 之类的数值讨论。

??接下来,讨论计数。对于第一类贡献,发现就是逆序对个数。令 \(f(n)\) 表示所有 \(n\) 阶排列的逆序对数量,那么

\[f(n)=nf(n-1)+\frac{n(n-1)}{2}(n-1)!. \]

??对于第二类贡献,注意到贡献中对 \(A\) 的大小要求比较复杂,而根据排列具有的多样“子问题”处理方式,我们可以枚举 \(n\) 所在的位置 \(j\),统计满足条件的 \((i,j,k)\) 的数量。注意 \(k\) 实际上没有参与数量贡献,而对于一个 \(i,显然已有 \(A_j\ge A_i\),若 \((i,j)\) 有贡献,则 \(\exist k>j,A_k。这一步用一个小 trick:概率问题与计数问题可以相互转化来简化讨论。我们求 \(\exist k\) 的概率,显然这些下标的具体值都不影响概率,问题就是——排列里有 \(n-j+1\) 个数,求第一个数不是最大值的概率,显然嘛,\(\frac{n-j}{n-j+1}\)。因而,设 \(g(n)\) 表示所有 \(n\) 阶排列的第二类贡献和,那么

\[g(n)=ng(n-1)+(n-1)!\left(\sum_{i=1}^{n-1}1+\frac{n-i}{n-i+1}(i-1)\right). \]

后面那一坨随便整理一下就能递推求了。复杂度 \(\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 的最后一个点过不了。事实证明乱搞的时候应当随机起来。(

相关