摘要: 思路 首先,可以将所有岛屿的连通关系可以分为四种情况: 只用桥。 只用桥和机场。 只用桥和港口。 桥、机场、港口都用。 那么,只用桥的情况十分好处理,直接跑一边 Kruskal 即可。 但是对于机场和港口都是点权,不能直接跑 Kruskal,所以考虑转化为边权。 不难想到直接用一个超级原点,连接这些 阅读全文
posted @ 2024-06-22 15:19 WBIKPS 阅读(25) 评论(0) 推荐(0)
摘要: 大家好,我是毒瘤,喜欢用玄学算法过题。 发现题解区没有这个做法,于是来发一篇。 思路 不难发现如果一个点对 \((u,v)\) 的距离为 \(d\),那么在这棵树以 \(u\) 为根时,\(v\) 的深度为 \(d\)。于是考虑换根 DP。 首先思考如何计算答案。显然我们可以将查询离线下来,然后当换 阅读全文
posted @ 2024-06-22 13:58 WBIKPS 阅读(20) 评论(0) 推荐(0)
摘要: 思路 一道很经典的题,运用了一种叫「时光倒流」的技巧。 「时光倒流」本质上就是将所有删边(或删点)的操作,通过倒序循环求值的方式转化为加边(或加点)。 「时光倒流」具体实现通常伴随着并查集出现,维护一个连通块的某种性质。 首先,我们需要将所有从始至终没有删过的边加入并查集。在这里,我们的并查集不仅仅 阅读全文
posted @ 2024-06-22 11:14 WBIKPS 阅读(15) 评论(0) 推荐(0)
摘要: 先为大家毙掉一个错解 思路 首先不难发现,如果将整棵比赛的对战图画出来,一定是一个满二叉树。 不妨将令一个节点 \(u\) 的左右儿子编号分别为 \(2u\) 和 \(2u + 1\)。 然后定义 \(dp_{u,d}\) 表示将 \(u\) 为根的子树内的选手全部比赛完,并且 \(u\) 已经赢了 阅读全文
posted @ 2024-06-22 11:02 WBIKPS 阅读(31) 评论(0) 推荐(0)
摘要: 思路 首先,不难发现最终的序列一定是形如下面的序列: \[ l,\dots,l,a_i,a_{i + 1},\dots,a_{i + j},r,\dots r \]那么,我们就可以将其分为三段,每段都单独维护。 首先,对于第一段,我们可以枚举出最后一个 \(l\) 的位置 \(x\),那么和为 \( 阅读全文
posted @ 2024-06-22 11:01 WBIKPS 阅读(26) 评论(0) 推荐(0)
摘要: 思路 首先可以看一下 P4145,在 P4145 中使用了一种叫势能线段树的 Trick。 对于势能线段树,我个人的理解是,对于一段区间(或一个点)直接暴力维护,在经过很少的次数后操作将没有意义的题就可以使用势能线段树。 在本题中,如果没有推平操作,显然我们可以直接使用势能线段树,时间复杂度可以轻松 阅读全文
posted @ 2024-06-22 11:00 WBIKPS 阅读(17) 评论(0) 推荐(0)
摘要: 思路 容易看出来是个 DP 题,但是你发现 DP 的起点是不好确定的,于是假定第一条边的起点是黑色。然后你发现设为白色的贡献与黑色是相同的,于是直接令第一条边的起点是黑色,最后答案乘以 \(2\) 即可。 然后就可以愉快的 DP 了。 首先枚举每条边白色点的数量 \(k\),定义 \(dp_{i,0 阅读全文
posted @ 2024-06-22 10:58 WBIKPS 阅读(51) 评论(0) 推荐(0)
摘要: 思路 因为 \(1 \leq n,q \leq 2 \times 10^5\),所以对于每一次查询的时间复杂度一定要达到 \(\Theta(\log n)\),甚至于 \(\Theta(1)\)。 一个最简单的想法,我们先统计出整个序列 \(a\) 的和 \(sum\),然后答案是 \(|sum - 阅读全文
posted @ 2024-06-22 10:58 WBIKPS 阅读(62) 评论(0) 推荐(0)
摘要: 思路 令 \(f_i\) 表示 \(i\) 最大的完全平方数因子。 那么,现在如果有两个数 \(i,j\),要使 \(i \times j\) 为完全平方数,一定要使 \(\frac{i}{f_i} = \frac{j}{f_j}\)。 换句话说,\(i \times j\) 为完全平方数,当且仅当 阅读全文
posted @ 2024-06-22 10:58 WBIKPS 阅读(18) 评论(0) 推荐(0)
摘要: 思路 首先,不难看出一个规律,就是对于一个序列 \(a\),如果它将操作所有以 \(x\) 为第一关键字的二元组,那么序列的 \(a_{x \sim n}\) 将循环右移一位。(注意,在这里的 \(x\) 指的是在 \(1 \sim (n - 1)\) 中的任意一个定值) 那么,我们就可以将编号分别 阅读全文
posted @ 2024-06-22 10:58 WBIKPS 阅读(21) 评论(0) 推荐(0)
摘要: 思路 对于这种题目,通常会想到用哈希维护。 由于集合相同与 \(a_{1 \sim x}\),\(b_{1 \sim y}\) 的顺序无关,所以对于我们的哈希函数 \(h(x)\) 必定需要用一种有交换律的符号。 首先想到的当然是加法,但是不太好实现,因为这些数太大了,不因会爆 unsigned l 阅读全文
posted @ 2024-06-22 10:57 WBIKPS 阅读(26) 评论(0) 推荐(0)
摘要: 思路 对于这道题,我们可以发现一个事情:我们筛质数只需要筛 \(1 \sim \log_3 n\) 的部分就行了。 因为 \(k = p \times q^3\),那么,我们考虑一种极端情况,\(p\) 为一个很小的数,那么 \(k\) 就无限接近于 \(q^3\)。 我们就先假设 \(k = q^ 阅读全文
posted @ 2024-06-22 10:57 WBIKPS 阅读(22) 评论(0) 推荐(0)
摘要: 思路 反悔贪心套路题。 发现一个性质,当一个操作 1 生效意味着在这一步之前的所有操作都没用。 那么考虑倒着枚举,对于每一个操作 1 的选取状态做一个简单的分讨: 如果保留,那么这种情况下的答案就是之前的 \(sum\) 加上当前的 \(y\)。 如果不保留,继续往前走,\(k \leftarrow 阅读全文
posted @ 2024-06-22 10:57 WBIKPS 阅读(25) 评论(0) 推荐(0)
摘要: 思路 定义 \(dp_{i,j}\) 表示在前 \(i\) 位原字符串,压缩为 \(j\) 位的方案数。 不难得出状态转移方程: \[ dp_{i,j} = \sum_{k = 1}^{i}(25 \times dp_{k,j - \lfloor \log_{10}k \rfloor - 1}) \ 阅读全文
posted @ 2024-06-22 10:57 WBIKPS 阅读(34) 评论(0) 推荐(0)
摘要: 思路 首先,我们得清楚如何判断三点共线。 对于每一个点,它的横纵坐标都有这么一个关系:\(n \times x + m = y\)(其中 \(n,m\) 为常数)。 那么,对于三点共线的点来说,\(n,m\) 是相同的。因此我们得出三个式子。 \[ n \times x_a + m = y_a \] 阅读全文
posted @ 2024-06-22 10:56 WBIKPS 阅读(24) 评论(0) 推荐(0)
摘要: 思路 其实很简单,我们可以将所有数值相同的值的下标存入一个 vector 里面。因为,我们既然要查找 \(X\),不妨把所有值为 \(X\) 的下标存在一起,方便查找。(可以在输入的时候完成) 我们不妨在每一个数值后面添加一个哨兵,然后二分查找第一个大于等于 \(l\) 的数和第一个大于等于 \(r 阅读全文
posted @ 2024-06-22 10:56 WBIKPS 阅读(36) 评论(0) 推荐(0)
摘要: 思路 对于包含数 \(x\) 的卡牌,两张之中必定要选择一张,由此想到 2-SAT 的思想。 我们将所有带有 \(x\) 的卡牌两两连边,每一条边连接的点都表示两点必须选择一个。 不难发现,我们这样会得出若干个环。(因为对于每一张卡牌的出边为 \(2\),一定会形成环) 在每一个环中的选择情况,不会 阅读全文
posted @ 2024-06-22 10:56 WBIKPS 阅读(21) 评论(0) 推荐(0)
摘要: 思路 题目要求的是 \(\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 - 阅读全文
posted @ 2024-06-22 10:55 WBIKPS 阅读(19) 评论(0) 推荐(0)
摘要: 思路 首先对于这种题目多半是要先以 \(a_i\) 排序的,这样我们可以消除 \(a_i\) 的限制,只需要考虑 \(b_i\) 的限制即可。 定义 \(dp_{i,j}\) 表示在前 \(i\) 个人中选 \(j\) 个人的合法方案数。但是这样不知道前面选取人的 \(b_i\) 的大小。 因此,重 阅读全文
posted @ 2024-06-22 10:55 WBIKPS 阅读(14) 评论(0) 推荐(0)
摘要: 思路 将小于等于 \(x\) 的元素赋为 \(1\),其余的赋为 \(0\)。那么一个区间内小于等于 \(x\) 的数量就是区间中 \(1\) 的数量。 那么,将区间升序排列就是将 \(1\) 先堆在前面,将 \(0\) 堆到后面;降序排列同理。 考虑动态维护 \(x\) 的位置,记其位置为 \(t 阅读全文
posted @ 2024-06-22 10:55 WBIKPS 阅读(17) 评论(0) 推荐(0)
摘要: 思路 首先对所有的 \(c\) 从小到大排序,然后对于每一个值如果之前能凑出就不选,否则就选。 这样做显然是对的。令 \(p_1,p_2,\dots,p_{2^n-1}\) 表示将 \(c\) 排序之后,对应原来的下标;\(S\) 表示选出数的集合;\(S'\) 表示最终选出数的集合。可以证明两个问 阅读全文
posted @ 2024-06-22 10:55 WBIKPS 阅读(15) 评论(0) 推荐(0)
摘要: 思路 直接将输出的答案分为两个分考虑。 (1) 考虑二分 + DP。 设当前二分出的平均数为 \(x\),如果合法,那么有(其中 \(p\) 为选出数下标的集合): \[ \frac{a_{p_1} + a_{p_2} + \dots + a_{p_k}}{k} \geq x \]即: \[ \fr 阅读全文
posted @ 2024-06-22 10:52 WBIKPS 阅读(36) 评论(0) 推荐(0)
摘要: 思路 定义 \(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\ 阅读全文
posted @ 2024-06-22 10:51 WBIKPS 阅读(17) 评论(0) 推荐(0)
摘要: 思路 一眼可以把两个可以交换的数之间建一条边,显然在一个连通块里面的元素可以两两之间交换。 由于是排列,每一个元素 \(i\) 最终的位置是 \(i\)。 考虑将元素从小到大放置,令 \(ad_i\) 表示当前 \(i\) 元素的位置。 现在我们想让 \(i\) 换到 \(i\) 位置上,并且想使用 阅读全文
posted @ 2024-06-22 10:51 WBIKPS 阅读(16) 评论(0) 推荐(0)
摘要: 思路 首先有一个显然的贪心策略,就是先用大面值的,再用小面值的。 因为 \(n \neq 60\),先考虑搜索。 对于搜索到剩余 \(x\) 元,当前用 \(A_u\) 面值的时候。可以分为两种情况: 不找零,其答案为 a = x / a[u] + dfs(u - 1,x % a[u])。 找零,其 阅读全文
posted @ 2024-06-22 10:51 WBIKPS 阅读(24) 评论(0) 推荐(0)
摘要: 思路 首先,转化一下题面,对于每一次操作,相当于在原序列的前缀和数组 \(s\) 中删除一个数。 \(dp_i\) 表示操作 \(1 \sim i\) 能得到的序列个数。 如果 \(a_i\) 在 \(1 \sim i - 1\) 中没有出现过,状态转移方程为 \(dp_i = dp_{i - 1} 阅读全文
posted @ 2024-06-22 10:51 WBIKPS 阅读(21) 评论(0) 推荐(0)
摘要: 思路 首先需要知道一个事情,对于一个数 \(x = \prod{p_i^{c_i}}\),它的约数个数是: \[\prod{(c_i + 1)} \]那么先将 \(\binom{k}{n}\) 展开: \[\frac{\prod_{i = n - k + 1}^{n}i}{k!} \]发现一个数的约 阅读全文
posted @ 2024-06-22 10:51 WBIKPS 阅读(21) 评论(0) 推荐(0)
摘要: 思路 Part 1 弱化版 看到这道题的第一眼想到了 P1012 这道题。 但是,这两道题选择的数量是有区别的。 我们可以由拼数得出一个结论性的排序规则(这里就不多做解释了): inline bool cmp(string a,string b){ return a + b < b + a; } 如 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(18) 评论(0) 推荐(0)
摘要: 思路 对于每一个 7,我们都可以抽象为这样一个图形: 如果有两个 7,无论它是否有重合部分,红色部分是不需要判断的,只需要看绿色的部分。 因此,我们的问题就简化为了三角形,而不是四边形。 对于所有的 7,都有一个公共顶点:\((0,0)\) 点。 所以,我们可以引出一个叫斜率的概念来判断这些三角形是 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(16) 评论(0) 推荐(0)
摘要: 题意 给定 \(N\) 个小车,每个小车的编号分别为:\(1,2,\dots,N\)。 现在有 \(Q\) 个操作,每个操作执行 \(3\) 种操作: 1 x y,将 \(x\) 和 \(y\) 相连。(\(y\) 在 \(x\) 之后) 2 x y,将 \(x\) 和 \(y\) 的连接解除。 3 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(41) 评论(0) 推荐(0)
摘要: 比较符合 CCF 造数据水平的题。 思路 首先可以用两个 vector<pair<int,int>> v[N] 分别将每一行、每一列的元素的权值与编号存储下来。 那么可以对所有的 \(v_i\) 按照权值从小到大排序。那么发现对于所有的满足 v[i][p].fst < v[i][q].fst 的 \ 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(22) 评论(0) 推荐(0)
摘要: 思路 显然我们需要求出原树的最大匹配。 定义 \(dp_{i,0/1}\) 表示在 \(i\) 为根的子树中进行匹配,且 \(i\) 不选/选 的最大匹配。状态转移方程比较显然: \[\left\{\begin{matrix} dp_{u,0} = \sum{val_v}\\ dp_{u,1} = 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(21) 评论(0) 推荐(0)
摘要: 板子题,模拟赛场切了。 思路 线段树换根板子题。 因为需要求每一个点的答案,所以定义 \(dp_i\) 表示以 \(i\) 为根的最长距离。 考虑将一个点 \(v\) 转化为根,树的形态会发生什么变化(假设 \(v\) 的父亲节点是 \(u\))。 发现在 \(v\) 子树中的节点,距离都会减少 \ 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(20) 评论(0) 推荐(0)
摘要: 思路 定义 \(dp_{i,j}\) 表示将前 \(i\) 个数,正好分为 \(j\) 组的方案数。 那么,我们对 \(i\) 号元素进行分类讨论: 将 \(i\) 放入原本就存在的组中,因为在同一个组中不能存在两个数 \(x,y\),使得 \(x \bmod m = y \bmod m\)。所以对 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(17) 评论(0) 推荐(0)
摘要: 思路 区间 DP 好题,合并的时候十分毒瘤。 首先,定义 \(dp_{i,j}\) 表示合并 \([i,j]\) 区间不同的方案的数量。不难发现,如果区间长度为奇数(即 \(j - i + 1\) 为奇数),一定无法合并。 然后,如果 \(i,j\) 是朋友关系,有 \(dp_{i, j} = dp 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(25) 评论(0) 推荐(0)
摘要: 思路 首先,不难发现,对于本题将 \(a,b\) 合成一个序列,并按照 \(a_i\) 排序的答案不会发生变化。所以,我们可以直接排序,那么,我们当前枚举到的 \(a_i\) 就是当前的 \(\max(a_i)\)。 定义 \(dp_{i,j,0/1}\) 表示在 \(1 \sim i\) 中,选择 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(104) 评论(0) 推荐(0)
摘要: 思路 定义 \(vis_i\) 表示数 \(i\) 在序列中出现的次数。如果我们选出 \(k\) 个数,答案就是(其中 \(m\) 表示 \(\max(c_i)\)): \[ \sum_{i = 1}^m\frac{\binom{n}{x} - \binom{n - vis_i}{k}}{\bino 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(17) 评论(0) 推荐(0)
摘要: 思路 通常来说,对于倍增问题 \(dp_{i,j}\) 表示的是以 \(i\) 为起点,走 \(2^j\) 步的答案。 但是,对此此题,如果对于点倍增,因为每一个点可能会有多条边经过,所以,不能对点进行倍增。 但如果对边进行倍增,无论怎么走 \(2^j\) 步后的位置一定相同,所以考虑对每一条边倍增 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(21) 评论(0) 推荐(0)
摘要: 思路 一个简单的贪心,对于每一次操作,我们假设我们能用盒子的大小的数组处理成 \(a\)。那么,我们可以对 \(a\) 进行从小到大排序。 然后,对于我们所有的箱子,我们可以以 \(w\) 为关键字,从小到大排序。 接着,我们可以进行暴力枚举,对于 \(a_i\),我们要取的必定为 \(\max_{ 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(14) 评论(0) 推荐(0)
摘要: 思路 首先发现一个事情,任意一个子串都可以由 \(s\) 的某一个后缀的后面删除一些字符得到。 因此假如 \(s\) 的某一个后缀的值为 \(x\),那么我们可以减去后面的我们不用的数字 \(a\),然后除以 \(10\) 的若干次幂得到,即 \(\frac{x - a}{10^n}\)。 于是得到 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(20) 评论(0) 推荐(0)
摘要: 模拟赛最后 \(15\) 分钟想到的做法。 思路 首先有一个显然的贪心策略:我们放炸弹的地方要尽可能的使这个炸弹能影响到更多的怪上。 那么我们可以将对于一个怪 \(i\) 能够影响到它的区间表示出来 \([\max(1,l_i - d),a_i + r]\)。 然后将这些区间排个序,可以粗略画出这样 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(18) 评论(0) 推荐(0)
摘要: 思路 考虑将 \(\max\) 和 \(\min\) 的贡献分开计算。 显然我们对这个序列进行一次排序不会影响最终的答案,因此我们可以先排序一下。 然后有一个很经典的 trick,就是你枚举每一个数 \(x\),将 \(x\) 令为最大值(最小值)。因为我们先前排序过一次,因此我们可以轻易的计算出比 阅读全文
posted @ 2024-06-22 10:50 WBIKPS 阅读(18) 评论(0) 推荐(0)
该文被密码保护。 阅读全文
posted @ 2024-06-22 01:28 WBIKPS 阅读(3) 评论(0) 推荐(0)
该文被密码保护。 阅读全文
posted @ 2024-06-22 01:28 WBIKPS 阅读(4) 评论(0) 推荐(0)
摘要: 思路 问题本质上就是一个在一段区间中找完整线段的数量。 我们先不考虑所有 \(l_i\) 对答案的限制,那么,我们的答案就应该是 \(1 \sim q\) 线段的数量减去 \(1 \sim (p - 1)\) 的数量,这个东西可以直接用树状数组维护。 然后,再来考虑 \(l_i\) 对答案的限制。如 阅读全文
posted @ 2024-06-22 01:27 WBIKPS 阅读(30) 评论(0) 推荐(0)