NOI Online 2022 题解

NOI Online 2022 题解

A. 丹钓战

首先考虑暴力,即对给定区间模拟题意的单调栈过程,所有在单调栈中没有前驱的元素数量就是答案。

发现这样会对一些区间做很多次重复的单调栈操作,那么考虑能否只对整个序列做一次就达到目的。

发现是可以的,只不过问题会转化为求区间 \([l,r]\) 中满足前驱的编号小于 \(l\) 或不存在前驱的元素数量,

这形如二维偏序问题,用离线树状数组即可。

还有一种做法,是从左端点 \(l\) 的元素开始不停往右跳,每次跳到当前位置在单调栈中的后继元素,

直到跳到右端点之外,跳的总次数就是答案。用倍增优化跳的过程,即可保证复杂度并通过本题。

这道题的启发是,考试时一定要对拍。

B. 讨论

考虑题中的包含关系 \(S(x)\in S(y)\) 只会在 \(|S(x)|\le |S(y)|\) 时出现,

故先将所有人按题目数量降序排序,从而将一个包含的限制转化为对编号大小的限制。

此时考虑一组解 \((x,y)\) 的两种情况,分别是 \(|S(x)|=|S(y)|\)\(|S(x)|<|S(y)|\)

第一种情况是好做的,因为当 \(|S(x)|=|S(y)|\) 时,只有形如 \(S(x)=S(y)\) 的情况才存在包含关系,

那么将这种情况判掉后,唯一需要判的只有交集非空,这个开个桶就可以找到合法解。

现在考虑第二种情况。首先,若原问题存在解,且存在 \(y>x\) 满足 \(S(x)\subseteq S(y)\)

则一定存在一组解 \((u,v)\),满足 \(u<v\)\(v\ne x\),原因是若 \((x,v)\) 是一组解,则 \((y,v)\) 也一定是一组解。

那么我们考虑,在排序后顺序扫描每个元素并维护桶 \(buck\),其中 \(buck(i)\) 存储题目数最少且会第 \(i\) 道题的人。

此时尝试为第 \(x\) 个人找到 \(y<x\) 使得 \((x,y)\) 是最优解,方法是遍历 \(S(x)\) 中的所有元素 \(u_1,u_2,\cdots u_k\)

若所有 \(i\)\(buck(u_i)\) 都相同,那么如果存在合法解,则一定存在合法解 \((u,v)\) 满足 \(u<v\)\(v\ne x\)

否则令 \(y=\max\limits_i(buck(u_i))\),此时 \((x,y)\) 就是一组合法解,以下给出这个断言的证明:

若所有 \(i\)\(buck(u_i)\) 都同为 \(t\),则有 \(S(x)\subseteq S(t)\),这种情况下已经证明过 \(x\) 是没用的,

否则一定满足 \(S(x)\nsubseteq S(y),S(y)\nsubseteq S(x),S(x)\cap S(y)\ne\varnothing\)

由于维护 \(buck\) 也是简单的,故这道题就做完了,复杂度是 \(O(n\log n)\),显然可以通过。

C. 如何正确的排序

首先发现,题中所求式形如 \(m-1\) 维数点,故可以用 cdq 分治解决本题,复杂度 \(O(n\log^2n)\),常数较大。

实际上,因为题中式子形如 \(\max\limits_{k\in U}(x_{k,i,j})+\min\limits_{k\in U}(x_{k,i,j})\) 的形式,其中 \(U=[1,m]\cap Z^+\)

故对于 \(m\) 为偶数的情况,我们可以将问题转化为 \(m-2\) 维数点。

具体来说,我们将式子中的 \(\max\),用容斥的思想将其拆成若干 \(\min\) 的线性组合,即:

\(\max\limits_{k\in U}(x_{k,i,j})+\min\limits_{k\in U}(x_{k,i,j})=\sum\limits_{1\le l\le m}((-1)^{l-1}\sum\limits_{S\subseteq U,|S|=l}\min\limits_{k\in S}(x_{k,i,j}))+\min\limits_{k\in U}(x_{k,i,j})\)

而当 \(m\) 为偶数时,式子中的 \(\min\limits_{k\in U}(x_{k,i,j})\) 会被 \(\max\) 所拆开的式子中的一项抵消,

而剩余式子中的每一项,都可以用不超过 \(m-2\) 维数点来解决,总时间复杂度是 \(O(2^m n\log n)\),常数不大。

posted @ 2022-04-03 16:16  GaryH  阅读(133)  评论(0编辑  收藏  举报