2025.9.4 NOIP 模拟赛 题解

比赛

订正

T1 P110128 委托 (entrust)

题意

\(n+1\) 个点的菊花图,\(0\) 为根,给定 \(t_i=\text{dis}(0,i)\),有 \(m\)\((a,x)\) 表示可以 \(x\) 时刻从 \(0\) 出发,\(x+t_a\) 时刻到达 \(a\)(含 \(x\) 时刻与 \(x+t_a\) 时刻),\(l\)\((b,y)\) 表示可以 \(y\) 时刻从 \(b\) 出发,\(y+t_b\) 时刻回到 \(0\)(含 \(y\) 时刻与 \(y+t_b\) 时刻),其他时刻不可移动,同一时刻至多进行其中一种,求最大可进行的操作数量,\(n\le 10^5\)

分析

将时刻离散化到 \(1\sim O(m+l)\),令 \(f_{i,j}\) 表示 \(i\) 时刻位于 \(j\) 时的答案,转移是容易的,显然可以优化到除离散化外线性

时间复杂度 \(O((m+l)\log (m+l)+n)\)

代码

另一种方式为每个 \(0\to u\) 的找到下一个 \(u\to 0\) 的,两者视为一个区间,转化为给定若干带权区间,选出权值总和最大的子集,使得两两不交,特殊处理最后一个,时间复杂度相同

T2 P110129 骑车环行 (cycle)

题意

一张 \(n\) 点的图,每点有高度 \(h_i\),有若干条无向边 \((u,v)\),其边权为 \(|h_u-h_v|\),定义一个简单环(可重复经过点,不可重复经过边)的权值为环上边权的最大值,对于每个 \(1\le i\le n\) 求出包含它的简单环的最小权值或判定不存在,\(n\le10^5,m\le2\times10^5\),保证图连通

分析

以下做法没有使用 \(w(u,v)=|h_u-h_v|\) 的性质

将边按边权从小到大排序,依次处理,若边 \((u,v,w)\)\(u,v\) 不在同一连通块中,则合并两个连通块,否则枚举 \(u-v\) 链上所有点(显然维护的连通块是树),将这些点的答案设为 \(w\),然后将这些点缩起来

正确性显然,若直接用 \(\text{LCT}\) 实现则复杂度为 \(O((n+m)\log n)\)

考虑先求出 \(\text{MST}\),然后按边权从小到大枚举每条非树边 \((u,v,w)\),枚举树上路径 \(u-v\) 上的点,若 \(p\) 没有被访问则将该点答案设为 \(w\),否则跳过

树剖后直接树上取 \(\min\) 可以做到 \(O((n+m)\log^2 n)\)

用并查集跳过被访问的位置,则时间复杂度 \(O((n+m)\log n)\)

代码

T3 P110130 数列涂色 (color) \(\quad\) GYM105487 D. Excellent Splitting

题意

给定一个排列 \(a_{1\sim n}\),将它分为两个子序列 \(A,B\),求出 \(\text{LIS}(A)+\text{LDS}(B)\) 的最大值,\(n\le10^5\),多测 \(T\le 5\)

分析

由于 \(a\) 为排列,显然 \(\text{LIS}(A)+\text{LDS}(B)\)\(\text{LIS}(a)+\text{LDS}(a)\)\(\text{LIS}(a)+\text{LDS}(a)-1\)\(a\)\(\text{LIS},\text{LDS}\) 至多一个交点,去掉交点后一定合法)

考虑计算出 \(\text{LIS}(a)\)\(\text{LDS}(a)\) 的数量,然后求出其中有交的方案数,若不同则说明答案为 \(\text{LIS}(a)+\text{LDS}(a)\),否则减一

对于有交的情况,枚举交点 \(a_i\),则转化为求出终于 \(a_i\)\(a_{1\sim i}\)\(\text{LIS},\text{LDS}\) 与始于 \(a_i\)\(a_{i\sim n}\)\(\text{LIS},\text{LDS}\),若加起来得到总长度等于 \(\text{LIS}(a)+\text{LDS}(a)\) 则计入方案数

转化为i给定一个序列,对于每个元素求出以它结尾的 \(\text{LIS}\) 长度与数量,及全局的答案(\(\text{LDS}\) 和后缀的情况显然可以转化为这种情况),容易值域树状数组实现

时间复杂度 \(O(\sum n\log n)\)

代码

T4 P110131 双端队列 (deque)

题意

有一个 \(n\) 点的森林,初始所有点之间都没有连边,\(m\) 次操作:

  1. push_back(x,y):将 \(x\) 加入到 \(y\) 的儿子序列的末尾,保证 \(x,y\) 都是根
  2. push_front(x,y):将 \(x\) 加入到 \(y\) 的儿子序列的开头,保证 \(x,y\) 都是根
  3. pop_back(x):将 \(x\) 的儿子序列的末尾元素弹出作为一个独立的根,保证 \(x\) 为根且至少有一个儿子
  4. pop_front(x):将 \(x\) 的儿子序列的开头元素弹出作为一个独立的根,保证 \(x\) 为根且至少有一个儿子
  5. pop_complexity(x):查询至少需要多少次 \(3\) 操作和 \(4\) 操作才能使 \(x\) 成为根

\(n,m\le2\times10^5\)

分析

考虑维护每种操作对答案序列的影响,查询时直接在序列上单点求值

pushpop 互为逆操作,frontback 对称,因此先考虑 push_back 操作对答案序列的影响

假设要将树 \(v\) 插入 \(u\) 的儿子的末尾,\(u\)\(k\) 个儿子 \(s_{1\sim k}\),假如每个连通块中按 \(\text{dfs}\) 序保存除根外所有点的答案,显然这样一次操作先将 \(v\) 插入 \(v\) 的序列之首,然后将 \(v\) 的序列插入 \(u\) 的序列的末端,然后 \(u\) 的序列中第 \(\lceil\frac{k+1}2\rceil\) 至第 \(k+1\) 个儿子所在子树的答案整体加一

用一组 \(n\) 棵平衡树维护每个点的儿子序列,支持查询前 \(k\) 个儿子的子树大小之和,然后用另一组 \(n\) 棵平衡树维护每个连通块的答案序列,五个操作容易做到 \(O(\log n)\)

总时间复杂度 \(O(n+m\log n)\)

代码

比赛结果

\(100+100+35+40\)\(\text{rk}40\)

posted @ 2025-09-05 13:43  Hstry  阅读(20)  评论(0)    收藏  举报