Loading

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\) 水个分得了。

\[\dfrac{1}{2} C(n) \dfrac{n}{2}(\dfrac{n}{2} - 1)\times (\dfrac{n}{2} )! \times (\dfrac{n}{2})! \]

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\)

posted @ 2025-07-29 13:38  DE_aemmprty  阅读(14)  评论(0)    收藏  举报