7.22 做题记录

小摆 😄

P8866 [NOIP2022] 喵了个喵

我们先明确几个策略:每个栈至多有两个数,使用可以切换的辅助栈。

  • \(k = 2n - 2\)

考虑把 \(2i - 1,2i\) 分配到栈 \(i\) 中,讨论当前栈的情况。

  • \(k = 2n - 1\)

考虑消除绑定关系,如果当前数 \(x\) 未出现,放入一个不满两个的栈,否则采用 \(k = 2n - 2\) 的策略讨论。

这样如果无法进行,一定是 \(n-1\) 个栈满了,且每种元素恰好出现一次。

我们知道当前数 \(v\) 后面的数,如果第一个不在栈顶上的数是 \(v\),那么把 \(v\) 放入辅助栈,否则设这个数为 \(x\),对应栈为 \(S\)\(S\) 的栈顶为 \(y\),如果 \(v,x\) 之前 \(y\) 出现了奇数次,把 \(p\) 放入辅助栈,接下来自然可以消除,否则把 \(v\) 放入 \(S\),所有的 \(y\) 自然可以消除,把 \(x\) 放入辅助栈,局面规约到操作前的情况。

维护未满两个元素的栈,时间复杂度 \(O(\sum m)\)

总结:

  • 本题没有具体技巧上的贡献,更多的是告诉我们思维不要局限:我们人为加上的限制(辅助栈)是不固定的,可以自由切换,\(2i\)\(i\) 的关系也是不固定的

P8969 幻梦 | Dream with Dynamic

考虑如下信息:\(x\to f(\text{popcount}(x+a))+b\) 或者 \(x\to x+b\),其中 \(f\) 为定义域和值域都是不超过 \(64\) 的正整数的函数。显然两种操作均为如下形式,使用线段树维护函数的复合即可,时间复杂度 \(O(n \log n\log V)\)

总结:

  • 只用支持单点查询,维护的信息只用支持信息对信息可结合,信息对操作封闭
  • 函数变换考虑值域和定义域

P7828 [CCO2021] Swap Swap Sort

我们要求:

\[\sum_{i = 1}^n \sum_{j = i + 1}^n [a_i = y \wedge a_j = x] \]

设阈值为 \(B\),对一个数的出现次数进行根号分治。

  • \(x\) 或者 \(y\) 的出现次数 \(\leq B\)

枚举每一个数出现的位置,然后可以枚举出现次数 \(\leq B\) 的数,这样的数不会超过 \(\dfrac{n}{B}\) 个,每次直接在 \(\text{std::vector}\) 上二分求出在位置 \(i\) 前面值为 \(j\) 的数的个数。时间复杂度 \(\Theta(\dfrac{n ^ 2}{B} \log n + nB)\)

  • \(x\)\(y\) 的出现次数都 \(\le B\)

在 vector 上双指针即可。

时间复杂度 \(O(\dfrac{n ^ 2}{B} \log n + nB)\)

P9318 [EGOI2022] Lego Wall / 乐高墙

\(f_i\)\(i\) 列时的答案,\(g_n\) 表示无限制摆放时 \(n\) 列的方案数,枚举第一次断开的位置有:\(f_i=\sum f_j\times g_{i-j}\)

注意到第 \(i\) 列的摆法情况只和第 \(i-1\) 列有关,可以记录凸出的 \(1\times 2\) 的方块数量,因此我们可以记 \(f(i,j)\) 表示对于第 \(i\) 列,有 \(j\) 个小块凸出到 \(i+1\) 列的合法方案数,则:\(f(i,j)=\sum \limits_{k=1}^{m-1} f(i-1,k)\times {m-j\choose k}\)

将两种做法结合,讨论 \(n,m\) 的大小,时间复杂度 \(O((nm)^{\frac{4}{3}})\)

总结:

  • 具有递进关系可以只记录变化的结构

P7216 [JOISC2020] 美味しい美味しいハンバーグ

钦定 \(k\) 个矩形为特殊矩形(在每个矩形上都要至少选一个点),然后其它矩形与特殊矩形做矩形交,让这些矩形和任意与它有交的特殊矩形交集为合并的结果,将第一个无法与特殊矩形相交的矩形向前随机交换即可通过。

posted @ 2023-07-22 21:36  墨珂  阅读(51)  评论(0)    收藏  举报