做题记录 26.3.22
\(\textcolor{black}\odot\) CF1254E Send Tree to Charlie
可证:确定了每个点的所有出边的顺序,可以与合法的最终状态构成双射
对于确定的 \(a_{1\sim n}\),其中一个 \(a_i\) 代表了一条 \(a_i\to i\) 的路径
显然 \(a_i=i\) 则无解
设这条路径上边为 \(e_{1\sim k}\),对于每个 \(1\le i<k\),\(e_i\) 和 \(e_{i+1}\) 为邻边,且在它们共同的端点的所有邻边的顺序中,\(e_i\) 后面紧跟 \(e_{i+1}\),且 \(e_1\) 为起点的第一条边,\(e_k\) 为终点的最后一条边
即对于每个点产生三类限制:它某两条邻边必须相邻,它某条邻边必须为第一条/最后一条
显然合法的 \(a_{1\sim n}\) 必有 \(\sum_i \text{dis}(i,a_i)=2n-2\),从而可以暴力处理所有限制
依次考虑每个顶点,将相邻关系建成有向图,显然不是若干条链的情况必然不合法(孤点也视为链),这些链可以依次排列,可能有一条必须在第一位,一条必须在最后一位,方案数为自由的链的数量的阶乘,其中还需要特判一些不合法情况和特殊情况
容易做到 \(O(n)\) 或 \(O(n\log n)\)
\(\textcolor{black}\odot\) CF772E Verifying Kingdom
显然需要求出这 \(n\) 个叶子的虚树
增量构造,假设已经建立 \(1\sim i-1\) 的虚树,考虑加入 \(i\)
对于一个三度点 \(u\),设其左右儿子为 \(x,y\),父亲为 \(z\),则查询 \((x,y,i)\) 可以得知 \(i\) 相对于 \(u\) 在 \(x,y,z\) 中哪个方向
对 \(1\sim i-1\) 得到的树点分治
若当前连通块只有一个叶子,则将 \(i\) 接在这个叶子到其父亲的边上
否则取一个非叶子的重心,确定 \(i\) 在哪个方向
若这个方向上的点还没有分治过则递归处理这个方向上的连通块,否则将 \(i\) 挂在分治中心向这个点的连边上
时间复杂度 \(O(n^2)\),询问次数 \(n\log_2(n)\)
\(\textcolor{black}\odot\) CF566E Restoring Map
当给定的所有集合都是全集时,显然为菊花,特判这种情况
称内点为度数 \(>1\) 的点,称两个端点都是内点的边为内边,对于两个给定的集合,若它们的交集大小为 \(2\),则两点构成一条内变,且可证每条内边都可用此方式取到
此时除了叶子外的树已经确定,且内点的集合已经确定
显然内点数量 \(\ge 2\),当数量为 \(2\) 时,给定的集合可以划分为三个等价类,一个等价类为全集,剩余两个等价类中去掉所有内点后得到的两个集合分别为两个内点两侧的叶子集合
当数量 \(>2\) 时,枚举每个叶子,取出给定的集合中包含当前叶子且大小最小的,显然这一集合为当前叶子的二阶邻域
设邻域中内点的集合为 \(S\)
若 \(|S|=2\),则两点中恰好一点为只考虑所有内点时的叶子,取这一点与当前叶子相连
否则 \(S\) 的导出子图为菊花,取根与当前叶子相连
容易用 bitset 做到 \(O(\frac{n^3}\omega)\)
\(\textcolor{black}\odot\) CF1876G Clubstep
对于一组 \((l,r,x)\),显然需要在 \(r\) 处操作 \(\lceil\frac{x-a_r}2\rceil\) 次,令此询问答案增加 \(r\times \lceil\frac{x-a_r}2\rceil\),然后转化为 \((l,r-1,x-\lceil\frac{x-a_r}2\rceil)=(l,r-1,\lfloor\frac{x+a_r}2\rfloor)\)
离线,从右往左扫描,在 \(r\) 处加入,\(l\) 处删除
用平衡树维护所有询问,目前 \(x\) 相同的询问缩为一个等价类,扫到 \(a_i\) 时,枚举 \(>a_i\) 的等价类暴力更新
考虑 \([a_i,+\infty)\) 范围内每对相邻等价类距离至少减小一半,显然初始每个距离不超过 \(O(V)\),从而总操作次数为 \(O(n\log V)\) 的
使用并查集维护每个询问所在等价类,可以做到 \(O(n\alpha(n)\log V)\)
\(\textcolor{black}\odot\) CF1824E LuoTianyi and Cartridge
考虑枚举 \(\min(a,c)\),设为 \(w\),\(a<w\) 的点或 \(c<w\) 的边不可用,考虑求出 \(b+d\) 的最大值
对于一条可用边,若它两侧只有一侧存在可用点,则必然不会被选,先删去这样的边
设剩余的点集为 \(V\),边集为 \(E\)
将删去 \(E\) 每条边后得到的连通块都缩起来,显然得到一棵树,点数为 \(|E|+1\),边数为 \(|E|\)
实际选择边数不超过 \(|V|-1\),最优方案显然为:选择 \(d\) 前 \(\min(|V|-1,|E|)\) 大的边,得到的树每个叶子对应连通块中选择最大的 \(b\)(设叶子数为 \(l\)),从剩余的 \(b\) 中选择前 \(\min(|V|,|E|+1)-l\) 大的
从小到大枚举 \(w\),则连通块只会合并,用并查集维护美国连通块,用两个线段树分别维护边的权值的可重集和非叶子最大值的点权的可重集
时间复杂度 \(O(n\log ^2n)\),用线段树合并和懒惰删除等手段可以做到 \(O(n\log n)\)

浙公网安备 33010602011771号