IOI2022

提醒:因为 day1 的题目不是刚做的,所以这篇题解就摆烂没好好写了。

鲶鱼塘 \((\texttt{Easy} \ 0 / 3)\)

设第 \(i\) 列的高度为 \(h_i\),若 \(h_{i - 1} > h_i < h_{i + 1}\),则可以直接令 \(h_i = 0\)

于是可以设 \(f_{i, j}\) 表示 \(h_{i - 1} \le j = h_i\) 的答案;\(g_{i, j}\) 表示 \(h_{i - 1} > j = h_i\) 的答案,则根据上面的性质可以方便地转移。

注意到一个状态 \((x, y)\) 有效当且仅当 \(y = m - 1\)\((x, y + 1)\) 有鲶鱼,于是可以把状态数缩到 \(\mathcal{O}(n + m)\),时间复杂度 \(\mathcal{O}((n + m) \log m)\)

囚徒挑战 \((\texttt{Easy} \ 3 / 5)\)

先考虑一个做法:从高到低查询 \(n\) 的二进制位,这样可以得到一个 \(m = \mathcal{O}(\log n)\) 的做法。

发现可以对于每一位采用不同的进制,搜索最优解可以做到 \(m = 24\)

发现如果当前的数是可能范围的最大值 / 最小值的话就已经能确定答案了,所以可以在原来的基础上每轮把范围多 \(-2\),搜索最优解可以做到 \(m = 20\)

非常难写。学了一下最短解的做法,非常厉害。

无线电信号塔 \((\texttt{Medium} \ 4 / 4)\)

先考虑 \(d\) 固定的情况。设 \(l_i, r_i\) 表示 \(i\) 左右两侧第一个高度不低于 \(h_i + d\) 的信号塔的编号,易于证明 \([l_i, r_i)\) 这些区间要么不交,要么包含,那么我们肯定选择那些不包含其他区间的区间。

我们求出所有有效的三元组 \((l, i, r)\)。对于 \([L, R]\) 的询问,首先我们把所有 \(i \in [L, R]\) 的三元组拿出来,这些显然是可选的;此外,我们在左右两侧各可能再多选择一个信号塔,考虑如何判定这个东西。

设最左边的三元组为 \((l, i, r)\)\(p = \argmax_{L \le j < i} h_j\),那么可以证明我们选择的信号塔一定在 \(p\) 左侧,直接判断即可。注意当我们一个三元组都选不出的时候需要特殊处理一下。

于是我们解决了 \(d\) 固定的情况。发现对于一个 \(d\),若 \([l_j, r_j)\) 包含了 \([l_i, r_i)\),则对于 \(\forall d' > d\) 我们都有 \(j\) 的区间会包含 \(i\) 的区间。所以使用可持久化线段树维护所有三元组的 \(i\) 即可。

数字电路 \((\texttt{Easy} \ 2 / 1)\)

先考虑如果钦定了每个点的颜色,如何求出方案数。如果 \(u\)\(k\) 个儿子是 \(1\) 并且 \(u\) 也是 \(1\),那么 \(p_u\)\(k\) 种选择;否则有 \(c_u - k\) 种选择。这相当于对于每个点 \(u\) 选择一个与之颜色相同的儿子的方案数,即链剖分的方案数,要保证 \(1\) 是黑色当且仅当其所在的链对应的叶子是黑色。

所以我们可以枚举 \(1\) 所在的链的叶子,那么其他的点随意选儿子均可对应一种方案。所以叶子之间对答案的贡献是独立的,可以用线段树维护。

时间复杂度 \(\mathcal{O}(n \log n)\)

最罕见的昆虫 \((\texttt{Medium} \ 4 / 3)\)

考虑一个做法:我们依次加入每一个数,如果查询的结果 \(> 1\) 即弹出这个数,那么我们可以得到所有颜色各一个,即可以得到颜色种类数。我们删去这些位置之后再进行一遍上面的过程,如果颜色数量减少就说明答案为 \(1\);反之可以一直进行。

考虑扩展一下,首先得到颜色数量 \(t\),保持众数出现次数 \(\le x\),那么答案 \(\ge x\) 当且仅当最后容器中一共有 \(tx\) 个数,于是可以二分答案。

考虑卡常。如果发现答案 \(\ge x\),那么我们可以把当前容器内的数锁在容器里,在以后的操作中不把它们挪出容器;反之,我们可以把当前容器外的数锁在容器外,在以后的操作中不把它们挪进容器,易于证明这样做的正确性。再把二分上界改为 \(\left\lfloor \frac{n}{t} \right\rfloor\) 即可通过。

千岛 \((\texttt{Easy} \ 3 / ?)\)

胡了一个做法,大概是如果起点的出度 \(> 1\) 则必然存在解,否则可以递归求解;构造是找环之类的,要分类讨论。看了下其他题解,好像挺对的,有时间把代码补了。

一般我写下这句话就意味着我不会写代码了。

posted @ 2022-08-29 22:54  Scintilla06  阅读(244)  评论(0编辑  收藏  举报