互测记录

Round 1

A 携春同行

有一个隐藏的数组 \(a_0,\dots,a_{n-1}\),定义 \(D(T)\)\(T\) 这棵树以 \(a\) 为点权时的直径。

你需要在 \(n+1\) 次查询和 \(20\) 次猜测之内确定至少 \(n-2\)\(a_i\)

  • 查询:询问一棵树 \(T\),返回 \(D(T)\),这个操作你只能将所有查询绑到一起调用一次得到所有结果。
  • 猜测:询问树 \(T\)\(x\),返回 \([D(T)=x]\),这个操作每次猜测后可以立刻知道结果。

\(1\le a_i\le 10^9,10\le n\le 500\)


好题。

首先可以通过恰好 \(n+1\) 次操作解方程确定前两大的和,以及第三大的值与非前三大值及其对应的点。

我们需要在前三大的点中确定前两大的位置。

我们希望构造一个简单的结构,可以钦定一条链为直径。

先用确定点构造一条链,左右侧各挂若干不确定点(挂成链),链中点上挂若干不确定点(挂成菊花)。

且我们保证左到右的路径是唯一的最长路,即钦定这是直径,那么当我们判断他是否取到可能的最大值,若取到,说明前两大在左右侧,否则说明前两大并不同时在左右侧。

那么我们可以判断一个集合是否不存在前两大,对于进行两次二分即可确定前两大位置。

现在的条件是中间链长度 \(\ge 3\),且左到右的路径是唯一的最长路。

当不确定点较少时,先找若干个顶上即可。

这里再描述一下题解做法。

当确定点(设有 \(W\) 个)较少时,我们考虑用一些非确定点。

\(k=\max(2,3-W)\),将非确定点分为大小为 \(k\)\(3\) 组,可以分析出由于 \(n\ge 10\),这是可行的。

使用两次循环判断,一定能找出一组不存在前两大,将其补充进确定点。

然后再根据上面的那个结构,不过现在是三个位置都挂成菊花。

则当前两大分居左右两侧时,才能达到上界。

于是按照如下做法,确定前两大:

  • 枚举 \(w\ge 0\),将非确定点根据二进制第 \(w\) 位的值分配到左右侧。若询问成功则退出枚举,此时用了 \(w+1\) 次猜测。
  • 二分左侧集合,每次取出一半的加入中点上,可以确定有效点在哪个部分中,使用 \(\log n-1\) 次猜测。
  • 然后再对 \(y\) 进行二分,但是这样次数就爆了,发现我们是知道两个有效点二进制下 \(w\) 位是相同的,先将不合法的东西扔掉,这部分的次数变为 \(\log n-1-w\)

妙妙题。

分别由“确定一个集合不存在有效点”与“确定有效点分居两个集合”从而导出两种不同的做法。

B Everlasting Friends?

给出原树 \(T_0\)

定义 \(T_1\) 为按 \(1\to n\) 顺序加入点后的点重构树,\(T_2\) 为按 \(n\to 1\) 顺序加入点后的点重构树。

定义 \(f(A,B)\) 为使得 \(S\)\(A,B\) 上的导出子图均为联通块的 \(\{1,2,\dots,n\}\) 的非空子集 \(S\) 个数。

\(f(T_1,T_0)\)\(f(T_1,T_2)\) 取模后的值。

\(n\le 2\times 10^5\)


绝世好题。

\(f(T_1,T_0)\)

枚举联通块最大值 \(mx\),只考虑 \(T_1\)\(mx\) 的子树。

钦定选择 \(mx\) 的儿子 \(u\),则两点原树路径上所有点都要选,使用队列维护可以得到所有必要的点,发现这时加入的点必然是 \(u\) 子树内的点。

最后得到一个联通块,设其为选择 \((u,mx)\) 这条边的必要联通块。

那么对这个联通块下面的边都是可以选择的,选上了就扩展他的必要联通块,通过这个可以递归出 \(h_{mx,u}\) 表示选择这条边情况下的联通块个数(只考虑 \(mx\) 以及 \(u\) 子树),答案就是联通块下面断开的边的 \(h\) 相乘。

不难发现选择 \(mx\) 的边互相是独立的,故 \(mx\) 的答案就是其儿子边的 \(h+1\) 相乘。

我们希望快速刻画联通块下面的边。

如果原树跨过 \((x,fa_x)\) 的边超过一条,则这条边不能断开,若断开,\(x\) 子树自成联通块,但是其他点他们构不成联通块了,因为删掉了超过一条边。

而跨过边恰好为 \(1\) 的就可以断开,问题变成可以断掉一些边,求包含根的联通块个数。

每条边的状态最多变化一次,修改则是加入原树边 \((v,mx)\) 时将路径上都覆盖为不可断开。

考虑维护 \(f_u\) 表示 \(u\) 子树答案,我们只需确保当前还可以断开的边的 \(f\) 是正确的。

对于一次覆盖,我们找到所有改变状态的边,贡献系数则为 \(\frac{f_x}{f_x+1}\),正确性可以理解为从上往下将边设为不可断开,这样只需变一下拼上的东西。

但是会出现乘 \(0\)\(0\) 的情况,考虑维护 \(a\times 0^b\),四则运算都是能维护的。

时间复杂度 \(\mathcal O(n\log n+n\log Mod)\)

\(f(T_1,T_2)\)

\(T_1,T_2\) 均为联通块,则 \(T\) 上也是联通块。考虑点集在 \(T\) 上的虚树:

  • 由于 \(T_1\) 为联通块,则虚树只能包含该点集以及编号小于边界点的点,否则较小边界点往较大边界点走一定会碰到一个 \(T_1\) 上的非该点集的祖先。
  • 由于 \(T_1\) 为联通块,则虚树只能包含该点集以及编号大于边界点的点。

枚举 \(\min =u,\max =v\),依旧使用队列扩展出必要集合,就有暴力做法了,但是难以优化。

考虑以 \(T\) 上联通块为出发点,初始加入 \(u-v\) 的路径,重复执行以下操作:

  • 对于当前点集邻域中满足 \(u\le z\le v\)\(z\),将其加入点集。这是必要的,否则假设 \(fa_z<z\),那么 \(z\)\(T_1\)\(fa_z\) 的祖先,反之同理。而原树上 \(z<u\)\(z>v\) 显然不能加入点集。

最后扩展出一个唯一的联通块,显然其是唯一的可能合法联通块。

考察更多性质,首先点集内的点是 \(T_1,T_2\) 子树的交,考虑证明其是全交。

由于交集必然 \(\in [u,v]\),则原树上他到根上的点也 \(\in [u,v]\),则交集都会加入点集。

所以现在问题变为求 \((u,v)\) 个数,满足 \(u\)\(T_1\)\(v\) 的子树,\(v\)\(T_2\)\(u\) 的子树,且 \(u,v\) 子树的交集各构成一个联通块。

考虑点减边容斥,对于点与边,只要都是 \(u,v\) 子树交集就有贡献。

\(T_1\),在 \(T_2\) 上做链加。

\(v\)\(T_2\)\(u\) 子树内这个限制可以通过查询 \(T_2\)\(v\) 到根链限定。

对于另外一个限制,考虑扫的时候将 \(T_1\)\(v\) 子树在第二棵树对应点 \(-1\),那么现在满足前面条件的点权值 \(\ge 1\),且恰好满足 “ \(u\)\(T_1\)\(v\) 的子树” 的点权值为 \(1\)

这一部分时间复杂度 \(\mathcal O(n\log^2 n)\)

C 集你太美

给定一张 $ n $ 个结点的无向完全图 $ G $,边 $ (i, j) $ 带非负整数权 $ v_{i,j} $,保证 $ v_{i,i} = 0 \(,\) v_{i,j} = v_{j,i} $。

同时,每个结点有一个非负整数变量 $ w_i $。

定义对一个点 $ i $ 进行一次收集操作为,将 $ w_i $ 的值加上 $ \sum_j v_{i,j} $,并将 $ w_j $ 的值减去 $ v_{i,j} $。称一次对点 $ i $ 的收集操作合法,当且仅当操作前 $ w_j \ge v_{i,j} $。

在图 $ G $ 上称一组点权收集-free,当且仅当以这组点权为初始状态,存在一种方式,能够进行无限次合法的收集操作。

你有两种任务。第一种,构造一组点权 $ w'_i $,使得 $ w'_i $ 收集-free,且最小化 $ \sum_i w'_i $;第二种,给定一组点权 $ w'_i $,你需要判断 $ w'_i $ 是否 收集-free。

给出 \(m\) 条权值非 \(0\) 的边 \((i,j,v)\)

$ 1 \le n \le 3 \times 10^5 \(,\) 0 \le m \le \min\left(10^6, \frac{1}{2}n(n-1)\right) \(,\) 1 \le i < j \le n \(,\) (i, j) $ 互不相同,$ 1 \le v \le 10^9 \(,\) 0 \le w'_i \le 10^{18} $。


猜测如果图是收集-free,必然存在某种排列顺序重复操作某一个联通块的方案。

发现操作之后总和不变,且在操作 \(i\) 之前,其权值恰好为 \(W_i\) 减去他前面操作的点的 \(v_{j,i}\)

对于任务一,考虑到 \(\sum_i \sum_{(i,j)\in E}v_{i,j}[ord_j<ord_i]=\sum_{(i,j)\in E}v_{i,j}\),由于需要 \(\displaystyle W_i+\sum_{(i,j)\in E} -v_{i,j}[ord_j\lt ord_i]\geq 0\),那么对于每一种 \(ord\) 来说,\(\sum W_i\) 都是固定的,取 \(ord_i=i\) 来模拟即可。

对于任务二,直接做看起来非常困难,正难则反

操作转化为 \(\forall (i,j)\in E,w_j\leftarrow w_j+v_{i,j}\),且令 \(w_i\leftarrow w_i-\sum_{(i,j)\in E} v_{i,j}\),限制是操作一个 \(w_i\) 时操作完后 \(w_i\ge 0\)

假如我们确定了最后一个数,则对其他的 \(w\) 的影响是让他们变得更大,限制更松,所以这样没有后效性!!!

时间复杂度 \(\mathcal O(n\alpha (n))\)

感觉这相当于拓扑排序从前往后与从后往前做的区别!!!

posted @ 2025-10-23 07:27  蒟蒻orz  阅读(8)  评论(0)    收藏  举报