Loading

题目思考过程简记

ARC 175 C 题解

题目链接

我们考虑经典套路,假设前 \(i - 1\) 个数已经被确定。

\(f_k(x)\) 表示 \(a_k = x\)\(\sum_{i = k + 1}^n | \ a_i - a_{i - 1} \ |\) 的最小值。

那么,\(a_i = x\) 当且仅当 \(x\) 取最小值且 \(| \ x - a_{i - 1} \ | + f_i(x)\) 为所有可能中的最小值。

我们设集合 \(I_k = \operatorname{argmin}_{x \in [l_k, r_k]} f_k(x)\)

一个奇妙性质:\(I_k\) 一定是一个区间。

感性理解。容易发现 \(f_k\) 是一个凸函数,所以当取到最小值时,取值定为一个区间。


我们考虑 \(f_k(x)\) 怎么求。

丁真一下。我们可以考虑直接贪心。若 \(a_i = p\),则 \(a_{i + 1}\)\(\operatorname{argmin}_{x \in [l_k, r_k]} | \ x - p \ |\)。然后转移还是比较简单的。

我们设 \(m_k = \min_{x \in [L_k, R_k]}\{f_k(x)\}\)

\[f_k(x) = \begin{cases} m_{k+1} + l_k - x & (x < l_k)\\ m_{k+1} & (x\in [l_k, r_k])\\ m_{k+1} + x - r_k & (r_k < x) \end{cases} \]

以上贪心可以通过大力分讨得证。但是这一眼正确吧。

那么我们观察 \(f_k(x)\) 的转移式,发现最小值是非常能确定的。于是得到下列结论:

  • 如果 \([L_k, R_k] \cap I_{k+1} \neq \emptyset\),则 \(I_k = [L_k, R_k] \cap I_{k+1}\)
  • 如果 \(R_k < l_{k + 1}\),则 \(I_k = R_k\)
  • 如果 \(L_k > r_{k + 1}\),则 \(I_k = L_k\)

综上,我们求出了 \(I\)\(f\) 实际上不需要求出。


回到原题。我们要找到 \(x\) 使 \(x\) 取最小值且 \(| \ x - a_{i - 1} \ | + f_i(x)\) 为所有可能中的最小值。

仍然是大力分讨:

  • \(a_{i - 1} \in I_i\) 时,\(a_i = a_{i - 1}\)

  • \(L_i \leq a_{i - 1} < l_i\) 时,\(a_i = a_{i - 1}\)

  • \(a_{i - 1} < L_i\) 时,\(a_i = l_i\)

  • \(a_{i - 1} > r_i\) 时,\(a_i = r_i\)

发现上述过程可以简化为 \(a_i\)\([L_i, r_i]\) 中最靠近 \(a_{i - 1}\) 的值。

CF1946E 题解

题目链接

首先发现左右两部分是比较独立的,所以可以分开计算后合并。

注意到我们可以把整个数集分成左右两部分,即 \(\binom{n - 1}{p_{m1} - 1}\)

然后我们不妨只考虑左边。

发现左边的最大值也已经确定,且最大值右边的所有数可以随便选,即 \(\binom{p_{i + 1} - 2}{p_i - 1}\)

由于内部需要换顺序,所以还要乘上 \((p_{i + 1} - p_i - 1)!\)

右边同理。最后的答案即为全部的乘积。

CF1923E 题解

题目链接

考虑记录每一个点 \(i\) 离他最远的一个祖先使得祖先到 \(i\) 的路径上没有 \(a_i\)。设他为 \(\text{lst}_i\)。然后如果两个 \(u, v\)\(\text{lst}\) 相等,那么这条路径就是好的。每种颜色枚举即可。

KEL 题解

题目链接

Part 0. 错解

我们考虑一个点,它的权值 \(a_i\) 在区间 \([l_i, r_i]\) 内时,我们把 \(f_i\) 标记为 \(1\)。此时,符合条件的 \(i\) 点要满足在 \(i\) 子树内的所有 \(v\),他的 \(f_v = 1\)

于是我们可以维护一颗线段树,线段树的值表示 \([l, r]\) 区间内有多少 \(f_i = 0\) 的数。

如果当前修改了 \(x\) 的权值导致 \(a_i\) 是否合法的状态更改,那么可以把 \(1\)\(x\) 的简单路径上所有点 \(+1\)。用一个标记永久化的线段树再套一个树链剖分即可。

错误原因:细节无法处理。

Part 1. 正解

我们考虑只看一个中序遍历中相邻两项的大小关系。

答案合法,当且仅当中序遍历权值单调。

于是,考虑维护。当一个相邻关系发生更改,则可以用标记永久化线段树进行区间 \(\geq 1\) 的计算。

ABC347F 题解

链接

我们考虑这三个正方形的相对位置有多少种情况。

我们把正方形的顶点设为 \((x_i,y_i)\)。容易发现,放置合法当且仅当 \(\forall i \neq j, | \ x_i - x_j \ | \geq d \ \text{or} | \ y_i - y_j \ | \geq d\)

发现这只有可能是以下两种情况。

于是便可以开始写了。

ABC347G 题解

链接

还算是比较经典了。

首先我们注意到一个性质:\(1 + 3 + \cdots + n = n ^ 2\)。所以我们可以把平方拆开。

然后容易证明 \(a_{i, j}\)\(1\) 一定比填 \(0\) 不劣。

我们可以把 \(a_{i, j}\) 拆成 \(4\) 个点,然后我们想到了最小割。

构造网络:

  • \(a_{i, j, x} \leftarrow a_{i, j, x + 1}\),权重为 \(+\infty\)

  • \(a_{i, j} \neq 0\)\(\forall x \neq a_{i, j} - 1\)\(a_{i, j, x} \rightarrow a_{i, j, x + 1}\),权重为 \(+\infty\)

  • 对于相邻的两个点 \(A, B\)\(\forall x > y, a_{A, x} \rightarrow a_{B, y}\), 权重为 \(2\)

  • 对于相邻的两个点 \(A, B\)\(\forall x, a_{A, x} \rightarrow a_{B, x}\), 权重为 \(1\)

容易证明这个网络的最小割即为所求。

按照 Dinic 跑最大流,残量网络即为最小割。时间复杂度 \(\mathcal{O}(F\times m) = \mathcal{O}(n^4 \times d^4)\),能过。

一个 Albert_Wei 推荐的不知道什么题

做法 1(简单)

我们考虑枚举原串在新串里的位置。

然后由于需要括号序列合法,前后直接乱 dp 即可。

做法 2(较难,Albert_Wei 提供)

定义 \(f_{i, j, k}\) 表示新串匹配到前 \(i\) 个,括号序列的和为 \(j\),原串匹配到前 \(k\) 个。

\(k\) 失配时,直接跳到 \(nxt_k\) 即可。

CF1530G 题解

链接

考虑对操作进行转换。假设 \(a_i\) 为第 \(i\)\(1\) 前面的 \(0\) 的个数。

则操作可以进行如下转换:

转换 1:选择一个长度为 \(k + 1\) 的子区间 \(a_{l, \cdots, l + k}\)。我们先把 \(a_{l + 1, \cdots, l + k - 1}\) 翻转,然后更改 \(a_l\)\(a_{l + k}\) 使得 \(a_l + a_{l + k}\) 不变。

转换 2:操作是可逆的,所以若我们能把 \(S, T\) 都转换成同一个字符串 \(I\),那么 \(S \rightarrow T\) 就是可行的。

于是现在的问题是能否把 \(S, T\) 转换成同一个 \(I\)


现在我们想要把 \(a\) 数组不为 \(0\) 的值尽量往前移,且我们有 \(2\times n\) 的操作次数。

容易发现,当我们翻转了一个 \(a_{l, \cdots, l + k}\) 时,我们可以让 \(\begin{cases}a_l = a_l + a_{l + k}\\a_{l + k} = 0\end{cases}\),这样我们操作了 \(n - k - 2\) 次后,只会有 \(a\) 的前 \(k + 2\) 个位置有值。


然后我们考虑如何把前 \(k + 2\) 个位置移到第 \(1\) 个位置。

若我们每次操作 \(a_{1, \cdots, k + 1}\)\(a_{2, \cdots, k + 2}\),则每次 \(a_{2, \cdots, k + 1}\) 会先进行长度为 \(2\) 的循环位移,然后把前两个数设为 \(0\)

经过 \(\lfloor \frac{k}{2} \rfloor \times 2\) 次操作后,\(\forall 2 \leq i \leq k + 1, a_i = 0\)

然后,分类讨论。


先考虑 \(2 \ |\ k\) 的情况。我们发现,奇数编号的位置不可能转到偶数编号的位置,所以不可能。


再考虑 \(k\) 为奇数的情况。这时候,我们只要 \(a_{2, \cdots, k + 2}\)\(a_{1, \cdots, k + 1}\) 轮流操作即可。次数 \(k + 1\)

时间复杂度 \(\mathcal{O}(n ^ 2)\),操作次数最大为 \(n + k + 1\)。由于 \(k = n\) 时不可能存在解,所以满足限制。

P2375 题解

链接

我们考虑朴素算法。

显然,我们可以先跑一遍 KMP,计算出每个 \(i\)\(nxt_i\)

然后,容易发现我们可以暴力跳每一个前缀串的 border,这样可以直接统计出 border 长度 \(\leq \lfloor \frac{i}{2} \rfloor\) 的 border 数量。


回到原题。我们发现上述朴素做法会被 \(2 \times 10^5\)\(\text{a}\) 拉爆。于是我们考虑优化。

我们能不能考虑把重复的计算节省掉呢?

考虑类似 KMP 的优化。假设当前我们计算到 \(i\)

发现,如果我们最大的 \(\leq \lfloor \frac{i}{2} \rfloor\) 的 border 长度为 \(x_i\),则 \(x_i\) 一定是 \(x_{i - 1}\) 的一个 border。

证明:博主暂时是感性理解。后面补严禁证明。

于是考虑一直使用一个 \(j\)。复杂度为 \(\mathcal{O}(n)\)

CF1530F 题解

链接

发现 \(n \leq 21\) 且这道题看起来就很可以容斥。但是直接容斥会爆炸掉。

考虑正难则反。容易把题目转化为 求每一行,每一列,每一对角线都不全为 \(1\) 的概率

接下来这一步比较巧妙。我们考虑把 对角线看作一种特殊的列,然后对列进行容斥。、

这样每一行就会有一些点固定是 \(1\)。用 \(dp\) 预处理出来即可。

ABC348F 题解

链接

什么时候能在 Atc 上扬眉吐气啊/ll。

一些注意点:

  • 一看到这种题就应该往 bitset 的方向想。

  • 如果用 bitset,就应该跳脱之前的思维,尝试从最朴素的暴力重新想起。


看到这道题,发现直接做非常的不可做的样子,考虑 bitset。

我们可以先枚举左端点 \(l\)。这样,当我们枚举 \(j\) 时,对于所有的 \(k\) 使得 \(a_{k, j} = a_{l, j}\)\(k\)\((l, k)\) 可以多一个相等的下标。

于是考虑使用 bitset,\(p_{i, x, j}\) 表示 \(a_{i, j}\) 是否等于 \(x\)。然后直接异或操作即可。

CF1951D 题解

链接

这很唐氏。题目还带故意误导。

Part 1. 题目误导

我们发现题目说最多 \(60\) 个篮子,并且样例给了一个二进制,容易往这方面想。

但是在瞎搞之后发现能处理地情况少之又少,感觉就像在玩原神。

甚至随便都能举出反例。

Part 2. 正确思路

我们考虑能不能只使用 \(2\) 个篮子。在经过手玩样例后,我们发现 \(k\) 一定是 \(\leq \lceil \frac{n}{2} \rceil\) 的。若第一个数取 \(x > \frac{n}{2}\),则可以轻松构造出所有 \(\leq \lceil \frac{n}{2} \rceil\) 的情况。

CF1951E 题解

链接

这题也很唐。

做法 1(自己想出,实现较难,耗时较大)

我们发现如果一个串首位不相同则一定不是回文串。

顺着这个思路想,我们可以把所有和 \(s_1\)\(s_n\) 不相同的字符视为特殊字符,然后与普通字符匹配。

接下来是大量分讨。由于我感觉电脑 CPU 快干废了打字都慢所以不叙述。

做法 2(经过提示,实现简单,主要靠直觉)

看到这种题直觉告诉我们应该可以分成最多 \(2\) 个串。

于是直接枚举分界点即可。利用 manacher 或者 hash 判断回文。

正确性易证,不过多叙述。

ABC349F 题解

成为小丑。

链接


我们考虑先对 \(M\) 进行质因数分解。考虑一个显然的性质:

\(\operatorname{lcm}(a_1, a_2, \cdots, a_k)\) 是所有数质因数分解后最大的指数乘积。

于是我们把 \(M\) 的质因子拿到 \(a_i\) 里去算有哪些 \(a_i\) 是有这个最大的指数的。

我们可以设 \(b_i\)\(a_i\) 中是否为最大指数的质因数状态压缩。

然后可以直接 dp 了。时间复杂度 \(\mathcal{O}(2^{28})\),勉强能过。

因此这道题就变成了 shaber 题。

CF1142C 题解

比较难的是将二次函数转换为一次函数。但是其实想到了。注意不要浪费任何一个思路。

考虑这个函数二次项系数为 \(1\),可以将 \((x, y)\) 变为 \((x, y - x ^ 2)\)。然后问题被转化成了过两点的一次函数上方无点。

这比较简单,就是这个点集的上凸壳边的数量。这不用 Graham 扫描法。

posted @ 2024-03-26 23:01  DE_aemmprty  阅读(55)  评论(0)    收藏  举报