06 2024 档案
摘要:Day -1 CSP-S 打炸了,压线进了 NOIp,希望不要再炸了。 但是初中生打好了也不给钩子诶,更何况很难打好吧/kk NOIp-2023 RP++ 之前在缺省源里面加了 \(50\) 行 I love StayAlone & CCF,发现没什么用,于是感觉是因为 CCF 的原因,而不是 St
阅读全文
摘要:Day -2 友链 Shunpower - CSP-S2023 游记:让我们不顾一切! StayAlone - CSP 2023 游记 Day -1 前言 彩笔一支,不知道今年会不会 AFO。 希望今年 tg 1= 吧,但是好像希望渺茫/kk 难受,最后能拿什么成绩就拿什么成绩吧,懒得去想了,越想越
阅读全文
摘要:day -1 早上还上了了 \(114514\) 小时的文化课,下午开始上信息。 上课没讲什么东西,老师给我们讲了一些考场的规则就完了。 然后,背了一些奇奇怪怪的模板 貌似一直在灌水。 2:00 老师带我们去做核酸,机房奆佬 \(逸 \color{red}{之为一}\) 顺手买了 \(114514\
阅读全文
摘要:题意 现在有两个人 A 和 B 在下古代围棋,A 执黑,B 执白。(黑棋用 x 表示,白棋用 o 表示,没子的点用 . 表示) 规则如下: 棋盘大小为 \(9 \times 9\)。 如果任意一个同色的连通块四周没有任何空着没子的点,那么,这个连通块的子都会死掉,移出棋局。 现在给你一个下过的棋局,
阅读全文
摘要:题意 有一块长度为 \(L\) 的木板,现在给定 \(N\) 块金条的长度 \(a_i\) 和价值 \(v_i\)。现要求在木板上放置若干个金条(只要放上的金条有 \(\frac{1}{2}\) 在木板上就算放置成功)的最大价值是多少。 思路 应该算是一道背包的变形题吧。 首先我们定义 \(dp_{
阅读全文
摘要:思路 这题是一道非常好的递归分治题。 首先我们需要读懂题目。题目说:\(1\) 小时内,\(1\) 红可以变成 \(3\) 红 + \(1\) 蓝,\(1\) 蓝可以变成 \(4\) 蓝,问:第 \(k\) 小时,\(A \sim B\) 行中有几个红。 然后,我们可以预处理一下第 \(k\) 个小
阅读全文
摘要:前言:首先感谢 @ Kisaragi_77 大佬为我提供的思路。 思路 这是我们今天模拟赛的一道题,拿到这道题后,一点思路都没有,在老师的指导下,想到了用 map ,但是并没有写出来。 考试后,我看了一下题解,发现 @ Kisaragi_77 大佬的思路非常清晰。 具体做法呢,就是用一个 set 来
阅读全文
摘要:思路 这是一道 DP 好题,首先要搞清楚 \(dp\) 数组的含义,以及状态转移。 我们 \(dp_{i,j}\) 的含义是:取前 \(i\) 个数,形成 \(j\) 个三元组的最小权值和。 然后我们就可以来推状态转移方程了。 首先 \(dp\) 数组的初始值要设为无穷大,因为我们要求的是最小值所以
阅读全文
摘要:思路 首先我们可以从左往右扫描一遍,然后从右往左扫描一遍,最后两条扫描出的线,最低的那条线减去 \(p_i\) 就是答案(如图)。 这张图就是我们两次扫描出的结果(红线:从左往右,绿线:从右往左)。 那为什么扫描出的是这样的图呢? 是因为我们在扫描的时候需要做出 3 个步骤: 当 \(p_i > n
阅读全文
摘要:题意 给定 \(m\) 个小区间,对于一个小区间 \(i\) 可以覆盖 \([l_i,r_i]\)。 现有一个区间 \([1,n]\),现要将这 \(m\) 个小区间放在大区间上,使它们线段覆盖大区间。 求:最少选择多少个小区间才能满足条件。 思路 考虑 DP。 定义 \(dp_i\) 表示某一个区
阅读全文
摘要:思路 如果 \(a_i\) 在某一个最长上升子序列中,那么,这个最长上升子序列一定是形如 \(\dots,a_p,a_i,a_q,\dots\) 的。 发现 \(a_p < a_i < a_q\),那么以 \(a_p\) 结尾的一串一定是一个最长上升子序列,以 \(a_q\) 开头的一定也是一个最长
阅读全文
摘要:思路 定义 \(d_{i,j}\) 表示从 \(1\) 走到 \(i\),并且满足 \(t \bmod k = j\) 的最小的符合题意的 \(t\)。 然后就可以直接跑一遍 Dijkstra 即可。 当要计算一条 \(u \to v\) 的边 \(w\) 时,如果当前时间不够无法达到 \(w\),
阅读全文
摘要:思路 大模拟,按照题意模拟即可。 首先按照 \(\Delta\) 的取值分为 \(3\) 类: \(\Delta < 0\)。 \(\Delta = 0\)。 \(\Delta > 0\)。 对于第 1 种情况,根据题意,输出 NO。 对于第 2 种情况,原方程只会有一个解为 \(\frac{-b}
阅读全文
摘要:思路 首先发现对于操作 1 显然进行一次就可以将 \(t\) 变为一个回文序列。 那么,不难发现如果进行两次操作 1,在进行一次操作 2,是与进行一次操作 1,在进行两次操作 2 等效的。 所以考虑处理出 \(tt\) 表示 \(t\) 进行操作 1 后的序列。 不妨枚举一个 \(x,y\) 分别表
阅读全文
摘要:思路 Part 1 考虑 DP。 令 \(dp_i\) 表示 \(N\) 为 \(i\) 时的答案。 则有 \(dp_i = 2 \times dp_{i - 1} + dp_{i - 3}\)。 因为,我们想一想,如果我们的最后一个放的 I 形方块,那么可以放在最前面和最后面,因此我们还需要加上
阅读全文
摘要:不知道为什么都做这么复杂。 思路 考虑二分第 \(k\) 小的数 \(x\),思考怎么 check。令小于 \(x\) 的数量为 \(num\),则如果 \(num < k\) 则返回 true,否则返回 false。 问题转化为了求 \(num\)。定义 \(dp_i\) 表示分母为 \(i\)
阅读全文
摘要:思路 标准博弈论,我们假定 \(dp_i\) 表示当前棋子在 \(i\) 的时候,先手必赢为 \(1\),先手必负为 \(-1\),无法确定为 \(0\)。 那么我们看图分析一下: 在终点为 \(5\) 的情况下:不难的出 \(dp_5 = 1,dp_4 = -1,dp_7 = -1,dp_3 =
阅读全文
摘要:思路 首先有一个比较典的转化,因为本题中,有坐标和时间两种限制,于是考虑离线下来,按照时间依次进行操作。 我们可以考虑二分答案 \(len\) 则 check 函数就是判断 \([x - len,x + len]\) 区间中是否所有 \(k\) 中店铺都出现过。 有一个比较巧妙的方法,记录每一种店铺
阅读全文
摘要:思路 首先考虑两个瓶子容量分别为 \(x,y\) 互相倒的情况。发现每一次都是将剩余的液体减少 \(x\) 或者 \(y\),因此这两个瓶子的贡献就是 \(ax + by\),其中 \(a,b\) 是常数。 根据裴蜀定理,\(\min\{ax + by\} = \gcd(x,y)\)。拓展到多个数,
阅读全文
摘要:思路 定义 \(dp_i\) 表示在 \(a_{1 \sim i}\) 中选数,在满足题意的情况下的最长长度。 那么,我们在转移 \(dp_i\) 的时候,可以枚举一个 \(j\) 表示在 \(b\) 中,当前数的上一个数在 \(a\) 中的位置。 如果有 a[i] & a[j] != 0,那么,有
阅读全文
摘要:思路 区间 DP 好题。定义 \(dp_{i,j}\) 表示将 \(s_{i \sim j}\) 折叠能获得的最短长度。 那么,依旧是枚举一个中间点 \(k\),那么,我们将 \(dp_{i,j}\) 分为了 \(dp_{i,k}\) 和 \(dp_{k + 1,j}\) 两部分。 对于这两部分,可
阅读全文
摘要:思路 定义 \(dp_{i,j}\) 表示刷前 \(i\) 块木板,花了 \(j\) 次,能够正确粉刷的数量。 那么,显然 \(dp_{i,j}\) 等于 \(dp_{i - 1,j - k}\) 加上第 \(i\) 行刷 \(k\) 次能够正确粉刷的数量。 那么,考虑用另一个 DP 维护。定义 \
阅读全文
摘要:思路 首先,\(A\) 和 \(B\) 只会移动一个,那么,我们分开来算,我们先假定 \(B\) 会动。 不妨令 \(A\) 与 \(b\) 连边的端点为 \(x,y\)。如果有线段 \(pq\) 能与 \(xy\) 相交,一定满足如下其中一条规律: \(p < x \wedge q > y\) \
阅读全文
摘要:思路 我们定义 \(dp_i\) 为选取前 \(i\) 个人所得到的最大的价值。 那么,我们能得出一个很简单的状态转移方程: \[ dp_i = \max(dp_j + a \times (\sum_{k = j + 1}^{i}x_i)^2 + b \times (\sum_{k = j + 1}
阅读全文
摘要:题意 给定一个无向图,问最少在几个点上设置出口,可以使得不管其他哪个点坍塌,其余所有点都可以与某个出口相连。 思路 对于这道题,我们有以下几个技巧: 对于每一个连通块出口数量必须大于等于 \(2\)。 因为,如果出口数量为 \(1\),那么,如果刚好在出口坍塌了,就出不去了。 分别看每一个连通块。
阅读全文
摘要:简化版题意 有一个四元组:\((x,xk,xk ^ 2,xk ^ 3)\) 满足以下条件: \(k > 1\) \(x \leq m\) \(xk \leq m\) \(xk ^ 2 \leq m\) \(xk ^ 3 \leq m\) 现在给定满足条件的四元组的个数 \(n\),求:最小的 \(m
阅读全文
摘要:思路 首先,我们考虑 \(k = 0\) 的情况: \[ 1 \times 1 + 1 \times 2 + \dots + 1 \times n + \dots + n \times 1 + n \times 2 + \dots + n \times n \]然后用乘法分配律化简一下,得: \[
阅读全文
摘要:思路 我们定义 \(dp_i\) 表示运输前 \(i\) 个工厂,且在第 \(i\) 个位置建立仓库所消耗的最小代价。 那么,我们可以得出状态转移方程: \[ dp_i = \min(dp_j + x_i \times (\sum_{k = j + 1}^{i}p_k) - \sum_{k = j
阅读全文
摘要:题意 给定一个 \(n\) 表示有 \(n\) 个字符串 \(q\),并且有一个字符串集合 \(S\)。(\(q\) 和 \(S\) 都是未知的) 你需要将 \(q\) 分为若干段,使得每一段都不是 \(S\) 中任意一个字符串的子串。 你可以通过询问至多 \(2n\) 次,形如 ? i j。 它将
阅读全文
摘要:题意 给定一个 \(n\) 个节点的树,树上的每一个节点都有一个点权,每一条边都有一条边权。 现在你可以在树上任意选定一个起点出发,经过一些节点后返回该节点。 求此过程中的最大价值。(其中,价值为点权之和减去边权之和) 思路 树形 DP,定义 \(dp_i\) 表示以 \(i\) 为起点所能得到的最
阅读全文
摘要:题意 给定一个长度为 \(n\) 的序列 \(a\),可以循环左移 \(k\) 位,得到新的序列。 求在所有循环左移得到的 \(n\) 个序列中,有多少个序列满足前 \(i\) 个元素的和为非负数。(其中 \(1 \leq i \leq n\)) 注:循环左移 \(k\) 位表示将原序列变为 \(a
阅读全文
摘要:题意 给定一个 \(n\) 个点 \(m\) 条边的无向图,表示城市的道路状态,有 \(k\) 个出口。 小偷的车位于点 \(b\),\(p\) 是警车位置,警车最高时速是 \(160\),小偷和警车同时出发。 求小偷能安全到达某个高速路口而不被警察抓到的最高速度的最小值。 被抓到表示在某条道路或者
阅读全文
摘要:题意 给定一个长度为 \(n\) 的序列 \(a\)。 求其中三元逆序对的数量。(即 \(i < j < k\) 且 \(a_i > a_j > a_k\) 的数量) 思路 考虑枚举中间值。 假设当前枚举到 \(i\),那么,当前的 \(i\) 对于答案的贡献就是 \(a_j > a_i\) 的数量
阅读全文
摘要:题意 给定一个 \(n \times m\) 的字符矩阵 \(a\)。 在矩阵中有两个集合,每个集合的边界是 X(特别的,每个集合有一个点是 A 或 B)。 这两个集合组成了一个维恩图,现在求两个集合的补集,以及并集。(也就是 . 的数量) 注意: 保证了两个集合的两个交点一定是形如下图的: 保证了
阅读全文
摘要:题意 给定一个数 \(x\),以及 \(n\) 种不同面值的钞票 \(a_i\)。(其中 \(x\) 可能是一个小数,但是 \(a_i\) 一定是整数) 你可以将 \(a_i\) 除以 \(2\),得到新的面值。 如果你能通过这种方式,能够凑出 \(x\),输出 yes,否则输出 no。 思路 首先
阅读全文
摘要:思路 首先先把原式中的 \(C(i,k)\) 化出来: \[C(i,j) \bmod j = \frac{A^i_j}{j} \bmod j = \frac{i(i - 1)\cdots(i - j + 1)}{j} \bmod j = ((j - 1)! \times \lfloor \frac{
阅读全文
摘要:思路 首先考虑只有一个询问,区间为 \([1,n]\) 的做法。 定义 \(dp_i\) 表示前 \(i\) 个数中,以 \(a_i\) 结尾的方案数。容易得到状态转移方程: \[dp_i = 1 + \sum_{j < i \wedge a_j \mid a_i}{dp_j} \]最后的答案就是
阅读全文
摘要:思路 因为石头的数量太多的不好维护,于是我们转化参照物,直接看作人在动。 那么,人向下走相当于向下走两步,向上走相当于不走,向右走相当于向右下走。 然后直接暴力 BFS 一下,算出走到最后一列的时间,然后将终点按照时间找到转化参照物后的位置,取最小值即可。 Code #include <bits/s
阅读全文
摘要:非常(断句)好暴力。。。 题意 有一个 \(7 \times 7\) 个网格,每一个格子上都有两种颜色,一种是 B,一种是 W。 现在你可以让一个格子上的颜色经行反转(即 B 变为 W 或 W 变为 B),使得网格上没有一个 X 形的图形的颜色都是 B。 思路 首先通过瞪眼法可以发现答案最多为 \(
阅读全文
摘要:思路 首先有一个显然结论:如果我们将所有叶子节点全部遍历过了,那么整棵树都将被遍历。 于是我们只需要考虑叶子节点之间的关系。再其次,我们发现同一棵子树内的叶子节点一定是被连续遍历的。 考虑将 \(k\) 赋值为 \(k + 1\),那么最终我们是需要直接返回根节点的。 显然,当我们访问完一棵子树后,
阅读全文
摘要:思路 首先,你显然可以用 \(3n\) 次操作求出 \(a_1\) 和 \(x\)。同时整个序列可以按照值分为小于 \(a_1\) 和大于 \(a_1\) 两部分。 考虑分别处理这两个部分。你希望还可以通过分治的方法,将一个部分再分为一个部分。 但是,由于数据的不随机性,我们不能单纯的选取一个部分的
阅读全文
摘要:拜谢 ssxvngn。 思路 对于 \(\gcd(a_i,a_j)\) 的贡献次数为:\(\sum_{k = j + 1}^{n}[a_k \geq \max(a_i,a_j)]\)。 因为原式本质是取序列中任意三个元素 \(a,b,c\) 做 \(f\) 函数,因此与数组是否有序无关,考虑先排序。
阅读全文
摘要:思路 比较典的一个题。 把一棵树的 DFS 序剖下来过后再同一棵子树内的节点编号是连续的。 那么,我们查询 \((l,r,x)\) 时,问题就可以转化为在 \(p_{l \sim r}\) 中是否出现过 \(lid_x \sim rid_x\) 中的数,其中 \(lid_i\) 表示 \(i\) 所
阅读全文
摘要:思路 比较诈骗的一个题。 首先如果我们先让这棵树形成一条链,那么,这棵树中有效的路径只有从 \(1\) 到 \(n\) 的路径,且长度为 \(n - 1\)。 发现如果每次将 \(n\) 号点移动,非常方便,如果要构造长度为 \(x\),只需将 \(n\) 连向与 \(1\) 距离为 \(x - 1
阅读全文
摘要:思路 暴力化简公式题。 假定 \(b_{i}^{b_j} = b_{j}^{b_{i}}\) 成立,那么有: \[ 2^{a_i \times 2^{a_j}} = 2^{a_j \times 2^{a_i}}\\ a_i \times 2^{a_j} = a_j \times 2^{a_i}\\
阅读全文
摘要:思路 令 \(s_{l,r}\) 表示 \(\sum_{i = l}^{r}{a_i}\),那么考虑如下的情况: \(a_l = 2\),则有 \(s_{l + 1,r} = s_{l,r} - 2\)。 \(a_r = 2\),则有 \(s_{l,r - 1} = s_{l,r} - 2\)。 \
阅读全文
摘要:思路 首先可以转化一下题意,发现对于一个好的数对 \((i,j)\) 成立,一定满足无法在 \(a\) 中找到一个 \(a_k\) 为 \(\gcd(i,j)\) 的因子。 不妨设 \(dp_i\) 表示满足 \(\gcd(a_p,a_q) = i\) 的数对数量,\(num_i\) 表示 \(i\
阅读全文
摘要:思路 假设最后最大值的位置为 \(x\),最小值的位置为 \(y\)。 那么将所有满足 \(l_i \leq y \leq r_i\) 的线段选出来一定不优。 因为如果 \(x < l_i \vee x > r_i\) 会使答案减 \(1\);如果 \(l_i \leq x \leq r_i\) 会
阅读全文
摘要:思路 首先对于一个二进制数,如果它能被 \(2^i\) 整除,一定满足在此数中所有的 \(1\) 都在 \(i\) 或 \(i\) 的左边。 那么对于所有在 \(i\) 右边的 \(1\),都应该到 \(i\) 的左边。考虑用 vector 维护所有在 \(i\) 左边的 \(0\) 的位置。 显然
阅读全文
摘要:思路 发现如果一个字符串中有长度大于等于 \(2\) 回文子串,必定有长度为 \(2\) 的回文子串或长度为 \(3\) 的回文子串,并且形如:aa 和 aba。 所以考虑用线段树这两种情况。维护一段区间的最左、次左、最右、次右的元素,同时用两个标记变量 \(f_1,f_2\) 分别表示这个区间中是
阅读全文
摘要:CF 是没题考了吧,每场都出二进制拆位。 思路 首先我们可以二分 \(r\),因为 \(r\) 越大,按位与一定只会小于等于 \(r\) 小的情况。 那么,我们可以用 \(num_{i,j}\) 记录 \(a_j\) 第 \(i\) 位的二进制情况。 如果我们对 \(num_{i,j}\) 做一个前
阅读全文
摘要:思路 观察到 \(a_i,b_i \leq n\),又要求 \(a_i \times a_j = b_i + b_j\) 的数量,那么显然有 \(a_i \times a_j = b_i + b_j \leq 2n\)。 并且显然有 \(a_i\) 和 \(a_j\) 其中一个一定小于 \(\sqr
阅读全文
摘要:思路 因为 \(k \leq 3\) 考虑分类讨论。 \(k = 1\):显然答案是 \(1\),因为只有有人的那个点是好点。 \(k = 2\):根据绝对值的几何意义,发现在选定的两个点之间的所有节点都是好点,那么问题转化为了求树上所有路径的节点数量和。众所周知,一条路径上的节点数量等于边的数量加
阅读全文
摘要:思路 首先,我们需要确定每一种方案的第一个人,那么,可以分为三种情况(其中 \(a\) 为 \(x_i = -1\) 的数量,\(b\) 为 \(x_i = -2\) 的数量,\(len\) 为原序列 \(x\) 中权值大于 \(0\) 的序列排序并离散化的数量): 选择 \(x_i = -1\)
阅读全文
摘要:思路 发现对于无解的情况,当且仅当同一种字符出现次数大于 \(\frac{n}{2}\) 或者 \(n\) 为奇数。 然后统计每一种有字符的冲突对数,记 \(vis_i\) 表示字符 \(i\) 的冲突对数,并记 \(num = \max \{vis_i\}\),\(cnt = \sum vis_i
阅读全文
摘要:思路 首先发现对于每一次切割,长和宽只会变化一次。 所以,答案最多只会有两种情况(其中 \(S\) 为矩形的面积): \((\max\{a_i\},\frac{S}{\max\{a_i\}})\),其中需要满足 \(S \bmod \max\{a_i\} = 0\)。 \((\frac{S}{\ma
阅读全文
摘要:因为我是彩笔,所以我不会组合数,只会暴力。 思路 由 Easy Version 得到的状态转移方程: \[ dp_{i,j} = \left\{\begin{matrix} \sum_{p = 1}^{p < i}{dp_{p,j - 1}} & (j \bmod k = 1)\\ \sum_{p
阅读全文
摘要:思路 观察一下,发现对于一个拥有 \(n\) 个节点的 \(k\) -flowers,\(k\) 一定为 \(\sqrt n\)。 因为考虑只观察图中标红区域,对于一个 \(k\) -flowers,一定会有 \(k\) 个,并且它们的大小均为 \(k\),而总节点数为 \(n\),因此 \(k =
阅读全文
摘要:思路 假设原题目中的 \(n\) 在本文中为 \(num\),则原长方形的长 \(m = f_{num + 1}\) 和宽 \(n = f_{num}\)。 显然对于最初始的长方形,显然是要将一个 \(f_{num} \times f_{num}\) 的长方形丢进去的,并且要么放最左边,要么放在最右
阅读全文
摘要:题意 给定一个有 \(n\) 张牌的牌堆,其中有两种牌: 英雄牌:权值为 \(0\)。 奖励牌:权值不为 \(0\)。 你要从牌堆顺序取牌(从左至右)。 当你取到奖励牌时,你有两种选择:放入新的牌堆的顶部;弃置这张牌。 当你取到英雄牌时,从新的牌堆顶取出一张牌,将其权值加入答案,并弃置。 求:答案的
阅读全文
摘要:题意 给定一个字符串 \(S\),你可以进行 \(k\) 次操作,每次操作你可以选定一个 \(i\),并将 \(S_i\) 的大小写转换。 求:操作后,最多有几组配对的字符。(配对的定义是:对于一个字符,如果有大写,有小写被称之为一组。例如:A 和 a 为一组。) 思路 你在读入的时候,你预处理一个
阅读全文
摘要:题意 给定一个长度为 \(n\) 序列 \(a\),现有 \(q\) 次操作,对于每一次操作有: 1 l r:表示将 \(a_i(l \leq i \leq r)\) 改为 \(a_i\) 的数位之和。 2 x:输出 \(a_x\)。 思路 可以用一个类似于线段树懒标记的思想,如果不用输出就不修改。
阅读全文
摘要:题意 给定一个长度为 \(n\) 的序列 \(a\),你可以选定一个数 \(i(1 \leq i < n)\),使得 \(a_i = -a_i\),\(a_{i + 1} = -a_{i + 1}\)。 问:进行若干次操作后,算出 \(\max(\sum_{i = 1}^{n}a_i)\)。 思路
阅读全文
摘要:题意 定义函数 \(\operatorname{f}(x)\) 表示字符串 \(x\) 中不同字符的数量。 现给定一个字符串 \(S\),将它分割为两个字符串 \(a,b\)。求出:\(\max(\operatorname{f}(a) + \operatorname{f}(b))\)。 思路 我们可
阅读全文
摘要:思路 正难则反,假设每一个棋子都要走过每一个点,所需的步数显然是 \(4(n - 1)\)。然后考虑对于每一个棋子那些点是必走的。 如果 \(x\) 子树内有这个棋子需要到达的点,则 \(x\) 必走。 对于另一个棋子在 \(x\) 子树内必走过的深度最深的点的深度记作 \(md\),如果 \(md
阅读全文
摘要:思路 首先记所有 \(1\) 的数量为 \(num\),那么显然有当 \(n \bmod num \neq 0\) 时无解。那么考虑有解的时候该怎么办。 显然对于每一个 \(a_i\) 序列中,最终 \(1\) 的数量为 \(\frac{num}{n}\),记作 \(t\);并记 \(cnt_i\)
阅读全文
摘要:UPD 23/10/3 更新的对思路的描述,以及代码。 思路 对于每一个 \(a_i = 0\),如果我们将它变为 \(x\),都可以直接将 \(i \sim n\) 位置上的前缀和加 \(x\)。 设 \(a_j\) 是 \(a_i\) 后第一个 \(0\),那么,在 \(j\) 时同样有上述规律
阅读全文
摘要:思路 首先我们需要看到题目一个特殊的地方:这个序列中只存在 \(0\) 和 \(1\)。 那么,我们不难发现最终的答案一定是形如下面的序列:\(0,\dots,0,1,\dots,1\)。 知道了这些,就很好想了。我们从后往前枚举,如果当前一位为 \(0\) 了,就从 \(last \sim i\)
阅读全文
摘要:思路 做这道题之前,首先要知道一个性质:\(a \operatorname{or} b \geq a\)。那么,我们就能得出一个结论:经过一定顺序的排列,最多经过 \(\lceil \log_2^{a_{\max}} \rceil\) 个数就能让前缀或的值达到最大值。 我们不妨令有一个位置 \(i\
阅读全文
摘要:2022/11/23:修改了一下代码。 题意 有 \(T\) 组数据,每次给出一个 \(n,q\),表示台阶的数量和询问的次数。 然后再给出一个 \(a_i\) 为台阶高度的差分数组。 每次询问给出一个 \(k\),表示每次能走 \(k\) 个单位的高度。 问:最高能到达的高度。 思路 考虑暴力,我
阅读全文
摘要:思路 我们可以观察样例,不难发现:对于任意一段长度为 \(2^k\) 的区间中,如果最大值减最小值加 \(1\) 等于此区间的长度,那么一定有解。 因为,我们的目标是使整个序列升序排列。因此,我们在一个区间内的最大值减最小值加 \(1\) 与区间长度是相等的。 所以,我们可以用上述结论为判断无解的标
阅读全文
摘要:思路 简单构造题,我们可以分为三种情况进行构造。 \(n = 3\) 时,一定无解,输出 -1。(你可以试试) \(n \bmod 2 = 1 \wedge n \neq 3\) 时,我们直接先输出 \(n,n - 1\),然后顺序输出即可。 证明:令 \(a\) 为最后构造出的序列。那么,\(a_
阅读全文
摘要:思路 首先证明一下当序列扩大时答案一定不劣。考虑 \(f(l,r)\) 到 \(f(l,r + 1)\) 的变化。 \[\begin{aligned} f(l,r) - f(l,r + 1) &= s_{l,r} - xs_{l,r} - s_{l,r + 1} + xs_{l,r + 1}\\ &
阅读全文
摘要:思路 首先转化原式为: \[(a_i + a_j) \times (a_i + a_j + 1) \equiv z \pmod 3 \]考虑对 \(a_i \bmod 3,a_j \bmod 3\) 进行分讨: \(a_i/a_j\) \(0\) \(1\) \(2\) \(0\) \(0\) \(
阅读全文
摘要:思路 经典贪心,二进制拆分后,从高位往低位枚举。 如果答案的第 \(i\) 位为 \(1\),说明 \(\forall p \in [1,n]\),\(c_p\) 的第 \(i\) 位都是 \(1\)。进而由异或的性质得到,\(\forall p \in [1,n]\),\(a_p\) 的第 \(i
阅读全文
摘要:思路 首先可以将题目的操作转化为: 将一个数 \(a_i\) 异或一个常数 \(k\)。 将连续两个数 \(a_i,a_{i + 1}\) 同时异或一个常数 \(k\)。 那么,你发现最坏情况下,操作次数是 \(n\)。那么考虑如何将多余步骤给减去。 发现,如果一个区间 \([l,r]\),\(\o
阅读全文
摘要:思路 Part 1 这种题目应该能一眼看出是 DP。 我们令 \(dp_{i,j}\) 表示走到 \(j\) 这个位置,最后一步花了 \(i\) 的倍数。 那么,我们的方程就很好想了:\(dp_{i,j} = \sum_{k = 1}^{j - k \times i \geq 0}dp_{i - 1
阅读全文
摘要:思路 由于题目中说这是一棵无根树,不太方便思考,于是,我们可以假装把这棵树看做有根树。 首先我们令 \(d_1,d_2,d_3\) 分别表示从根节点到节点 \(1,2,3\) 的长度(不算相交部分)。 那么我们可以得到下式: \[ \left\{\begin{matrix} d_{12} = d_1
阅读全文
摘要:思路 这是一道极好的思维题,主要考察了:组合数学和正难则反的方法。 这题可以发现如果用直接法将十分的繁琐,于是乎,我们可以用正难则反的方法,即:总的减去不满足的。 这道题总的很好求,为:\(C_{r - l + 1}^{3}\)。 不满足的情况,我们就可以将题目转化为:\(\operatorname
阅读全文
摘要:思路 因为我们枚举的直径是具备单调性的,所以可以使用二分答案。 我们可以想一个事情,如果有两个点 \(u\) 和 \(v\),它们两点之间的最短路径要么是直接从 \(u \to v\);要么是经过一个中转点 \(t\),即:\(u \to t \to v\)。 然后,我们可以发现一个显然的规律,就是
阅读全文
摘要:题意 给定 \(n\) 个长度为 \(m\) 的数组,对于每一个数组选择下面任意一种操作进行若干次(操作二只能被一个数组选出)。 \(c_{t,i} - 1,c_{t,i - 1} + 1,c_{t,j} - 1,c_{t,j - 1} + 1\)。 \(c_{t,i} - 1,c_{t,i - 1
阅读全文
摘要:思路 发现 \(2^k\) 大的数,最终的答案一定由前 \(k + 1\) 小的元素组成。 考虑数学归纳法,显然当 \(k = 1\) 成立。假令 \(k'\) 时成立,证明 \(k = k' + 1\) 时成立即可: 若第 \(k\) 位有两个及以上的 \(0\),显然最终答案的第 \(k\) 位
阅读全文
摘要:思路 因为此题目中对于数的更新只能为 \(1\),所以,如果我们找到了 \([1,l - 1]\) 与 \([r + 1,n]\) 中能获得的两个极值即可。 我们为 \(S\) 赋予权值,用一个数组 \(a\) 储存: 如果 \(S_i\) 为 +,则其权值为 \(1\)。 否则其权值为 \(-1\
阅读全文
摘要:思路 本题为 P3146 变式,也算是一道很经典的区间 DP 题了。 因为 \(n \leq 500\),考虑区间 DP。定义 \(dp_{i,j}\) 表示操作 \([i,j]\) 区间剩余长度的最小值。 那么,我们可以枚举一个中间值 \(k\),可以显然地得到一个状态转移方程(即不能合二为一的情
阅读全文
摘要:CCF 出的原题观摩一下。 思路 首先可以用一个 Trie 来维护。 在这里对本文中的一些变量做一下说明。 \(p\) 表示当前维护的 Trie 中,指向的元素编号。 \(t_i\) 表示在 Trie 中编号为 \(i\) 的元素在原序列中的值。 \(f_i\) 表示在 Trie 中编号为 \(i\
阅读全文
摘要:思路 这是一道简单的 DP 题,DP 题的核心就是状态转移。 先来说一说 \(dp\) 数组的含义。 \(dp_{i,j}\) 表示从 \(i\) 这个点用 \(2 ^ j\) 条线段能走到的最远的点。 我们再来考虑一下边界情况。 因为我们只用 \(2 ^ 0\) 条线段,那么:\(dp_{i,0}
阅读全文
摘要:思路 发现,如果相邻元素的奇偶性相同,那么一定能通过在较低的位置竖着放若干个如果在 \(i\) 的位置竖着放一块砖头,使得这两列的高度相同。 那么,我们想到直接考虑 \(h_i\) 的奇偶性,即将 \(h_i \leftarrow h_i \bmod 2\)。 如果 \(h_i = h_{i + 1
阅读全文
摘要:思路 考虑用线段树维护区间信息: 价格在 \([l,r]\) 之间的 CPU 的数量。 购买所有价格在 \([l,r]\) 之间 CPU 所需的钱。 容易将区间修改转化为差分,从而实现单点修改。于是可以使用 \(n\) 个 vector 存储第 \(i\) 天所需进行的修改。 查询第 \(i\) 天
阅读全文
摘要:思路 考虑对于每一个 \(a\) 上数位进行分析。令 \(a_i\) 表示 \(a\) 在二进制表示中从左往右数的第 \(i\) 位上的数字,\(b_i\) 同理。 分类讨论一下 \(a_i\) 的取值对于答案的贡献: 如果 \(a_i = 0\),对于这一位无论如何都不会拥有贡献。 如果 \(a_
阅读全文
摘要:题意 给定一个长度为 \(n\) 的序列 \(\{a_1,a_2,\dots,a_n\}\)。现在要在 \(a\) 选出非空子序列 \(\{b_1,b_2,\dots,b_m\}\),使得所有的 \(i \in [1,m]\),都有 \(b_i \bmod i = 0\)。 求能够选取 \(b\)
阅读全文
摘要:思路 首先发现选出的数最多 \(3\) 个,考虑反证法。假设选出了四个数 \(a,b,c,d\),并令: \[|a - b| = 2^{x_1},|b - c| = 2^{x_2},|c - d| = 2^{x_3} \]又因为,\(|a - c|,|b - d|\) 也都是 \(2\) 的次幂,那
阅读全文
摘要:思路 毒瘤数位 DP 题。 首先,你可以用一个 vector 储存每一个数字出现的次数,然后用 map 记忆化。 然后可以得到如下 TLE #8 的代码。 因为 map 自带一只 \(\log\) 所以,考虑将 map 优化掉。但是,现在每一种数字可能会出现很多次,所以要用 vector 维护出现次
阅读全文
摘要:CSP-2022 S2 T1 弱化版。 思路 首先因为边权均为 \(1\),所以我们可以在 \(\Theta(n^2)\) 的复杂度用 BFS 求解出任意两点 \(i,j\) 的最短距离 \(d_{i,j}\)(如果 \(i\) 不能到达 \(j\),则令 \(d_{i,j} = -1\))。 有一
阅读全文
摘要:思路 首先发现 \(\sum_{i = 1}^{n}i^k\) 是一个 \(k + 1\) 次多项式,那么我们需要求出 \(k + 2\) 个点才能得到唯一的一个 \(f(t) = \sum_{i = 1}^{t}{i^k}\)。 不难通过拉格朗日插值法,将 \(x = 1 \sim (k + 2)
阅读全文
摘要:思路 首先考虑答案下界,因为 \((n - i)\) 和 \(|d_i + i - n|\) 均大于等于 \(0\),所以它们相乘一定大于等于 \(0\)。于是考虑能不能构造出结果为 \(0\)。 显然当 \(i = n\) 时,无论 \(d_i\) 的值是什么,式子的结果为 \(0\)。因此只需要
阅读全文
摘要:思路 发现 \(x\) 对题目的限制较大,因此考虑先将 \(x\) 排序并离散化后再来考虑。 不难用线段树维护 \(\max_{i = l}^{r}\{x_i + len_i\}\),这样我们就可以利用类似线段树上二分的技巧得出是哪一只青蛙吃掉的蚊子。 但是有可能有一只蚊子无法吃掉,我们先把它丢进一
阅读全文
摘要:思路 首先,可以转化题意,找到一个极长的区间 \([l,r]\) 使得(其中 \(mx_i\) 表示 \([l,r]\) 区间中属性 \(i\) 的最大值): \[ \sum_{i = 1}^{m}mx_i \leq k \]显然对于这个东西当 \(l,r\) 发生移动时,是极其好维护的,所以想到双
阅读全文
摘要:思路 Part 1 简单版 我们先想一想,如果每一种花有无限个,有多少种选法。 我们先假设第 \(i\) 种花选 \(x_i\) 支,那么,我们可以得出以下式子: \[ \sum_{i = 1}^{i = n}x_i = m \]然后,我们根据隔板法,得出答案:\(C_{n + m + 1}^{n
阅读全文
摘要:思路 首先考虑非常暴力的方法,令 \(s_i\) 表示这个数字的第 \(i\) 位上的数。则对于一个 \(s_i = 0/5\),则考虑将其留下成为最后一位元素:\(i\) 之后的所有元素都必须删,并且在 \(i\) 之前的元素可删可不删,因此贡献是 \(2^{i - 1}\)。得到如下表达式: \
阅读全文
摘要:思路 首先,对于每一只小猫刚好玩完就被饲养员接走的出发时间必定为 \(t_i - sd_i\)。 那么,我们令 \(a_i = t_i - sd_i\)表示第 \(i\) 只小猫的最早出发时间。 因此,对于第 \(k\) 时刻出发的饲养员能接到的小猫当且仅当满足 \(a_i \leq k\)。 然后
阅读全文
摘要:思路 定义 \(dp_{i,j}\) 表示区间 \([i,j]\) 中回文串的数量。那么,不难得出状态转移方程 \(dp_{i,j} = dp_{i - 1} + f_{i,j}\)。(其中 \(f_{i,j}\) 表示左端点大于等于 \(i\),右端点为 \(j\) 的回文串数量) 由此,现在问题
阅读全文
摘要:思路 首先我们将两种操作分开讨论: Part 1 加入操作 那么,我们可以用一个数组 \(vis_i = 0/1\) 表示 \(i\) 是 关闭/开启 状态,\(p_i\) 表示因数有 \(i\) 的数。 如果 $vis_x =1 $,说明此机器在之前已经启动过了,输出 Success。 然后,对
阅读全文
摘要:思路 首先考虑较为普通的 DP。 定义 \(dp_{i,j}\) 表示在前 \(i\) 个位置中,最后一个 1 在 \(j\) 的最大分数,显然有: \[ dp_{i,j} = \left\{\begin{matrix} \max_{k = 1}^{i - 1}\{dp_{i - 1,k}\} +
阅读全文
摘要:思路 不难发现:对于每一个 \(i(1 \leq i \leq k)\),如果能在 \((k + 1) \sim n\) 中找到任何一个 \(j\),满足 \(a_j > a_i\) 就算满足条件。 进一步思考,为了使操作数最小,对于每一个 \(1(1 \leq i \leq k)\),都找一个在
阅读全文
摘要:思路 因为题目与二进制有关,考虑往二进制的方向思考。定义 \(dp_{i,j}\) 表示在所有的 \(n\) 个数中,当前在决策对于每一个数在二进制表示下的第 \(i\) 位是 \(0\) 还是 \(1\),且和为 \(j\) 的方案数。 因为异或需要满足对于所有 \(a_i\) 表示为二进制后每一
阅读全文
摘要:思路 我们容易可以得到一个朴素的做法,首先对 \(a\) 数组排序,然后枚举最大值和最小值 \(a_i,a_j\),那么对于中间的元素都有选与不选两种情况,得到答案: \[ \sum_{i = 1}^{n}(a_i \times a_i + (\sum_{j = i + 1}^{n}a_i \tim
阅读全文
摘要:题意 给定一个字符串 \(S\),你可以选择一个 \(i(1 \leq i \leq |S|)\),如果 \(s_i = s_{i + 1} \neq s_{i + 2}\),就将 \(s_{i + 2}\) 设为 \(s_i\)。 问:最多能操作几次。 思路 我们可以用一个后缀和 \(s_{i,j
阅读全文
摘要:思路 首先,对于每一次操作,我们可以先找到最大值,然后对其操作。 这样,我们可以得到单次操作时间复杂度 \(\Theta(n)\) 的代码,因为 \(n\) 很小,所以这道题时间复杂度的瓶颈在于操作的数量。 那么,我们想到每一次找到最大值时,直接将其减到小于 \(n\)。 但是这样可能有一种问题,就
阅读全文
摘要:思路 首先不难发现一个规律,当 \(sum\) 为奇数时不可能有解。 定义 \(dp_{i,j,k,0/1}\) 表示 A 在前 \(i\) 个数中选出和为 \(j\) 的 \(k\) 个数,且第 \(i\) 个 不选/选 的方案数。 那么,我们只需要对于第 \(i\) 个数的状态分类讨论就能得到状
阅读全文
摘要:思路 有加边操作,一眼 LCT。问题在于处理询问操作。 首先,判断联通。如果 \(x,y\) 不在同一个联通块内,则一定没有答案。 其次,求出 \(x,y\) 之间节点的数量 \(num\)(包括 \(x,y\))。如果 \(num = 3\) 说明 \(x,y\) 之间有一个共同的节点;如果 \(
阅读全文
摘要:思路 首先假设有两个串 \(a,b\),如果 \(b\) 是 \(a\) 的子串,且 \(a \neq b\) 则不需要考虑 \(b\);如果 \(a = b\),则如需要保留一个 \(a\)。 做完上述操作后,显然最终的答案是由这些串按照一定顺序拼接起来,再删掉重叠部分。 例如:abbcc 与 c
阅读全文
摘要:思路 发现自己与庄家的操作是完全独立的,所以考虑分别计算它们。 首先考虑自己的情况,定义 \(dp_i\) 表示掷出骰子的和为 \(i\) 获胜的概率,并记 \(f(i)\) 表示 \(x = i\) 时就不掷的获胜概率。 对于每一步我们要么掷骰子(并且掷出的值等概率的在 \(1 \sim D\)
阅读全文
摘要:思路 带权并查集模板。 如果对于一个三元组 \((a,b,c)\) 如果它能够添加到 \(S\) 中一定满足如下条件中的一条: \(X_a,X_b\) 满足其中有一个是「不确定」的。在这里 \(X_i\)「不确定」指 \(X_i\) 没有与其它的任意 \(X_j\) 有关系 。 \(X_a,X_b\
阅读全文
摘要:思路 看到消除区间,并且 \(|S| \leq 300\) 果断选择区间 DP。 定义 \(dp_{i,j}\) 表示操作 \(i \sim j\) 区间能剩下最少数量。 首先枚举 \(i,j\),然后枚举一个分解点 \(k\),那么显然有 \(dp_{i,j} = \min_{i \leq k <
阅读全文
摘要:思路 定义 \(dp_{i,j,k} = 0/1\) 表示用 \(i\) 个 1 号传感器,\(j\) 个 2 号传感器 不能/能 监控到前 \(i\) 段。 显然有: \[ dp_{i,j,k} = \max_{0 \leq p \leq j \wedge 0 \leq q \leq k \wed
阅读全文
摘要:思路 首先我们发现,刚开始人需要走到箱子周围的四个位置。其次我们发现人需要站的位置最多有两个。 例如,\(c\) 在 \(b\) 左方,人就需要在箱子右方。 然后我们就可以算出 \(a\) 点走到这两个点的距离,需要注意的是,这两点所产生的贡献不一定是两点间的曼哈顿距离,因为如果 \(b\) 挡在了
阅读全文
摘要:思路 可撤销背包板子。 首先问题是用当前所拥有的数的集合凑出 \(x\) 的方案数。 这个问题明显可以背包解决,即 \(dp_j \leftarrow dp_j + dp_{j - a_i}\)。 但是,此问题中物品有可能会被删除,即变为了一个动态的问题,如果直接暴力计算时间复杂度为 \(\Thet
阅读全文
摘要:思路 首先先考虑弱化版怎么做,即如何求本质不同子序列数量。 不妨定义 \(dp_{i}\) 在前 \(i\) 位中选,且以 \(i\) 结尾的本质不同子序列数量。 显然,有(其中 \(nxt_{i,c}\) 表示在 \(i\) 之后,第一次出现 \(c\) 的位置): \[ dp_{i} \righ
阅读全文
摘要:模拟赛怒码 7KB 错解,赛后 10min AC。 思路 首先观察 \(l,r\) 不同的关系对于结果的构成有什么影响,记 \(gf = LCA(l,r)\)。 \(l = r\)。很显然,答案就是以 \(l\) 为根的节点的深度和。 \(gf \neq l \wedge gf \neq r\)。在
阅读全文
摘要:思路 定义 \(dp_i\) 表示前 \(i\) 位所能得到的答案。 那么,不难得出状态转移方程,其中 \(X_{i,j}\) 表示 \(X_{i,j}\) 转为的数字: \[ dp_i = \sum_{j = 1}^{i - 1}(dp_j \times X_{j + 1 \sim i}) + X
阅读全文
摘要:思路 定义 \(dp_{i,j}\) 表示在标号前 \(i\) 个商品中,将所有 \(x_k \leq i\) 的商品购买,且一共买了 \(j\) 件商品的花费最小值。 那么,对于 \(i\) 号商品就会有 选/不选,两种状态: 如果选,那么有 \(dp_{i,j} = \min(dp_{i - 1
阅读全文
摘要:思路 首先你可以发现,如果一个区间 \([l,r]\) 是一个好的序列,那么一定 \(i\) 能从 \(l\) 开始 一直到 \(r - k + 1\),将 \(a_{i \sim (i + k - 1)}\) 减掉 \(a_i\)。 那么,当 \(l = 1\) 时,对于每一个 \(i\),我们可
阅读全文
摘要:思路 定义 \(dp_{i,j,0/1}\) 表示在以 \(i\) 为根的子树中(包括 \(i\))选出 \(j\) 个连通块,且 \(i\) 不选/选 的方案数。 假设我们在 DFS 过程中,当前枚举到以 \(u\) 为根节点的情况,那么显然有 \(dp_{u,0,0} = dp_{u,1,1}
阅读全文
摘要:思路 定义 \(dp_{i,j}\) 表示前若干层一共有 \(i\) 个点,且在这些层中最外层的点数为 \(j\) 的方案数。 那么,我们先求出最外层的方案数,在 \(n - (i - j) - 1\)(即减去前若干层中除最外层点的数量再减去 \(n\) 号点)中选出 \(j\) 个作为最外层的点。
阅读全文
摘要:思路 对于操作 1,我们可以看做将 \(x\) 号集合与 \(y\) 号集合合并,并将原本的 \(y\) 号集合重新开一个并查集维护。 对于操作 2,我们可以开一个数组维护每一个球所在哪一个并查集中。 对于操作 3,在操作 1 中维护每一个并查集对于了哪一个箱子即可。 因为 \(n + q \leq
阅读全文
摘要:思路 因为此题撒网的时间和位置都是未知的,所以必须枚举出一个。 又因为时间有可能是一个小数,不好枚举,因此考虑枚举位置。 首先,有一个显然的贪心策略,每一次撒网的位置的左端点一定是一条鱼。 那么,我们不妨枚举撒网位置的左端点为第 \(i\) 条鱼。 然后可以算出其余的鱼能被一起捕到的时间段。 那么,
阅读全文
摘要:思路 实际上对于一个字符串 \(S\) 进行一个 \(f(S,x)\) 的操作本质上就是在 \(S + S\) 中截取一段长度为 \(n\) 的子串。 于是你不难想到把 \(A,B\) 拼起来,形成一个字符串 \(S = A + A + B + B\),然后比较后缀。你发现这是对的,因为两个串的字典
阅读全文
摘要:思路 首先,可以将所有岛屿的连通关系可以分为四种情况: 只用桥。 只用桥和机场。 只用桥和港口。 桥、机场、港口都用。 那么,只用桥的情况十分好处理,直接跑一边 Kruskal 即可。 但是对于机场和港口都是点权,不能直接跑 Kruskal,所以考虑转化为边权。 不难想到直接用一个超级原点,连接这些
阅读全文
摘要:大家好,我是毒瘤,喜欢用玄学算法过题。 发现题解区没有这个做法,于是来发一篇。 思路 不难发现如果一个点对 \((u,v)\) 的距离为 \(d\),那么在这棵树以 \(u\) 为根时,\(v\) 的深度为 \(d\)。于是考虑换根 DP。 首先思考如何计算答案。显然我们可以将查询离线下来,然后当换
阅读全文
摘要:思路 一道很经典的题,运用了一种叫「时光倒流」的技巧。 「时光倒流」本质上就是将所有删边(或删点)的操作,通过倒序循环求值的方式转化为加边(或加点)。 「时光倒流」具体实现通常伴随着并查集出现,维护一个连通块的某种性质。 首先,我们需要将所有从始至终没有删过的边加入并查集。在这里,我们的并查集不仅仅
阅读全文
摘要:先为大家毙掉一个错解 思路 首先不难发现,如果将整棵比赛的对战图画出来,一定是一个满二叉树。 不妨将令一个节点 \(u\) 的左右儿子编号分别为 \(2u\) 和 \(2u + 1\)。 然后定义 \(dp_{u,d}\) 表示将 \(u\) 为根的子树内的选手全部比赛完,并且 \(u\) 已经赢了
阅读全文
摘要:思路 首先,不难发现最终的序列一定是形如下面的序列: \[ l,\dots,l,a_i,a_{i + 1},\dots,a_{i + j},r,\dots r \]那么,我们就可以将其分为三段,每段都单独维护。 首先,对于第一段,我们可以枚举出最后一个 \(l\) 的位置 \(x\),那么和为 \(
阅读全文
摘要:思路 首先可以看一下 P4145,在 P4145 中使用了一种叫势能线段树的 Trick。 对于势能线段树,我个人的理解是,对于一段区间(或一个点)直接暴力维护,在经过很少的次数后操作将没有意义的题就可以使用势能线段树。 在本题中,如果没有推平操作,显然我们可以直接使用势能线段树,时间复杂度可以轻松
阅读全文
摘要:思路 容易看出来是个 DP 题,但是你发现 DP 的起点是不好确定的,于是假定第一条边的起点是黑色。然后你发现设为白色的贡献与黑色是相同的,于是直接令第一条边的起点是黑色,最后答案乘以 \(2\) 即可。 然后就可以愉快的 DP 了。 首先枚举每条边白色点的数量 \(k\),定义 \(dp_{i,0
阅读全文
摘要:思路 因为 \(1 \leq n,q \leq 2 \times 10^5\),所以对于每一次查询的时间复杂度一定要达到 \(\Theta(\log n)\),甚至于 \(\Theta(1)\)。 一个最简单的想法,我们先统计出整个序列 \(a\) 的和 \(sum\),然后答案是 \(|sum -
阅读全文
摘要:思路 令 \(f_i\) 表示 \(i\) 最大的完全平方数因子。 那么,现在如果有两个数 \(i,j\),要使 \(i \times j\) 为完全平方数,一定要使 \(\frac{i}{f_i} = \frac{j}{f_j}\)。 换句话说,\(i \times j\) 为完全平方数,当且仅当
阅读全文
摘要:思路 首先,不难看出一个规律,就是对于一个序列 \(a\),如果它将操作所有以 \(x\) 为第一关键字的二元组,那么序列的 \(a_{x \sim n}\) 将循环右移一位。(注意,在这里的 \(x\) 指的是在 \(1 \sim (n - 1)\) 中的任意一个定值) 那么,我们就可以将编号分别
阅读全文
摘要:思路 对于这种题目,通常会想到用哈希维护。 由于集合相同与 \(a_{1 \sim x}\),\(b_{1 \sim y}\) 的顺序无关,所以对于我们的哈希函数 \(h(x)\) 必定需要用一种有交换律的符号。 首先想到的当然是加法,但是不太好实现,因为这些数太大了,不因会爆 unsigned l
阅读全文
摘要:思路 对于这道题,我们可以发现一个事情:我们筛质数只需要筛 \(1 \sim \log_3 n\) 的部分就行了。 因为 \(k = p \times q^3\),那么,我们考虑一种极端情况,\(p\) 为一个很小的数,那么 \(k\) 就无限接近于 \(q^3\)。 我们就先假设 \(k = q^
阅读全文
摘要:思路 反悔贪心套路题。 发现一个性质,当一个操作 1 生效意味着在这一步之前的所有操作都没用。 那么考虑倒着枚举,对于每一个操作 1 的选取状态做一个简单的分讨: 如果保留,那么这种情况下的答案就是之前的 \(sum\) 加上当前的 \(y\)。 如果不保留,继续往前走,\(k \leftarrow
阅读全文
摘要:思路 定义 \(dp_{i,j}\) 表示在前 \(i\) 位原字符串,压缩为 \(j\) 位的方案数。 不难得出状态转移方程: \[ dp_{i,j} = \sum_{k = 1}^{i}(25 \times dp_{k,j - \lfloor \log_{10}k \rfloor - 1}) \
阅读全文
摘要:思路 首先,我们得清楚如何判断三点共线。 对于每一个点,它的横纵坐标都有这么一个关系:\(n \times x + m = y\)(其中 \(n,m\) 为常数)。 那么,对于三点共线的点来说,\(n,m\) 是相同的。因此我们得出三个式子。 \[ n \times x_a + m = y_a \]
阅读全文
摘要:思路 其实很简单,我们可以将所有数值相同的值的下标存入一个 vector 里面。因为,我们既然要查找 \(X\),不妨把所有值为 \(X\) 的下标存在一起,方便查找。(可以在输入的时候完成) 我们不妨在每一个数值后面添加一个哨兵,然后二分查找第一个大于等于 \(l\) 的数和第一个大于等于 \(r
阅读全文
摘要:思路 对于包含数 \(x\) 的卡牌,两张之中必定要选择一张,由此想到 2-SAT 的思想。 我们将所有带有 \(x\) 的卡牌两两连边,每一条边连接的点都表示两点必须选择一个。 不难发现,我们这样会得出若干个环。(因为对于每一张卡牌的出边为 \(2\),一定会形成环) 在每一个环中的选择情况,不会
阅读全文
摘要:思路 题目要求的是 \(\max_{a = 1}^{n}\{\sum_{i = 1}^{a}\sum_{j = 1}^{a}{A_j}\}\),所以我们将 \(\sum_{i = 1}^{a}\sum_{j = 1}^{a}{A_j}\) 化简一下,得: \[ i \times A_1 + (i -
阅读全文
摘要:思路 首先对于这种题目多半是要先以 \(a_i\) 排序的,这样我们可以消除 \(a_i\) 的限制,只需要考虑 \(b_i\) 的限制即可。 定义 \(dp_{i,j}\) 表示在前 \(i\) 个人中选 \(j\) 个人的合法方案数。但是这样不知道前面选取人的 \(b_i\) 的大小。 因此,重
阅读全文
摘要:思路 将小于等于 \(x\) 的元素赋为 \(1\),其余的赋为 \(0\)。那么一个区间内小于等于 \(x\) 的数量就是区间中 \(1\) 的数量。 那么,将区间升序排列就是将 \(1\) 先堆在前面,将 \(0\) 堆到后面;降序排列同理。 考虑动态维护 \(x\) 的位置,记其位置为 \(t
阅读全文
摘要:思路 首先对所有的 \(c\) 从小到大排序,然后对于每一个值如果之前能凑出就不选,否则就选。 这样做显然是对的。令 \(p_1,p_2,\dots,p_{2^n-1}\) 表示将 \(c\) 排序之后,对应原来的下标;\(S\) 表示选出数的集合;\(S'\) 表示最终选出数的集合。可以证明两个问
阅读全文
摘要:思路 直接将输出的答案分为两个分考虑。 (1) 考虑二分 + DP。 设当前二分出的平均数为 \(x\),如果合法,那么有(其中 \(p\) 为选出数下标的集合): \[ \frac{a_{p_1} + a_{p_2} + \dots + a_{p_k}}{k} \geq x \]即: \[ \fr
阅读全文
摘要:思路 定义 \(dp_i\) 表示将前 \(i\) 个分为若干段的价值总和。容易得到状态转移方程: \[ dp_i = \sum_{j = 1}^{i - 1}{dp_j \times (\max_{k = j + 1}^{i}\{a_k\} - \min_{k = j + 1}^{i}\{a_k\
阅读全文
摘要:思路 一眼可以把两个可以交换的数之间建一条边,显然在一个连通块里面的元素可以两两之间交换。 由于是排列,每一个元素 \(i\) 最终的位置是 \(i\)。 考虑将元素从小到大放置,令 \(ad_i\) 表示当前 \(i\) 元素的位置。 现在我们想让 \(i\) 换到 \(i\) 位置上,并且想使用
阅读全文
摘要:思路 首先有一个显然的贪心策略,就是先用大面值的,再用小面值的。 因为 \(n \neq 60\),先考虑搜索。 对于搜索到剩余 \(x\) 元,当前用 \(A_u\) 面值的时候。可以分为两种情况: 不找零,其答案为 a = x / a[u] + dfs(u - 1,x % a[u])。 找零,其
阅读全文
摘要:思路 首先,转化一下题面,对于每一次操作,相当于在原序列的前缀和数组 \(s\) 中删除一个数。 \(dp_i\) 表示操作 \(1 \sim i\) 能得到的序列个数。 如果 \(a_i\) 在 \(1 \sim i - 1\) 中没有出现过,状态转移方程为 \(dp_i = dp_{i - 1}
阅读全文
摘要:思路 首先需要知道一个事情,对于一个数 \(x = \prod{p_i^{c_i}}\),它的约数个数是: \[\prod{(c_i + 1)} \]那么先将 \(\binom{k}{n}\) 展开: \[\frac{\prod_{i = n - k + 1}^{n}i}{k!} \]发现一个数的约
阅读全文
摘要:思路 Part 1 弱化版 看到这道题的第一眼想到了 P1012 这道题。 但是,这两道题选择的数量是有区别的。 我们可以由拼数得出一个结论性的排序规则(这里就不多做解释了): inline bool cmp(string a,string b){ return a + b < b + a; } 如
阅读全文
摘要:思路 对于每一个 7,我们都可以抽象为这样一个图形: 如果有两个 7,无论它是否有重合部分,红色部分是不需要判断的,只需要看绿色的部分。 因此,我们的问题就简化为了三角形,而不是四边形。 对于所有的 7,都有一个公共顶点:\((0,0)\) 点。 所以,我们可以引出一个叫斜率的概念来判断这些三角形是
阅读全文
摘要:题意 给定 \(N\) 个小车,每个小车的编号分别为:\(1,2,\dots,N\)。 现在有 \(Q\) 个操作,每个操作执行 \(3\) 种操作: 1 x y,将 \(x\) 和 \(y\) 相连。(\(y\) 在 \(x\) 之后) 2 x y,将 \(x\) 和 \(y\) 的连接解除。 3
阅读全文
摘要:比较符合 CCF 造数据水平的题。 思路 首先可以用两个 vector<pair<int,int>> v[N] 分别将每一行、每一列的元素的权值与编号存储下来。 那么可以对所有的 \(v_i\) 按照权值从小到大排序。那么发现对于所有的满足 v[i][p].fst < v[i][q].fst 的 \
阅读全文
摘要:思路 显然我们需要求出原树的最大匹配。 定义 \(dp_{i,0/1}\) 表示在 \(i\) 为根的子树中进行匹配,且 \(i\) 不选/选 的最大匹配。状态转移方程比较显然: \[\left\{\begin{matrix} dp_{u,0} = \sum{val_v}\\ dp_{u,1} =
阅读全文
摘要:板子题,模拟赛场切了。 思路 线段树换根板子题。 因为需要求每一个点的答案,所以定义 \(dp_i\) 表示以 \(i\) 为根的最长距离。 考虑将一个点 \(v\) 转化为根,树的形态会发生什么变化(假设 \(v\) 的父亲节点是 \(u\))。 发现在 \(v\) 子树中的节点,距离都会减少 \
阅读全文
摘要:思路 定义 \(dp_{i,j}\) 表示将前 \(i\) 个数,正好分为 \(j\) 组的方案数。 那么,我们对 \(i\) 号元素进行分类讨论: 将 \(i\) 放入原本就存在的组中,因为在同一个组中不能存在两个数 \(x,y\),使得 \(x \bmod m = y \bmod m\)。所以对
阅读全文
摘要:思路 区间 DP 好题,合并的时候十分毒瘤。 首先,定义 \(dp_{i,j}\) 表示合并 \([i,j]\) 区间不同的方案的数量。不难发现,如果区间长度为奇数(即 \(j - i + 1\) 为奇数),一定无法合并。 然后,如果 \(i,j\) 是朋友关系,有 \(dp_{i, j} = dp
阅读全文
摘要:思路 首先,不难发现,对于本题将 \(a,b\) 合成一个序列,并按照 \(a_i\) 排序的答案不会发生变化。所以,我们可以直接排序,那么,我们当前枚举到的 \(a_i\) 就是当前的 \(\max(a_i)\)。 定义 \(dp_{i,j,0/1}\) 表示在 \(1 \sim i\) 中,选择
阅读全文
摘要:思路 定义 \(vis_i\) 表示数 \(i\) 在序列中出现的次数。如果我们选出 \(k\) 个数,答案就是(其中 \(m\) 表示 \(\max(c_i)\)): \[ \sum_{i = 1}^m\frac{\binom{n}{x} - \binom{n - vis_i}{k}}{\bino
阅读全文
摘要:思路 通常来说,对于倍增问题 \(dp_{i,j}\) 表示的是以 \(i\) 为起点,走 \(2^j\) 步的答案。 但是,对此此题,如果对于点倍增,因为每一个点可能会有多条边经过,所以,不能对点进行倍增。 但如果对边进行倍增,无论怎么走 \(2^j\) 步后的位置一定相同,所以考虑对每一条边倍增
阅读全文
摘要:思路 一个简单的贪心,对于每一次操作,我们假设我们能用盒子的大小的数组处理成 \(a\)。那么,我们可以对 \(a\) 进行从小到大排序。 然后,对于我们所有的箱子,我们可以以 \(w\) 为关键字,从小到大排序。 接着,我们可以进行暴力枚举,对于 \(a_i\),我们要取的必定为 \(\max_{
阅读全文
摘要:思路 首先发现一个事情,任意一个子串都可以由 \(s\) 的某一个后缀的后面删除一些字符得到。 因此假如 \(s\) 的某一个后缀的值为 \(x\),那么我们可以减去后面的我们不用的数字 \(a\),然后除以 \(10\) 的若干次幂得到,即 \(\frac{x - a}{10^n}\)。 于是得到
阅读全文
摘要:模拟赛最后 \(15\) 分钟想到的做法。 思路 首先有一个显然的贪心策略:我们放炸弹的地方要尽可能的使这个炸弹能影响到更多的怪上。 那么我们可以将对于一个怪 \(i\) 能够影响到它的区间表示出来 \([\max(1,l_i - d),a_i + r]\)。 然后将这些区间排个序,可以粗略画出这样
阅读全文
摘要:思路 考虑将 \(\max\) 和 \(\min\) 的贡献分开计算。 显然我们对这个序列进行一次排序不会影响最终的答案,因此我们可以先排序一下。 然后有一个很经典的 trick,就是你枚举每一个数 \(x\),将 \(x\) 令为最大值(最小值)。因为我们先前排序过一次,因此我们可以轻易的计算出比
阅读全文
摘要:思路 问题本质上就是一个在一段区间中找完整线段的数量。 我们先不考虑所有 \(l_i\) 对答案的限制,那么,我们的答案就应该是 \(1 \sim q\) 线段的数量减去 \(1 \sim (p - 1)\) 的数量,这个东西可以直接用树状数组维护。 然后,再来考虑 \(l_i\) 对答案的限制。如
阅读全文