省选集训
Lesson 1
QOJ9798
- 一个 \(n^3\) 做法是考虑 \(f_{i, j, k}\) 表示前 \(i\) 个,最后一个数是 \(j\),和为 \(k\)。
- \(f_{1, v, v} = 1, f_{i, j, k} \to f_{i + 1, v, k}, f_{i + 1, v, k + v}\)。
- 另一种是 \(f_{i, j, k}\) 表示前 \(i\) 个,选了 \(j\) 个,和为 \(k\)。
- 考虑如何保证不增:视为两种操作,全体加一和末尾添加一个 \(1\)。
- \(f_{1, 1, 1} = 1, f_{i, j, k} \to f_{i + 1, j, k}, f_{i + 1, j + 1, k + 1}, f_{i, j, k + j}\)
- 考虑粘合这两个 DP。由于和为 \(m\),那么选中的大于 \(\sqrt{m}\) 的数一定不超过 \(\sqrt{m}\) 个。
- 先用第二种 DP 转移前半部分,每次往后面的数加入 \(\sqrt{m}\)。
- 衔接到第一种 DP 时可以直接 \(f_{i, j, k} \to g_{i, \sqrt{m} - 1, k}\)。
- 然后就可以了。
- 空间会炸。那似乎只能两个 DP 一起进行了。
- 我去我怎么调了一百年。
AT_arc148_e
- \(A_i \geq \dfrac{K}{2}\) 是大数,\(A_i < \dfrac{K}{2}\) 是小数。
- 按照 \(|2A_i - K|\) 排序,小数放后面。
- 直接插是没啥问题的。设大数 \(p\) 个,小数 \(q\) 个,那么:
- 插大数时:要避开小数插,\(p + 1 - q\) 种。
- 插小数时:不能和小数插一起,只能在两个大数之间,\(p + 1 - q\) 种。
- 我忘记要去重了。/fn
QOJ9489
- \(0 \to +1, 1 \to -3\),折线图。
- 和为 \(0\) 且不存在相邻的两个 \(1\)。
- 删除深度最大的 \(-3\) 是很有道理的贪心。
- 因此充要条件还有 \(x - 3\) 后面折线最高点 \(\geq x - 1\)。
- 设 \(f_{i, j, k}\) 表示从后往前 \(i\) 个数,\(j\) 为当前高度,\(k\) 为最高高度。
- \(f_{n + 1, 0, 0} = 1, f_{i, j, k} \to f_{i - 1, j - 1, k}, f_{i - 2, j + 2, \max(j + 3, k)} [k \geq j + 2]\)。
- 答案为 \(f_{n, 0, p}\)。实际实现要给 \(j\) 加上 \(n\)。加个滚动数组。
- 怎么一个个都写得这么快。
P11346
- 贪心:对于每个连通块,从区间数最少的开始依次删除。
- 正难则反。
- 设 \(f_{l, r}\) 表示已经加到了 \([l, r]\) 这个并集时的方案数。
- 忽略完全包含区间的不合法转移,DP 内只考虑会带来改变的转移。
- DP 的状态和那些扩展后可以随时加入的点形成树结构。
- 设 \(v_{l, r}\) 表示区间 \([l, r]\) 完全包含几个区间,答案就是 \((n - 1)! \times \prod (n - v_{l_i, r_i})^{-1}\)。
- \(f_{l, r} = (cnt(l, r) \times f_{x, y} + cnt(l) \times f_{x, r} + cnt(r) \times f_{l, x}) \times (n - v_{l, r})^{-1}\)
- 原来复杂度分析这么神奇。
AT_agc020_f
- 离散化,枚举小数之间的相对关系,设为 \(\alpha_i\)。
- 然后把最长的拉出来。
- 设 \(f_{s, sx, sy, tx, ty}\) 表示当前状态为 \(s\),最后一个左端点线段为 \(sx + sy \times \alpha\),覆盖到了 \(tx + ty \times \alpha\)。\(s\) 是 \(2^{n - 1}\) 量级。
- \(f_{0, 0, 0, L', 0} = 1\),转移是枚举在 \((sx, sy)\) 和 \((tx, ty)\) 中的起点,然后抽一个长度 \(L_i\) 转移,更新。答案是 \(f_{2^{n - 1} - 1, ?, ?, C + ?, ?}\)。
- 估计要写个 cmp 啥的。拉了。
- 概率改成除一个 \(C^{n - 1}\) 啥的应该就行。我的妈呀好难写。
- 正在验证。卡住?故障排除。
CF1844H
- 显然问题可以被表示为 \(f(a, b, c)\),分别为 \(len \bmod 3\) 的链有多少个。若有环可以直接删除。
- \(f(a, b, c) = (a + b + c)f(a - 1, b, c)\),直接减到 \(f(0, b, c) = g(b, c)\)。
- 显然可以来电恒等式:(这里注意钦定相对顺序)
- \((b, c), (b - 1, c - 1), (b - 2, c + 1), (b + 1, c - 2)\) 可以互相推导。具体就是等腰三角形知道两个点可以得出第三个点。
- 一开始是 \((n, 0)\),后面每次操作可能会绕一个环或链接两条链。
- \((x, y) \to (x, y), (x - 1, y - 1), (x - 2, y + 1), (x + 1, y - 2)\)
- 一开始 \((n, 0)\) 初值不好算,于是倒着计算,从 \((0, 0)\) 开始。倒着就变成了 \((x, y), (x + 1, y + 1), (x + 2, y - 1), (x - 1, y + 2)\)。
- 那么 \((x + 2, y - 1)\) 和 \((x - 1, y + 2)\) 可以通过过程中维护的 \((x, y)\) 和 \((x + 1, y + 1)\) 直接算,\((x + 1, y + 1)\) 恰好是 \((x + 2, y - 1)\) 和 \((x - 1, y + 2)\) 的叠加,也可以直接算。
- 不要忘了 \(f(a, b, c) = (a + b + c)^{\underline{a}}g(b, c)\)。
- 但是会遇到 \(x\) 或者 \(y\) 等于 \(0\) 的时候,不能逆元。发现不能算的值应该有 \(g(0, ?), g(1, ?), g(2, ?)\)。
- 那就直接预处理这些!
- \(g(0, x) = (x - 1)g(1, x - 2) = (x - 1)(x - 2)^2g(0, x - 3)\)
- \(g(1, x) = x ^ 2g(0, x - 1)\)
- \(g(2, x) = g(0, x + 1) + x(x + 1)g(1, x - 1)\)
- \((x + 1, y + 1)\) 不能算的应该只有 \((0, ?) \to (1, ?)\),其他就是 \((0, ?) \to (2, ?)\)
- 先正着使用并查集维护 \(a, b, c\) 的值,如果出现非三的倍数的环就倒闭。
- 草我式子写错了没问题了/lh
- 验证失败?排除故障。
CF2135E2
- 由于 \(0\) 和 \(1\) 的个数差不变,因此 \(f(s)\) 和 \(f(rev(s))\) 只要删除 \(\texttt{10}\) 的次数相同就一样。
- 跳跃一点,这等价于 \(\min \{s_i\}\) 相同,其中 \(s_i\) 是前缀和。
- 这里两个 \(s\) 数组可以互相转换,条件为 \(\min\{s_i\} + \max\{s_i\} = s_n\)。
- 暴力是枚举 \(l = \min, r = \max, x = s_n\),然后算答案。这是 \(\mathcal{O}(n^2)\) 的。
- 如何算答案?\(\max\) 和 \(\min\) 的限制不好直接做,容斥一下,\(g(l, r, x) = f(l, r, x) - f(l + 1, r, x) - f(l, r - 1, x) + f(l + 1, r - 1, x)\)。
- \(f(l, r, x)\) 是一个经典的反射容斥。
- 尝试把 \(f\) 中 \(r - l\) 相等的绑到一起算,那就是计算 \(f(l, l + k, 2l + k)\)。
不会了。
AGC053E
- \(n - 1\) 个峰值很极限,是满峰值。大概有 \(n\) 种放置情况。
- 感觉接下来这一步很牛啊。
- 按照大值从大到小将二元组插入。那么这个二元组能插入的位置就是末尾和那些 \(p_j < q_i\) 的二元对。
- 树状数组轻松维护。
- 由于题目只是对每个对进行排列,所以对于相同顺序的对,即便是不同的序列也是一样的。
- 考虑我们要让 \(p = n\) 不合法,那么需要存在 \(b_i < a_{i + 1}\)。这个最小的 \(i\) 应当就是 \(p\) 的取值点。
- (原因:\(p\) 一但往右移动就不合法,\(p\) 往左移一定劣于 \(p\))
- 为啥最后一步不会啊???
- 最后一步其实也很朴素,就是枚举中间两个值 \((p_x, q_x)\) 和 \((p_y, q_y)\),然后还是按照值域从大到小插入。
- 只是由于形式和 \((x, y)\) 有关,需要扩展到和 \((x, y)\) 无关的样子。写出来会比较抽象。
Day 1
D1T1
-
最大的 \(k\) 使选出 \(k\) 条路经两两不交。
-
树直接从下往上随便连。
-
把没有的点删掉
-
狂暴猜结论:
- 缩点,一个双连通分量内的答案只和每个信号基站度数相关。
- 连通分量之间的传输是树的情况。
-
如何构造答案
-
一种构造是微调。\(\mathcal{O}(n^2)\),无法通过。GGG。
- 注意到一条路径上经过了标记点肯定停止。可以把标记点删除,将原图断成多个连通块。
- 在每个连通块内按照 DFS 树从下往上合并即可。
D1T2
- 分析数的情况:肯定不是,全说真话有可能是,有说谎有可能是。
- 第一种数不重要。
- 设后两种的数量为 \((u, v)\),容易发现题目问的就是 \((u, v)\) 情况下最少问多少次。
- 分析 \(f(u,v) = i\) 的条件,打表发现 \(0 \leq v \leq 2^i - (i + 1)u\)。
- 那算 \(u\) 的范围就随便算一下就行了。然后算前缀和即可。
Day 2
D2T1
-
判断一种染色方法是否可行。
-
考虑链。
-
一个区间想要继续合并只能是最大值 / 最小值,但这似乎不太可能。
-
最后一次操作是 \([1, y]\) 和 \([y + 1, x]\) 颜色区间的合并,如果 \(y \neq 1\) 不可能得到最小值。
-
需要 \(1\) 在最前 / 最后。最大值同理,需要 \(x\) 在最前 / 最后。
-
正式合并最后一次不需要保证最大最小。
-
答案为 \(\sum_{x = 1}^{n - 1} 2^{x - 1}2^{n - x - 1} \times 2 = 2^{n - 1}(n - 1)\)。
-
错了???
-
有可能会有重复(如
1 2 3 4占了 \(3\) 次贡献,多算了 \(2\) 次) -
其实如果前缀 \(x, x + 1\) 都合法,说明 \(x + 1\) 前缀一定是 \(1, 2, \cdots, x + 1\)。
-
重复的情况只有 \(1, 2, \cdots, n\) 和 \(n, n - 1, \cdots, 1\)。
-
为啥还是错了,打个表。
-
好像只要 \(p_i = i\) 且 \([1, i - 1]\) 合法,\([1, i]\) 就合法。
-
因此答案应该是 \(2^{n - 1} + \sum_{x = 2}^{n - 1} 2^{x - 2}2^{n - x - 1}\times 2 = 2^{n - 1} + 2^{n - 2}(n - 2)\)。
-
链通过了。
-
考虑菊花。是不是任意情况都行,试试?其实是中间的可以是 \(1, 2, n - 1, n\),答案为 \(4(n - 1)!\)
-
说是删除一条边分成的两个连通块,topo 序计数后乘起来。
-
去重怎么办?两个条件:
- \([siz_{v'} + 1, siz_v]\) 都在 \(v\) 子树内,\(v'\) 子树外。
- 这些数存在 topo 顺序。
-
因此对于 \(fa_v, v, v'\),答案是:
-
\[\text{topo}(A / sub(v)) \times (\text{topo}(sub(v)) - \sum_{v_1}\text{topo}(sub(v')) \times \text{topo}(sub(v)/sub(v'))) \]
-
根据 \(n!\prod siz_i^{-1}\),我们可以在从上往下的时候计算出 \(\text{topo}(A/sub(v))\),预处理出 \(\text{topo}(sub(u))\),并且 \(\text{topo}(sub(v)/sub(v'))\) 可以通过简单的逆元算出。
-
写一下?
- 我竟然不会无根树拓扑计数!!!话说这个其实是不是不叫拓扑。
- 我发现了,如果我钦定一个点 \(x\) 最晚被删除,那么这时就能转化成有根树拓扑序。
- 那是不是再加个换根就差不多了。写一下?
- WA 了,感觉不太好。
- 去重出了点问题,大概在反着填的时候。
- 那能不能再加限制?我要一直都让 \([1,x]\) 部分的 \(x\) 最小?也就是我要让 \([x + 1, n]\) 的部分最大(但是是比较小的部分)
- 我觉得整个算法都崩溃掉了。换一下吧。
- 是不是重复唯一一种可能就是 \(u\) 只有一个儿子。
- 差不多,然后就拆一下就行。
- 根处十分恶心,有可能重复,需要好好分析一下。
D2T2
- 考虑单次询问。每个点在 \(a_i\) 时刻之后要不包含在 \((L, R)\)。
- 必要条件:\(a_i \geq \min(x\to i, y \to i)\)。又 \(i\) 下面至少挂长为 \(a_i\) 的链,那么最多 \(\sqrt{n}\) 个点。
- 按时间建出笛卡尔树。\(dp_i\) 表示走进 \(i\) 结点的最少时间。\(\mathcal{O}(nq + q\sqrt{n})\)。瓶颈在找到这些点。
- 重链剖分。不会咋办。
- 发现一条重链两边进是没用的。因此一个 \(x\) 的改变只会影响 \(x\) 往上的每一条重链。
- 重链维护一个 set 就行。将点拉出来之后就可以在笛卡尔树上 DP 了。
Lesson 2
P9961
- 纯难题。
- 考虑构造一个图使得最终情况较好判断且变化小。
- \(a_i \to a_{i + 1}\) 差点。
- \(a_i + 1 \to a_{i + 1}\) 很可以。
- 每次可以交换两对点的终点值,因此最少 \(\dfrac{n + 1 - \text{cyc}}{2}\) 向下取整。
- 构造很神秘。
- 每次找到最大的 \(i\) 使得前面有 \(a_j > a_i\)。
- 不行有点太变态了。
- 考虑如何让一个 \(a_x\) 从环中分出来。
- 需要让 \(a_x + 1\) 在 \(a_x\) 前面。
- 那两个我就要让 \(a_x + 1\) 在 \(a_y\) 前面,\(a_y\) 在 \(a_x\) 前面,\(a_x\) 在 \(a_{y} + 1\) 前面。
- 限制很松,那就随便构造。先满足 \(a_y + 1\) 在外面,那就 \(a_y\) 是 \([1, x]\) 的最大值。
- 那如何让 \(a_x + 1\) 在 \(a_y\) 前面?如果有 \(a_x + 1\) 也在 \(a_y\) 后面,那我就让 \(a_x + 1\) 是新的 \(a_x\) 就行了。
QOJ14506
- 从简单的点入手。
- 删叶子。每次叶子 \(x\) 出现一定会伴随一个 \(y\) 一起出现。
- 每个点维护一个 \(\text{set}\),表示第 \(x\) 个数出现了几次。
- 每个点记得维护有效连通块个数,和这个个数与最大出现次数的差值。每次选择最小的作为叶子删除。
- 好难写。
- 我竟然一遍过了。
QOJ12150
- 我们需要动态地找出相离的区间 / 重合的区间。
- 并非动态,直接排序后扫一遍就行了。
P14847
- 考虑将线段按照左上,左下,右上,右下分成四组。设为 \(A, B, C, D\)。
- 答案存在当且仅当 \(A + B = C + D\) 且 \(A + C = B + D\),也就是 \(A = D, B = C\)。
- 那注意到 \(A + B = A + C = \dfrac{\sum}{2}\),因此找到两组和为 \(\dfrac{\sum}{2}\) 的子集就可以构造了。
- 这个可以使用 DP 计数。
- 但好像实际上,由于存在一个,补集就必然是另一个,因此需要有 \(4\) 组以上。
QOJ4912
- 考虑一个算法:
- \(a_x = 0\) 时,\(x = 0\),\(a_x = 1\)。
- \(a_x = 1\) 时,\(x = x + 1, a_x = 0\)。
- 使用前五个位置记录下标,并判断什么时候刚开始就在 \(u - 1\),这就说明调用了 \(2^u\) 次。
QOJ4832
- 变态来的。
- 考虑 \(n = 3, k = 1\) 我们搜索每种盘面对应的策略。发现存在策略正确率超过 \(0.66\)。
- 将字符串分成长度为 \(3\) 的很多段。然后按搜索出来的策略做就行了。
P9070
- 考虑先不通过交换,重排每一行让列互不相等。
- 可以直接二分图匹配。
- 然后就可以 \((i, j)\) 和 \((j, i)\) 交换了。
- 这题咋这么诡异。
Day 3
D3T1
- 考虑 \(A\) 每次向前移动一格,\(B\) 每次向前移动两格。
- 一种可能的策略是先将 \(A, B\) 全部移动到环内,然后 \(A, B\) 同时走 \(1\) 和 \(2\) 格。
- 然后差不多就行了。
- 好像拉了,是 \(5n\) 的。
- 草 \(n\) 怎么也是未知的。
- 失误了。
- 考虑如何让 \(A, B\) 全部都进入环内。
- 如果都进入环内了,\(q\) 次确定 \(q\) 是很轻松的。
- 目前只会 \(3(p + q)\) 让 \(A, B\) 都进入环内。
- 如果一个点在环内,一个点在环外,且环内的点和环外的点模 \(q\) 同余,就可以找到 \(p\) 了。
- 需要 \(5p + 4q + 1\),差一点。
- 能不能再压一下???
- 把 \(p\) 的范围压到了 \(q\)。过题了。哦耶。
D3T2
- 先暴力枚举 \(i\) 再说。看看如何判断。假设 \(x\) 为 \(i\) 所在区间个数。
- 从简单的入手。对于所在区间个数不及 \(x\) 的点,无脑填满。
- 现在,所有点的区间个数都大于等于 \(x\)。那么这里这个点的个数应该是 \(\dfrac{S}{x}\) 的。
- 我咋才发现可以网络流。拉了。
- 感觉模拟不了网络流啊。只能先放着了。
- 让我追忆一下 Dinic 怎么写。
- 我真的只会写 EK 了。能不能直接碾过去。
- 碾不过去。/ll
- 主要烦人点是每次要去掉 \(i\) 再网络流。
- 眼光放开,考虑对于全部数,最大值最小是多少。假设是 \(v\)。
- 那么 \(d_i < v\) 和 \(d_i > v\) 就都是显然的了。
- \(d_i < v\):所有数都要小于 \(v\)。不可能。
- \(d_i > v\):你稍微把最大值最小的情况调整一下就行了。
- 因此只需要判断 \(d_i = v\) 的情况。
- 继续考虑调整,首先所有数限制都是 \(v - 1\) 是可以求出来的。
- 显然不能匹配完,而且在残量网络上一定存在一条从 \(i \to T\) 的路径。只要如此,加入 \((S, i)\) 时就可以增广。
- 并且最大流应该等于 \(m - 1\),不然就算 \(S \to i\) 流满了也不够。
- 以上就是充要条件。
- 找阙值可以:
- 直接二分。
- 在 \(d_i\) 离散化后按顺序增流。\(\sum d_i = S\),根号种,所以可以。
- 在 \(d_i\) 离散化后二分,并且如果二分往大的走就增流。
D3T3
- 怎么感觉这个 \(f(s)\) 很典呢。
- 是不是要正着扫一遍,看最小值要 \(\geq 0\),反着来一遍,最小值也要 \(\geq 0\)。
- 那 \(n^2\) 是能做的。
- 为啥 G 了。
- 哦因为正反的删除策略需要一致。
- 可以,\(20\) 了。
- 可以发现 \(A\) 性质的 \(q = 100\) 和 \(20\) 本质相同。
- 好像可以了。
- \(\text{Sub 4}\) 可以直接上单侧递归线段树做。但是我打算先放一下去看 T2。
- 我回来写 \(60\) 了。
- 设 \(s_i\) 表示前 \(i\) 位的正常的和,\(t_i\) 表示前 \(i\) 位倒过来的和。
- \(s_{L - 1} \times (R - L + 1) - \sum_{i = L}^R t_i - \min\{s_r\} + \max\{t_r\}\)。
- 两颗单侧递归线段树,然后稍微预处理一下是不是就可以了。
- 我又不会了,偶数咋处理啊。
- 能不能把正反并到一起来。
- 咋办,倒闭了。
Day 4
D4T1
- 啥博弈啊??
- 先写个暴力中的暴力。
- \(x = y\) 很有规律啊。
- 对于固定终点,每行有且仅有一个 \(0\)。
- 谁爱做谁做。
D4T2
- 啥构造啊???
- 一个集合有 \(2^{2000}\) 种状态。这咋办。
- 间隔可能只有 \(63\) 种左右。
- \(1\) 的个数很少的时候可以直接 \(m - 1\) 构造。
D4T3
- 还有 \(n \leq 13\) 的说。
后记
不太像是题解,更像是一个简单的记录。实际上很多文件都因为体育中考丢失了。

浙公网安备 33010602011771号