Loading

DE_aemmprty 的草稿纸(2025.11.17 - 2025.12.31)

关于难度

  • Easy 1-3:我是 wht,我一眼秒了,我觉得这题没啥技巧啊!
  • Medium 4-6:完全自己想出,但想了较长时间。(或者没想出来但实际上不难)
  • Hard 7-9:不完全是自己想出。

\([0, 1]\) 表示在同档题中的难度。

ZR3436 4

思维

倒序考虑,如果最终操作的人是小 A,那当 \(n > 1\) 时,无论什么情况都可以变成 \(0\),故小 A 必胜。

先特判掉 \(n = 1\) 和最终操作的是小 A 的情况。

考虑小 A 和小 B 分别的决策。

  • 小 A 会尽量让 \(0\) 多,让 \(1\) 少,那么如果有 \(\texttt{11}\) 就尽量操作成 \(\texttt{0}\),否则就是删 \(\texttt{1}\)

  • 小 B 会尽量让 \(0\) 少,那每次一定是删 \(0\)

就按这种方式操作即可。

QOJ970 8

可持久化线段树 二分

考虑一个单次询问 \(\mathcal{O}(n \log n)\) 的做法,我们二分答案,假设当前二分的值是 \(W\)

考虑 \(x + y \leq W\)\(\min\{x, y\} \leq \dfrac{W}{2}\),因此我们把所有数分成两类,若 \(a_i \leq \dfrac{W}{2}\) 就赋值为 \(1\),否则赋值为 \(0\)

我们想要构造出恰好选择 \(k\) 个数的方案满足限制。如果我们选择尽量多的数,假设有 \(K\) 个,如果 \(K \geq k\),我们就需要删除一些数调整大小到 \(k\)

我们可以先删除 \(0\),由于 \(0\) 两边一定都是 \(1\)(否则 \(0\)\(0\) 相加一定 \(> W\)),删除 \(0\) 之后两边 \(1\) 相加一定 \(\leq W\)。如果没有 \(0\) 了,那么当前序列全都是 \(1\),随便删即可。

现在我们想选择尽量多的数,可以证明选择所有 \(1\) 一定是不劣的。

如果存在一种选择最多数的方案没有选择所有 \(1\),不妨设 \(a_i\)\(1\) 且没有被选择:

  • 如果 \(a_i\) 向左第一个被选择的数是 \(L\),向右是 \(R\),若这两个数有一个是 \(0\),则删除 \(0\),插入 \(1\) 一定可行。

  • 否则说明两边都是 \(0\),直接插入即可。

因此,我们先选上所有的 \(1\),那相邻两个 \(1\) 最多只能插入一个 \(0\),我们判断一下这段区间中的 \(a_i\) 最小值能否插入即可。单次询问时间复杂度为 \(\mathcal{O}(n \log V)\)


对于每个区间 \([L, R]\) 以及二分的 \(W\),我们要能够快速的计算出最多选的数的个数。也就是说,我们要快速计算这段区间中,相邻两个 \(1\) 中最小值能插入的相邻对个数。

反过来,我们考虑一个二元组 \((i, j)\) 对于所有 \(1 \leq W \leq 2V\) 的贡献。也就是说,哪些 \(W\) 满足 \((i, j)\) 是相邻的两个 \(1\),且中间的最小值能插入。

从小到大枚举 \(j\),考虑哪些 \((i, j)\) 能造成贡献。对于一个 \((i, j)\),要造成贡献,需要满足 \(a_{i + 1}\)\(a_{j - 1}\) 的最小值大于 \(a_i\)\(a_j\)

我们处理出从小到大的单调栈,那么容易发现 \(a_i\) 必须是单调栈上的数,且 \(a_i\) 在单调栈上的下一个数要大于 \(a_j\)。很显然,这就是将 \(a_j\) 插进单调栈后被弹出的那些数,因此这样的二元组只有 \(\mathcal{O}(n)\) 个。

对于每一个二元组 \((i, j)\),假设中间的最小值下标为 \(k\),那么我们要看贡献的区间是什么。显然有 \(a_i + a_k \leq W, a_k + a_j \leq W\)\(a_k > \dfrac{W}{2}\),则 \(W \in [a_k + \max\{a_i, a_j\}, 2a_k)\)。这个可以使用可持久化线段树维护。

因此,询问要求 \([L, R]\) 的答案,那我们找到左右的赋值为 \(1\) 的下标 \(lx, rx\),然后计算 \(s_{rx} - s_{lx}\) 的值,与 \(k\) 比较即可。注意由于答案是环,需要特殊考虑首尾相接的情况,因此还需要一个 ST 表。

KEL9762 6

可持久化线段树 线段树优化建图 最短路

考虑对于每一行网格,把网格上的格子划分成没有障碍物的极长段。对于每一列同理。

如果一行和一列有交点,那就连一条边。我们根据这个图跑一边最短路。

然后考虑 \((i, j)\) 这一个点,它一定被一个行连续段和一个列连续段包含,而且显然这两个连续段的最短路之差小于等于 \(1\)

先考虑如何建图,我们从上往下扫每一行,线段树存储目前每一个位置所在的列连续段编号。然后,显然一个行连续段与一段列连续段区间有连边,因此使用可持久化线段树优化建图即可。

对于统计答案,我们只需要计算行最短路和列最短路不同的格点数即可。考虑从上往下扫行,维护若干个 set,\(s_i\) 存储列最短路为 \(i\) 的格点,然后对于一个行连续段,找到在这个区间中与该行最短路相等的格点个数即可。

KEL9317 5

容斥 树上 DP 线段树合并

考虑容斥,设两端相等的边的集合为 \(S\),那就是这种情况的方案数,带一个 \((-1)^{|S|}\) 的系数。

首先我们显然可以把已经固定的数 \(a_i\) 的范围压到 \([1, n]\)

然后考虑 DP,设 \(f_{i, j}\) 表示以 \(i\) 为子树,当前 \(i\) 所在的连通块颜色为 \(j\)。(如果该连通块全是 \(a_i = 0\),那 \(j\)\(0\)

转移就是考虑新加入的子树 \(v\)\(u\) 的边是否两端颜色相同,如果相同,就连通块合并,否则乘上 \(v\) 连通块的情况数。

考虑优化,由于这个 DP 转移不是特别复杂(基本没有同时涉及到 \(x, y\) 的转移方程),因此考虑线段树合并来优化即可。

KEL1287 / P12503 5

二分 三分 函数最值

咕了

KEL9516 3

动态规划 二分 线段树 单调栈

\(f_{i, j}\) 表示前 \(i\) 个文件夹,当前只需要 \(j\) 行,最小的宽度,转移就是枚举新的一列用了 \([i + 1, k]\) 的文件夹,复杂度 \(\mathcal{O}(n ^ 3)\)

考虑优化,我们可以二分最多需要多少行,这样定义 \(f_i\) 表示前 \(i\) 的文件夹使用 \(mid\) 行的最小宽度,复杂度就是 \(\mathcal{O}(n ^ 2 \log n)\)

观察转移式子 \(f_i = \min\limits_{i - mid \leq j < i} \{f_j + \max\limits_{j + 1 \leq k \leq i}\{a_k\} + 1\}\)

考虑线段树优化,维护一个单调栈,然后使用线段树维护 \(f\) 的值即可。

KEL9695 7

线性基 高斯消元 动态规划

考虑这是一个线性空间,因此考虑对最简线性基进行计数。

考虑限制,如果第 \(x\) 小的数是 \(y\),我们把线性基上的数按照主元大小排序,那么就相当于一个子集异或要等于 \(y\)

我们从小到大考虑每一位,设 \(f_{i, j}\) 表示第 \(i\) 位,当前线性基里有 \(j\) 个数。两种情况:

  • \(i + 1\) 位是主元,我们新加一个数,这个数的第 \(i + 1\) 位是 \(1\)\(1\)\(i\) 位都是 \(0\)。如果限制子集包含第 \(i + 1\) 个数,那么这个异或和第 \(i + 1\) 位为 \(1\),否则为 \(0\)

  • \(i + 1\) 位是自由元,那对于这一位,当前已经在线性基里的数随便选,其他数都是 \(0\),且一些子集异或有要求,高斯消元求解的个数即可。

高斯消元可以用 bitset 优化,可以做到 \(\mathcal{O}(\dfrac{n ^ 4 m}{\omega})\)

QOJ2214 5

分治 强连通分量

我们将边按照出现时间从前往后考虑,然后分治。

\(\operatorname{solve}(l, r, V, E)\) 表示当前考虑 \(l\)\(r\) 时间出现的边,当前考虑的点集是 \(V\),当前考虑的边集为 \(E\)

假设 \(p = \lfloor \dfrac{l + r}{2} \rfloor\),考虑将 \(E_{[1, p]}\) 缩点,然后对于一条边:

  • 如果它被缩掉了,那么没必要加入 \(E_r\),直接加入 \(E_l\) 即可。

  • 如果它没被缩掉,那么没必要加入 \(E_l\),直接加入 \(E_r\) 即可。

这样可以保证每层的边数之和为 \(\mathcal{O}(m)\),及时删除孤立点保证点数之和和 \(m\) 同阶即可。

KEL9539 小Z的树 7

Prufer 序列 组合数学

问题 1 3

考虑以下的东西:

  • 一个置换环之间连边
  • 两个置换环之间连边

问题 2 5

如果只有大小为 $2$ 的置换环怎么做。

问题 3 6

对于 $n$ 个点,我们先指定 $k$ 个点,然后要将这 $n$ 个点划分为 $k$ 个连通块,使得指定的 $k$ 个点在不同的连通块中。

提示:Prufer 序列

问题 4 4

大小为 $1$ 的置换环和大小为 $2$ 的置换环并存呢?

问题 5 4

假设大小为 $k$ 的置换环有 $c_k$ 个,答案是多少。

P9488 ZHY 的生成树 4

Kruskal 线性筛

问题 1 1

模拟 Kruskal 的过程。

问题 2 4

我们是否要枚举 $x$ 的所有倍数?

QOJ4881 Hard Problem 7

单调栈 笛卡尔树 暴力

假设原问题的两个区间分别是 \([l, l + c - 1]\)\([l + c, l + 2c - 1]\),那我们设 \(m = l + c - 1\)

我们枚举 \([l, l + c - 1]\) 区间内的最后一个最大值下标 \(x\),我们假设 \([l + c, l + 2c - 1]\) 区间内的第一个最大值下标为 \(y\)。不妨假设 \(a_x \leq a_y\)。(大于的情况可以翻转数组然后做)

考虑 \(m\) 的范围,会有如下条件:

  • \(A < m - c - 1\)(其中 \(A\)\(x\) 左边最后一个 \(a_{A} > a_x\) 的下标 \(A\)

  • \(m - c + 1 \leq x \leq m\)

  • \(m < B \leq m + c\)(其中 \(B\)\(x\) 右边第一个 \(a_{B} \geq a_x\) 的下标 \(B\)

  • \(m + c < C\)(其中 \(C\)\(x\) 右边第一个 \(a_{C} > a_x + k\) 的下标 \(C\)

整理得到 \(\max(A + c, x, B - c) \leq m < \min(x + c, B, C - c)\)

如果 \(c\) 可以是任意数的话,那么 \(m\) 必在的范围是 \(\max(x, \dfrac{A + B}{2}) \leq m < \min(B, \dfrac{x + C}{2})\)

尝试暴力枚举 \(m\),那么满足以上限制的 \(c\)\(\max(B - m, m - x + 1) \leq c \leq \min(m - A, C - m - 1)\)。可以证明这样的复杂度是对的。

posted @ 2025-11-17 20:07  DE_aemmprty  阅读(40)  评论(4)    收藏  举报