02 2024 档案
摘要:法一:类比基环树中的第二种处理方法 例题:仙人掌最大独立集 处理仙人掌图,可以先考虑在树上怎么做,然后在仙人掌里加一些对环的限制。 所有回边的影响,会在深搜树上的环顶被解决。此后就可以看作普通子树。 用 记录 的环顶, 表示 不属于任
阅读全文
摘要:模板题 朱刘算法。先讲不带优化的版本。记答案为 。 对于一张图,先把每个结点边权最小的入边选出来。如果有结点没有入边,无解;否则令 累加这些边的边权。 如果选出来的边不构成环,则这些边肯定构成了这张图的最小树形图。 否则考虑这个环。
阅读全文
摘要:有两种方法: 最大费用流。 把网络流作为贪心的工具。 建图:原图中的点也当作新图中的点。对于一条原图的边,新图中建两条:一条容量 费用 ,一条容量 费用 。(深海机器人的方法) 向所有入度 的点(还有出度 向
阅读全文
摘要:S1 观察发现,所有靶子右上角必须斜率负数,右下角必须斜率正数,左端点没有要求。先判断斜率中负数和正数的数量是否都达到 ,否则无解。 其次,如果现在有两条线和两个 相等的点,斜率较大的线配了 较小的点。交换这两个匹配,发现让两个与 轴的交点更靠近了。由此
阅读全文
摘要:传送门 题意:给定两个数组 ,若 ,则他俩可配对。求极大匹配的方案数。(极大不是最大,最大一定是极大) 先考虑最大匹配方案数怎么求。 把 和 从小到大排序。则每个 能匹配的 都是一段后缀,且随着 \
阅读全文
摘要:前四题水。 G 时限五秒,两只 log 都能过。 建线段树,每个结点上面存一个 multiset,包含所有作用到这个结点区间上的修改。 删除直接找到对应 multiset 删除即可。
阅读全文
摘要:左偏树是一种可并堆(一系列的堆),支持以下操作: 删除一个堆的最值。 查询一个堆的最值。 新建一个堆,只包含一个元素。 合并两个堆。这个复杂度是 的。 左偏树是一颗二叉树。定义 “外结点” 为儿子数量不等于 的结点,定义每个结点的 为该结点到最近
阅读全文
摘要:只做了 A,成功被 sb 错误卡住。 A 每次挑最右边的左移。 B 每次一定是优先向最近的怪物打,打完一个打下一个最近的。 子弹不一定只能打两个怪物,所以打的时候用循环判断子弹是否打完。 C l = r 不行 否则考虑全 1 再把所有 的都 +1,这需要 \(cnt1[r]-cn
阅读全文
摘要:CF10E 题解 翻转 性质:如果翻转的区间所有数对个数为偶,则整个逆序对个数奇偶性不变;否则改变。 证明:首先翻转区间外的逆序对个数不会变化,翻转区间与翻转区间外的逆序对个数也不会变化。 假设翻转前翻转区间内有 个逆序对,则翻转后有 \(len\times (len-1)/2-cn
阅读全文
摘要:无向基环树找环,遍历模板: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; int n; vector<int> e[500005]; bool vis[5
阅读全文
摘要:一道练习贪心证明的好题。 绝大多数题解只是点出了以下结论: 要么最快的带最慢的;要么最慢的带次慢的。 并没有给出证明。我就补上这个证明。 为了证明这个贪心结论,我们先证明几个引理。 引理一:每次将火把带回来的,一定是对岸最快的。 引理一证明:如果回来的不是对岸最快的,让对岸最快的人代替这个回来的人的
阅读全文
摘要:自己做不出来,看现在题解区的题解讲的都不咋清楚。懂了之后来为后人铺路。而且我的马蜂比较好看 题目传送门 我能看懂这道题,主要是依靠了这篇题解的帮助。 首先我们只关注数的相对关系,所以可以离散化。注意到值域 ,用数组离散化。 这道题可以用贪心做。(有一些定义先往下看) 定义一个无缝子序
阅读全文
摘要:传送门 注意题目保证新加入的区间长度一定最大,想一想,这是保证了新区间不会被包含。 区间关系有三种:如果两个区间相交,则两个区间互相可达;如果是包含关系,小的能到大的;如果相离,都不能到。 显然当区间 与 相互可达, 与 相互可达,则
阅读全文
摘要:传送门 先将括号序列建树。 具体而言,假设当前根结点为 ,当前括号序列为 。若 能分成 组括号,则 有 个儿子。对于第 个儿子,以它为新根结点,第 组括号为新括号序列,递归建树。 例如 (()()
阅读全文
摘要:传送门 题意;找出最浅的点分树。 发现这是一个等价问题:给每个结点一个标号,当两个结点标号相同时,它们的路径上必有严格更小的标号。如果找到了这样一种标号方法,每个结点的标号就是它的深度。 同时我们还可以把每个结点的标号 对应到 ,也是一一对应。问题又变成路径上必有严格更
阅读全文
摘要:前五题水。 提一嘴 D:应该是 x/n + x/m - 2 * x/lcm(n,m),而不是 x/n + x/m - 2 * x/nm! F 题意: 给定图。每个点有权值 。初始每个点有 个片。每次操作可以选定一个有片片的点,拿走它的一个片片,然后从它的邻点中选若干个,要求
阅读全文
摘要:A 最大值 - 最小值 B 题意:在 的方阵中选择若干个方块,使得至少有 条对角线上有选择的方块。 观察:如果选择第一行的 个,和最后一行的中间 个,可以覆盖 条对角线,这其中每一个格子都恰好覆盖两条对角线。 所以
阅读全文
摘要:S1 题解 S2 显然最少次数就是叶子个数 。那么 都不会用到。 对于 ,我们要尽量让它们放在路径上。 枚举每一条根到叶子的路径,选择路径上深度最低的 与这条路径匹配(没有就不匹配了)。 用树剖即可。 S3
阅读全文
摘要:袭击 给出 个点,求在前 个和后 个点中各选一个点的距离的最小值是多少。 分治 出处:《算法竞赛进阶指南》 题解: 先考虑只有一种点,怎么求两两距离的最小值。 分治,整体的最小距离 左半边的最小值,右半边的最小值,左右之间的最小值\()
阅读全文
摘要:3n多米诺问题 表示前 列的方案数, 表示前 列但是最上面一行缺一个的方案数。 可以相互递推,而且刚好是矩阵递推。 矩阵快速幂优化。 CF809D 题解 CF15E 题解 CF17C 题解 CF79D
阅读全文
摘要:喵了个喵 题解 磁带存储 有 个磁带,每个片段有两个参数:时长 和频率 。以某种顺序把片段排在磁带里,每个片段的花费为(播放完这个片段的时刻)乘以(该片段的频率) 求最小花费和。 因为两个片段交换,对之后没有影响。 所以可以考虑一个顺序中,如果 \(x,x+
阅读全文
摘要:菜肴制作 要求把 排序,满足给定的所有条件,满足条件之后,编号越小要越靠前。(满足条件情况下,先让 1 最靠左,然后让 2 ……) 每个条件会给出两个数 ,表示 必须在 之前。 解: 看起来很像拓扑排序。于是我们对于每个条件 \(a,b\
阅读全文
摘要:OI 中的组合,基本指组合计数。组合极值一般是贪心题或者 dp 题。 【组合数】 组合数 。 注意:求逆元前,请一定判断清楚,是否可能不存在逆元!!! 。 c[n][m] = c[n - 1][m]
阅读全文
摘要:数论:研究数与数之间的关系。如带余除法、因数倍数、同余整除等都是数论。 【筛法】 主要使用的筛法有两个:埃氏筛和欧拉筛(线性筛)。 使用筛法的原因很简单:对于一个数,我们要找它的因数不容易;但是对于一个因数,我们找它的倍数很简单。 【埃氏筛】 因为一个数的倍数一定不是质数,且任何数都能分解为若干质数
阅读全文
摘要:简单的树上 dp 其实已经在普及组涉及过:自上而下和自下而上传递的性质。 现在我们需要研究更复杂的树上 dp,比如换根 dp 等等。 【树上 dp】 最大子树和 给出一棵带点权的树,求这棵树中的最大权连通块。 因为是无根树,我们人为规定 1 号结点为根。 表示以 为根
阅读全文
摘要:主要有:剪枝、双向搜索、启发式搜索、迭代加深。 【剪枝】 拼接正方形 一道水题。基本想法:枚举每根木棍属于哪条边, 。 但是这太慢了,我们剪枝:如果一条边目前的累计长度 ,就返回 false。 于是我们就通过了。 运动员最佳
阅读全文
摘要:【单调栈】 柱状图最大矩形: 首先我们有一个最简单的方法: 枚举左右端点,然后再求中间的最小值,最后乘起来得到这段矩形组成的最大面积。 求最小值,我们考虑到ST表,我们可以用它优化到 。 接下来我们考虑转换枚举思路: 我们发现,一个矩形的大小,由它的左右端点,
阅读全文
摘要:【引入】 分(而)治(之)。 把一个问题分解成规模更小的子问题,从而降低复杂度的算法。 【归并排序】 我们用选择排序,复杂度是 。 但是如果我们把数组分成两半,分别选择排序,再归并起来,复杂度就降低为 ,几乎快了一半
阅读全文
摘要:【双指针】 双指针(two-pointer method) 这里的指针不是指向内存地址的指针,而是一个类似于光标的、指向一个位置的指针。 双指针是一个优化时间复杂度的思想。 【例子1】 两数之和 二重循环当然可以,但是太慢了。 于是我们可以使用双指针优化。 样例: 7 7 1 3 4 8 6 9 5
阅读全文
摘要:【什么是网络流】 一张带权图,给定了一个源点(起点)和一个汇点(终点)。 每个点比作一个中转站,源点比作一个水源,汇点比作一个洞。 每条边比作一条管道,边权比作上限。 现在要把水从源点输送到汇点,水经过若干中转站和管道到达汇点。 但是,每条管道单位时间内输送的水不能达到这条管道的上限(权)。 每个中
阅读全文
摘要:忘记打了,VP 了一把,前五题都是板子。 F 题意:坐标系上给定一个整点 ,求另一个整点 ,满足 组成的三角形面积为 (或说明无解)。 题解:由这三个点组成的三角形面积为 \(\dfrac{|ay-bx|}{2
阅读全文
摘要:ABCDF 都赛时做出来了。 E \(\displaystyle\dfrac{1}{D}\sum_{i=1}^D (x_i-\overline{x})^2=\dfrac{1}{D}(\sum_{i=1}^D x_i^2-\sum_{i=1}^D2x_i\overline x+\overline{x}
阅读全文
摘要:前三题过水。 D题 与 5+*的题解 注意:交互题每输出一次,就要 fflush(stdout); 一次 E 其实不是太难,但是赛时一直在搓 D 还没搓出来 首先如果有两个大于 的数相邻,就无限次, 否则一定有限次。 手玩几个样例,发现每迭代一次,最右边的非 的数会往右移一位
阅读全文
摘要:前三题氵 D 给定一个由 (,?,) 组成的字符串。每个 ? 可以设定为任意括号。求有几种设定方法使得整个是合法括号序列。 套路,dp E 给定 个两两不相交的长方体,对每个长方体,求有多少个长方体与其有公共面。 有一个可以大幅度优化代码麻烦程度的小技巧:因为坐标范围很小,我们直接把每个
阅读全文
摘要:前四题过水 E 枚举正方形的上边界所在行。对于第 行一个没洞的位置 ,我们尝试求出以它为右上角的无洞正方形个数。 结论:设以 为右上角的无洞正方形边长最大为 ,那以 为右上角的无洞正方形边长最大为 \(len +
阅读全文
摘要:直接从 F 开。 F 三维偏序。 把盒子按 排序,离散化,正常跑三维偏序(注意不能相等)。 还要处理 相等的情况,可以再把 从大到小排序,然后 都要求严格大于,如果发现有一种情况是无论 咋排序都可以的,就删掉这种
阅读全文
摘要:前三题过水。 D 表示吃完前 个菜,胃的状况为 ( 是健康, 是不好)所获得的最大美味值。 E 暴力的平衡树。用 multiset 也行,一个记录前 大的,一个记录除了前 大之后的所有数。 每次修改看看是从哪
阅读全文
摘要:题目列表 前三题过水,第四题分类讨论两个端点之间的距离和所在位置是清醒或睡眠 即可。 E 题意:一张图上有一些结点有保安,每个保安有不同的警戒度 ,定义 一个结点是安全的 为这个结点可以到达一个保安 ,且距离 。 问有多少个安全的结点。 痛失第五题 很简单
阅读全文
摘要:T4 在一个平面上有一块面积无限的蛋糕,给出 颗草莓的所在位置和 条平行与 轴的切刀位置。 切刀会把蛋糕沿 轴切开。因此一共会切出 块蛋糕。 问:现在蛋糕上草莓数量最少的一块蛋糕,草莓数量是多
阅读全文
摘要:比赛 理理思维 第一反应居然是分块而不是线段树? 线段树解法:因为只有 ,所以每个节点开一个桶完全可以,操作一二不提,操作三只需要多次查询,然后多次赋值即可。 分块解法:操作一不提,操作二懒标记,操作三枚举 字母算 ,然后桶排(可以用操作一)。同时做一点优化:
阅读全文
摘要:【朴素 LCA】 LCA 是树的一个重要概念,意为两结点的最近公共祖先。 先给出朴素求 LCA 的代码。 int get_LCA(int u, int v) { if (d[u] > d[v]) swap(u, v); while (d[u] != d[v]) v = p[v]; while (u
阅读全文
摘要:【倍增算法】 先来介绍一些倍增。 倍增是用来加速枚举过程的算法。 一般可以把算法变成 级别 。 举个栗子。 这里有一个小人,他想去右边的目标,但是他并不知道这个目标有多远。 不过他知道目前自己是在终点的左边还是右边。 我们说,他可以一步一步走,
阅读全文
摘要:【最小生成树是什么】 在一张图 (设 个结点)中,选取 条边,用这些边把结点之间连通。 那么这 条边和原来的结点所构成的图 ,就叫做 的生成树。 最小生成树,就是希望 中边权的和最小。 而求最小生成树,有两种比较
阅读全文
摘要:【并查集是什么】 并查集是用来表示一些不相交集合的算法。 它可以很快地处理两个点之间是否在一个连通块中。 【并查集的特点】 动态合并集合; 合并之后就不能拆开了。 并查集开始前,先按顺序把初始集合编号。 (初始也不一定每个都是单个元素) 【并查集的实现】 数据结构分类:抽象结构、存储结构。 抽象结构
阅读全文
摘要:A 先判断初始行不行,再模拟加入。 B 题意:数轴上给定一些线段,和点 。问能否删去一些线段,使得 变成唯一的覆盖次数最多的点。 差分 + 贪心。 C 有 杯水, 个人。每杯水有水量上限,每个人有喝水上限。初始第 个人对着第 个杯子
阅读全文
摘要:A:氵 B:排序对两个偶数没影响,对两个奇数没影响。唯一的影响是可能原本偶数在后面,调到前面贡献变多。所以把所有偶数弄到前面就行。 C: 表示前 个字符以第 个字符结尾,有多少个子串符合条件。 若 ,
阅读全文
摘要:A 氵 B 如果 11 后出现了 00 就不行。 C 枚举走几段。 横竖可以分开算。 一定是:除了费用最小的都是走长度 ,费用最小的包揽剩下的。 D \(c\cdot \dfrac{a}{gcd(a,b)}\cdo
阅读全文
摘要:传送门 A: 一个组 ,另一个组剩下的。 B: 考虑不停循环。 如果不同的数字超过 ,无解。 否则先把原序列去重,然后把末尾补一些数补成 个,再把这个新序列循环 次。 C: 先把字符们排序。 肯定
阅读全文
摘要:A 用计算器式显示数字,可以显示 段。可以显示的最大数字是多少? 如果用了一个需要至少四段的数字,一定不如把这个替换成两个 好。 如果一共可以用偶数个,一定是全部 。 如果一共可以用奇数个,一定是开头一个 ,之后全是 。 B 给定一个 \(01\
阅读全文
摘要:A 题意:你在数轴原点。有一个宝箱在 ,钥匙在 。每移动一单位,耗费 时间。你可以到了 然后抱着宝箱走,但是抱着宝箱走的总路程不能超过 单位。如果某时刻你、钥匙、宝箱在同一个单位上,就能开宝箱。问:最快要多久开宝箱? 要么是拿钥匙,向宝箱走;要
阅读全文
摘要:只做出 A,身败名裂 A 显然不管怎么排,13,31 总有一个会出现,看看哪个出现。 B 给定两个 01 串,每次可以挑一个串的一个子串,要求两端相同,然后把这个子串全部变得和两端相同。 问经过若干次操作,能否使两个串相同。 重要性质:如果能变相同,存在一种方案,任意两次操作的子串都不相交。 证明:
阅读全文
摘要:A 让 保存数组中所有最大的数,如果所有数都相等则 。 B 只需要记录每个序列的最小值和次小值,然后对次小值求前后缀和。 C 枚举最大值 ,然后遍历 。对于 ,取最大数 满足 未选且 \(i\times
阅读全文
摘要:传送门 A 氵 B 在吃了五次罚时后,我终于放弃了卡常优先队列,并发现:把余 看作余 ,答案就是余数从大到小排列的,每种余数内部又按照下标排序。 C 我为什么没想到哈希?自我检讨:见到关于字符串判定相等/不同个数时,一定要尝试用哈希!!! 记前缀 的哈希值为
阅读全文
摘要:A 比两边和的大小即可。 B 显然如果一个数拥有的所有二进制位的 被包含在 中,选了一定不会导致不能变成 ;如果有一个 , 对应的位上是 ,则一定不能选。 因此从三个栈上面看,只要所有 对应到 上也是
阅读全文
摘要:A 氵 B 把奇数和偶数拿出来分别排序,然后按下标归并,看看得出的结果是不是排好序的。 C 如果头尾同色,就找有没有 个位置和头尾同色; 否则从头找 个和头同色的,然后再在这之后找 个和尾同色的。 D 把每个前缀和相邻的相减,得出的结果: 有大于 的,
阅读全文
摘要:A 给出一个由 组成的序列。一次操作可以让一个数变相反。 要多少次操作,才能让整个序列和非负且积等于 。 大 氵题。 B 定义两个数 有一个价值:每一位上的数字的差的绝对值相加。(位数不足用前导零补齐) 给出区间 ,问在
阅读全文
摘要:A 题意:给一个长度为 的全是 的数列,Alice 先操作,Bob 交替。每次操作选择至少两个(可以更多)相等的数字,删除它们,在序列中加入它们的和。直到有人不能操作为止,这个人就获胜了。 问:谁有必胜策略? 很简单的结论题。 如果 ,Alice 把 \
阅读全文
摘要:C 先用桶记录各个位数量。 对于每次询问,从低位到高位扫,先用掉一个当前位的,然后把当前位的全部转化成 个更高位的。 D 有一个思路:其实删区间可以视作删相邻两个数。(然鹅这题不是按这个思路做的) 考虑整个序列最小值,它一定不会被删。 这个最小值把序列剖成两半。递归进入左右分别计
阅读全文
摘要:多次判断 是否是 的祖先: 对每一个点,增加两个属性: 刚搜到这个点的时间戳,和回溯这个点的时间戳。 是 的祖先,等价于 开始到结束的区间 包含 开始到结束的区间。(如 包含 ,则\([1,7]\
阅读全文
摘要:【概念】 都是无向图的概念 支配集:一个点集,使得无向图中每个点要么是点集中的点,要么与点集相邻。 独立集:一个点集,使得点集中任意两点不相邻。 以上两个在任意图中都是 NP 问题,也就是无法在多项式时间内求解的问题。 点覆盖:一个点集,使得所有边都至少与点集中一个点相连。 结论:点覆盖的补集是独立
阅读全文
摘要:【Trie 树】 我们试图给每一个字符串一个对应的值。但是由于字符串长度不定,也不是数字,所以不能用数组。 有几种办法: STL map,二叉排序树(平衡树), 。 为字符串长度。 Trie,插入删除查询都是 的。但是
阅读全文
摘要:【最小表示法】 最小表示法 循环表示:从一个位置开始向后遍历,到末尾再倒回去最前面。一个字符串(数组)一共有 个。 最小表示法就是最小的循环表示。 例如,3 1 4 9 1 的最小表示法是 1 3 1 4 9. 如果我们用打擂台比大小的方式,因为字符串之间比较需要时间,总共是 \(O(n
阅读全文
摘要:最小斯坦纳树 给定 个关键点必须选,选一些点,选一些边连接他们,求总边权最小。 首先最终肯定选出一棵树。看到 的范围,果断状压。 表示以 为根,至少(不是恰好)包含 中的关键点的最小边权总和。 如果最终的树中 的度
阅读全文
摘要:【哈希】 哈希可以分成两块:哈希函数和哈希表。 哈希函数是一种对应关系,它可以把任意类型映射为一个不太大的整数。 例如字符串,我们可能希望在字符串上记录一些属性。但是字符串不能当下标,那我们就只能加个大常数用 map。 这时,哈希函数出场了!如果我们有一个哈希函数 可以把一个字符串
阅读全文
摘要:【什么是虚树】 OI-wiki 如果题目里有一些关键点,而整棵树规模过大,我们可以考虑使用虚树来重新建树,以减少树的规模。 虚树:一颗树,树中包含所有关键点,以及任意多个关键点的 LCA。 可以发现在这颗虚树中,任意两个关键点的 LCA 都不变(还是对应原树的结点),并且只要我们把虚树中每条边的距离
阅读全文
摘要:郑哥狂喜 引入:静态区间第 k 小。给定一个数组和若干个询问,每次询问要查询某个区间中第 小的数。 这里介绍一种整体二分的算法。 如果只有一个询问,有一种二分的算法: 初始左右端点设为整个数组的最小值和最大值,不断二分。看一下二分值 ,比 小的数有 \(t\
阅读全文
摘要:【定义】 知识:向量组、线性空间、线性相关性。 向量组:一组向量,各个维数相等。 线性表示:如果一个向量能被一个向量组中若干个向量乘上系数后相加得到,称这个向量可被此向量组线性表示。 (例如向量组 , ,则 可被 线性
阅读全文
摘要:这是一种线段树的高级玩法:在时间轴上运用。每个时间节点作为一个叶子,在一个时间区间内的标记,就可以影响到这个区间内的所有时刻。 题目传送门 建立一颗基于询问的线段树,也就是说线段树的每个结点都代表区间内的一些询问。 因为删除操作不好搞,我们反向考虑,求每个询问存在哪些边。 我们可以对每条边,求出它是
阅读全文
摘要:可并堆:一种支持插入、删除、修改、删除任意一个元素、求 还有合并的数据结构。 下面的只讲可并堆中的一种:左偏树。 左偏树是二叉树,但并不是完全二叉树。它满足两个性质:① 每个结点的权值都小于等于儿子。② 每个结点 , 分别是
阅读全文
摘要:例题:CF600E 有一种暴力的想法是先 DFS 每个结点,再对每个结点 DFS 它的子树,用 数组记录每个结点子树的颜色出现情况。复杂度 。 一个平平无奇的优化:第一层 DFS 的时候,把重儿子放到最后搜索。在搜索重儿子的子树后,不清空 数组。然
阅读全文