DE_aemmprty 的草稿纸(2025.7.29-?)
2025.7.29
序列
\(a_{i - 1} \geq a_i - 1\) 且 \(a_1 = 0\),\(a_i \geq 1\) 时是充要的(by wjc)
直接做不可做,可能要利用二进制 / 贪心性质。
考虑观察最优解,我们使用调整。显然,答案是若干个块,第一个块为正数,其他若干块为负数,且负数块只能被拆成前面负数后面正数后缀和为正数。
正着做没法做啊,但是倒过来,可以对前面的答案 \(\times 2 + a_i\),似乎更有前途一点。
倒着做应该是当和全都是正数的时候,一直加,变成负数了,就分界点。
欸是不是第一个块也可以嗯贪。我先试一下、、、
直接贪心是对的哇哦。然后不会优化了啊。。。
猜一个块长不会很大。试一下。好像真的超级小,我试着构造一下。
由于后面的数能造成的贡献之和最大都不超过 \(1\),所以应该要么直接到开头,要么比较短。
于是可以直接倍增。
对于暴力找的正确性,由于两个数在一起,肯定不会移动超过 \(30\) 次,否则肯定相等。
AT_agc032_d Rotation Sort
考虑从大到小观察值。显然,答案一定小于 \(n\),然后考虑观察最大值。我们只关心操作前面的数操作完成后,有没有把最大值换到最后面。
先不考虑那些没有操作的元素,我们考虑操作了的元素有什么性质与结构。实际上,每个点最多会被操作一次。
那问题转化成,选择一些点操作,使得最终升序,且费用最小。
感觉,设 \(f_{i, j}\) 表示前 \(i\) 个元素,不动点最大值为 \(j\),然后直接转移就行了。
依古比古
似乎没什么明显的分界点。对于每个元素单独考虑?先考虑 \(1\)。
一个序列合法当且仅当 \(pos_x\) 和 \(pos_{x + 1}\) 的大小关系不变。于是考虑翻转位置和值。
值域从小到大考虑 DP。设 \(f_{i, j}\) 表示对于所有 \([1,i]\) 的数,\(i\) 的相对位置为 \(j\)。根据大小关系直接摁塞即可。
然后我们去除题目限制,这道题就是简单的冒泡排序,最小操作次数是逆序对个数。
将逆序对个数拆成每个 \((x, y)\) 大小关系的和。对每个 \((x, y)\),使用 naive 的 \(\mathcal{O}(n^5)\) 的 DP 可以通过。
AT_agc033_e Go around a Circle
考虑超级弱化,我们只考虑每个点相交之间的关系。弱化不出来。
想太复杂了,由于只有 \(R, B\),所以考虑连通块。把环整合出来。
先考虑简单的情况,一个点在边界点可以直接来回走,走出偶数步,如果这一段为奇数就走完整个段。对于正常的点,我们就是找到一个符合要求的边界走过去,然后来回走浪费次数。
容易发现,对于答案的连通块,每个都必须是奇数,而且显然有一个大小性质,对于一个连通块,它的大小 \(x\) 必须小于等于 \(c_0 + [2 \, \Big| \, c_0]\),且小于等于每个奇数同色连通块的 \(\mathbf{min}\)。直接 \(\mathbf{DP}\) 即可。
2025.7.30
VP CF,没有草稿纸。
做了的题:
CF2028D
CF2028E
CF2028F
CF1998E1
2025.7.31
AT_AGC030_F Permutation and Minimum
两个全部固定的可以直接去掉,剩下固定一个的和随便放置的。
考虑从小往大插入?
先不定顺序,然后直接从大到小 DP。设 \(f_{i, j, k}\) 表示 \(\geq i\) 的数中,有 \(j\) 个空点被塞了一个,还剩 \(k\) 个原本就一个的点。
AT_agc040_d Balance Beam
显然,假设我们已经排好了排列,那么题目就是问你对于 \(x\) 使得 \(B\) 从 \(x\) 到终点的时间 \(\leq \sum\limits_{i = 1}^n a_i\) 的占比最小。
马的假了。这真的可做吗???
Broken Queries
应该是二分 / 倍增状物的东西。
如果两个不重的询问集合都没 \(1\),则两个集合询问值相等。
如果两个不重询问集合有 \(1\),则不相等。
第一个进一步扩展:两个等大集合询问值为 \(0\),则 \(k \leq l\)。否则相反。
由于 \(\log n = 30\),所以考虑剩下 \(3\) 次怎么用。
我们可以固定一个受信任的区间,然后直接二分。
我们考虑两个互不相交的区间,如果结构相同,则两个区间必定全部没有 \(0\),因此我们可以用 \(2\) 次询问判断一个集合有没有 \(0\)。然后如果我们知道了 \(k\) 和 \(\dfrac{n}{2}\) 的大小关系,我们就可以直接分四个部分二分,对于每个部分,找满足长度能包含 \(k\) 且 \(0, 1\) 个数固定的那部分二分。
如何判断大小关系?我们直接拿受信任的区间查询一下是 \(0\) 还是 \(1\) 即可。
P8339 [AHOI2022] 钥匙
考虑特殊性质怎么做。不会图论,先咕了。
从每个询问在线做不可做,考虑对每个点对去计算它贡献了哪些询问。发现是二位数点,直接做即可。
没有特殊性质呢?对每个钥匙为根建虚数,可以算出合法点对的个数,容易证明这样的点对只有 \(5n\) 个。
CF954H Path Counting
应该是按深度 DP。
2025.8.1
宝藏
数据范围一眼 meet in the middle,所以考虑 \(n \leq 20\) 怎么做。
显然状压,每次转移的时候预处理一下已选节点对其他的影响可以做到 \(\mathcal{O}(n2^n)\)。
考虑 meet in the middle 怎么做,我们先枚举左半部分的状态,现在要处理右半部分形如 0001?1100?1 这样的模式串怎么做。
考虑分成三部分容斥,可以做到 \(\mathcal{O}(2^{n + 6})\)。理论上可以通过。
好像还可以对左边做高维前缀 \(\mathbf{max}\)。
括号
\(n \leq 3000\) 怎么做?或者说,考虑如何 \(\mathcal{O}(n)\) 计算价值?
有一种朴素的方法就是对于每个点对 \((i, j)\),判断包含 \((c_j, c_i)\) 的排列有多少种,也就是对于每种排列,\((c_j, c_i)\) 出现了多少次。我们对于一个括号序列,可以直接计算出括号序列为这个的排列个数,然后再乘上 \((c_j, c_i)\) 的出现次数。由于 \((c_j, c_i)\) 只有 \(\text{((, )), (), )(}\),所以问题转化为如何动态维护这四种串的个数。如果暴力维护的话,复杂度是 \(\mathcal{O}(n^2)\) 的。
问题在于:我们如何快速统计所有括号序列和 \(c\) 串中这四个串的出现总数,然后乘上 \(2 \times \dfrac{n}{2}!\) 就是答案。并非,应该是分别乘上 \((x - a)!(x - b)!\) 状物的东西。
就以 \(()\) 为例子。我们打个表。不会做。用 oeis 上的 \(n\leq 30\) 水个分得了。
CF1720E Misha and Paintings
考虑弱化,如果我们要让 \(k\) 变成 \(k - 1\)?没啥用阿。如果我们只能做一次操作?假设矩阵外的种数是 \(x\),我们能做到 \(x\) 和 \(x + 1\)。
首先,肯定有变大和变小两种情况。先考虑简单的入手,如果是变大那直接改 \(1 \times 1\) 的即可。
如果变小,大胆猜测只能操作两次。然后就判断操作一次可不可以。
直接枚举矩阵,则这个操作能得到的答案为外面的数的种类 \(x\) 和 \(x + 1\)。
CF1647F Madoka and Laziness
考虑枚举两个峰,暴力的去做。算了先理清思路,我们假设两个峰分别是 \(x, y\),那么,\(x + 1\) 到 \(y\) 都包含在 \(y\) 的子序列里,前面的序列能分成结尾是 \(a_x\) 和 \(a_{x + 1}\) 的子序列。不对感觉很没有道理阿。
首先有一个肯定是 \(n\),考虑另一个可能是什么。显然答案的形式可以分成三部分,前后可以直接贪心,中间的那一部分可以直接 DP。
CF1651F Tower Defense
首先,怪兽走路的时间可以直接忽略。
我们可以考虑分块,对于每一个块,维护该块清零后 \(t\) 秒总和是什么。
2025.8.2
AT_arc076_d [ARC076F] Exhausted?
去掉 \(r\) 后,这个问题是一个简单的贪心的问题。但是现在有 \(r\)。我们现在的问题是如何寻找最少加入的坐标,使得这个图存在一个完美匹配。
判断完美匹配的充要条件是 \(\mathbf{Hall}\) 定理,所以我们将问题转化为:最少加入多少右部点,使得这个图对于任意一个左部点的集合,这些点连接的右部点个数大于等于左部点的个数。
考虑这个图特殊的性质:对于每个左部点,它连接所有坐标 \(\leq l_i\) 且 \(\geq r_i\) 的右部点。而且,现在如果我们想要判断一个左部点的集合对应多少右部点,其实右部点要么是全集,要么是前缀 + 后缀。
显然,每次加点,一定是让所有的点右部点个数 \(+1\)。因此,问题转化为 \(|S| - max\{L_i\} - max\{R_i\}\) 的最大值。
\(max\) 太出生了,我们考虑枚举 \(max\)。假设我们枚举了 \(x, y\),那么我们需要求出 \(L_i \leq x\) 和 \(R_i \leq y\) 的个数,减去 \(x\) 和 \(y\)。
枚举两个过于浪费,我们只枚举一个 \(x\),则我们把所有点按照 \(L_i\) 排序,然后扫描线。对于 \(y\),我们要快速维护小于等于 \(y\) 的个数再减去 \(y\)。这是一个区间加法,全局 \(max\),线段树容易维护。
楼房重建
每次 pushUp 时间复杂度 \(\mathcal{O}(\log n)\),总复杂度双 $\log $。
李超线段树
对于每个区间,这个区间的懒标记维护了一个可能称为最大值的线段。
每次,如果我们想要给一个区间插入一条新的线段,那这会与懒标记上的节点冲突。
因此,我们考虑比较懒标记的线段和插入进来的线段,看哪个更加优秀。显然,这两条线段会形成一个下凸壳,而一定有一条线段在左右其中一个区间中不优秀。因此直接暴力下放懒标记。
查询我们对于所有区间都对懒标记上的线段计算,然后取最大值即可。复杂度为双 \(\log\)。

浙公网安备 33010602011771号