CF Round 1055(#2152) 总结

CF Round 1055(#2152) 总结

VP 时过了 ABCE。

A. Increase or Smash

对于每一种数字都要操作两次,先把小于自己的清零,然后再加操作。

第一次不用清零,因此答案为 \(2\times 种类数-1\)

复杂度 \(O(\sum n)\)

B. Catching the Krug

Alice 的操作一定是先往某个方向走到底,再往另一个方向走到底。可以二分答案,处理出 Alice 走到的终点,然后 check Bob 能不能在时间内走到 Alice 的终点。

实现上可以先旋转、对称,使得 Alice 一定往左上角走。

复杂度 \(O(T\log V)\)

C. Triple Removal

发现每次找到相邻相等的数操作最优,贡献为 \(1\)。考虑到不能执行这样的操作时当且仅当 01 交替出现,发现这种情况只能在一开始出现,因为在中途的操作我们一定有办法使序列不变成 01 交替的情况。

因此答案为 \((r-l+1)/3+[初始序列是01交替的形式]\)

D. Division Versus Addition

还没过。

E. Monotone Subsequence

题意:交互库有一个 \(n^2+1\) 的排列,最多 \(n\) 次询问一个下标集合的前缀最大值的位置,需要求任意一个长 \(n+1\) 的单调序列(递增或递减)。

考虑维护一个剩余没有返回过的下标集合 \(S\)。每次问集合 \(S\),然后把返回的 \(T\) 从集合里剔除。

同时我们每次查询都可以得到一些 \(S-T\)\(T\)\(T\)\(T\) 之间的大小关系。考虑建图,小的往大的连边,然后跑拓扑排序找到一条 \(n+1\) 的路径即可。

感受一下,发现“最劣情况”下这样也是能找到一条路径的。自己写个交互库拍过了。交上去也过了。

F. Triple Attack

题意:称一个序列是好的,当且仅当对于任意三个元素 \(x,y,z\)\(\max(x,y,z)-\min(x,y,z)>给定的k\)。现在给定一个不下降序列,每次询问一个区间最长好的子序列。

一个序列是好的当且仅当 \(\forall 1\le i\le n-2,a_{i+2}>a_i+k\)

考虑一种贪心策略,初始选 \(l,l+1\),然后每次选下一个满足条件的位置。发现奇数项和偶数项是独立的,所以这等同于初始 \(x=l,y=l+1\),然后每次选满足 \(y<i<j,a_i>a_x+k,a_j>a_y+k\) 的最小 \(i,j\),然后更新 \(x\gets i,y\gets j\)

预处理 \(nx_i\) 表示下一个满足 \(a_{nx}>a_i+k\) 的位置,那么由于 \(x,y\) 初始 \(x<y\) 那么发现一直跳 \(nx_x,nx_y\)\(y<nx_x<nx_y\) 在前面一段总是成立,而直到 \(nx_x=y\)\(x=y\),这时我们的答案序列的当前位置一定大于上一个位置加 \(k\),可以从当前位置开始重新赋 \(x\gets y,y\gets y+1\) 重复执行上述操作。

\(nx_i\) 构成树形结构,那么这个过程相当于重复执行操作 \(x\gets \text{lca}(x,x+1)\),对这个操作用倍增维护即可。复杂度 \(O((n+q)\log n)\)。有一些细节。

G. Query Jungle

题意:给定一棵树,每个节点有权值 0/1,你要用最少从 \(1\) 开始的路径覆盖所有 \(1\)。还有 \(Q\) 个询问,每次翻转一个子树内的点权(翻转是累计的),每次都要解决上述问题。

路径数就是除自身外子树内没有关键点的关键点个数,即虚树的叶子个数。

考虑一种另类的欧拉序(其实是树上关键点的括号序):

vector<int> euler;
void dfs(int x) {
    euler.push_back(x);
    for(int v:son[x]) {
        dfs(v);
    }
    euler.push_back(x);
}

叶子个数就是 () 作为子段出现的次数,可以用线段树维护,翻转操作只需打懒标记,交换两种颜色的答案即可。复杂度 \(O((n+q)\log n)\)

H1 & H2. Victorious Coloring

H1

题意:给定一棵树,每条边 \((u,v)\) 有边权 \(w_{(u,v)}\)。对于已知的非负整数点权序列 \(x\) 与每个点颜色序列 \(c\)\(c_i=0/1\)),定义 \(f(x,c)=\sum c_ix_i+\sum_{(u,v)\in E} [c_u\ne c_v] w_{(u,v)}\)。定义 \(f(x)\) 为所有满足至少存在一个 \(1\)\(c\)\(f(x,c)\) 的最小值。多次询问 \(L\),求 \(\min _{f(x)\ge L}\sum x_i\)

先考虑对于已知的 \(x\),如何染色才能最小化 \(f(x,c)\)。它满足以下性质:

  • \(1\) 的导出子图是连通的。不然任选一个连通块全染成 \(0\) 会使 \(f\) 更小。
  • 对于链接两个 \(1\) 的边 \(e_1\) 和链接恰好一个 \(1\) 的边 \(e_2\),满足 \(w_{e_1}>w_{e_2}\)。不然若 \(w_{e_1}\le w_{e_2}\),则可以把 \(e_1\) 包含 \(e_2\) 端点的那一边全部染成 \(0\),此时 \(f\) 会至少减少 \(w_{e_2}-w_{e_1}\ge 0\)

由此,可以给所有边从大到小排序,依次插入这些边,每次会合并两个连通块,过程中会形成 \(2n-1\) 种不同连通块,这些连通块就是所有染色方案的支配集。

现在要求给 \(x\) 赋值使得所有 \(2n-1\) 种方案都满足 \(\ge L\)。首先求出 \(\sum_{(u,v)\in E} [c_u\ne c_v] w_{(u,v)}\) 是容易的。

剩下的由于上述合并过程形成了类似克鲁斯卡尔重构树一样的结构,考虑树上自底向上贪心。先递归使儿子都满足条件,然后若当前节点小于 \(L\),则增加子树内任意一个 \(x\) 使得满足条件。

复杂度 \(O(n\log n+qn)\)。可以通过 H1。

H2

H1 等价与给定一个有根树,每次给定 \(L\) 计算树上 DP:\(dp_i=\max(dp_{lson}+dp_{rson},L-a_i)\)

发现 \(dp_i\) 是关于 \(L\) 的凸的分段一次函数。

使用 Slope Trick,用可并堆维护所有拐点 \((x,\Delta k=1)\),相加直接合并堆即可,而 ckmax 发现就是把一个前缀的拐点弹掉。

复杂度 \(O((n+q)\log n)\)。而使用启发式合并可做到 \(O(n\log ^2n+q\log n)\)。都可通过。

posted @ 2025-10-13 22:43  dengchengyu  阅读(5)  评论(0)    收藏  举报