互测记录
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))\)。
感觉这相当于拓扑排序从前往后与从后往前做的区别!!!
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/19159453
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号