摘要:
洛谷 题目要求我们求出至少有 \(k\) 个不同颜色的概率。 处理概率问题很容易想到 dp 处理,并且问题中的 \(n\) 很小,但是转移次数 \(t\) 很大,明显是一个矩阵乘法优化 dp 的问题。 那么方法有了就可以考虑转移式了。 如果按照常规的思路,以 \(dp_i\) 表示包含 \(i\) 阅读全文
posted @ 2025-12-07 13:09
huhangqi
阅读(9)
评论(0)
推荐(0)
摘要:
洛谷 首先进行分类讨论。 对于每个右上角的点,为了不让箭穿过箭靶,必须分配一只向下射的奶牛,即斜率为负数的奶牛。 右下角的点同理,只能选择斜率为正数的点。 对于左上角左下角,不管斜率为正还是负都可以射到。 那么无解条件明显就是斜率为正的和斜率为负的其中有一个不到 \(n\)。 但是我们的高度会受到射 阅读全文
posted @ 2025-12-07 13:07
huhangqi
阅读(3)
评论(0)
推荐(0)
摘要:
洛谷 看到 \(1\le N\le 40\) 甚至部分分 \(N\le 20\) 而且只有选和不选两种情况,这不是折半是什么? 那么直接考虑最板子的折半,前面一半从起点直接暴力搜索是否选择,得到最后的位置,另一半从终点往回走,最后统计是否有多少相等的数量即可。 但是分析一下时间复杂度,还是比较极限的 阅读全文
posted @ 2025-12-07 13:06
huhangqi
阅读(4)
评论(0)
推荐(0)
摘要:
洛谷 发现字母的范围比较小,但是也没有小多少,那么多半是需要对字母组合求解。 第一想法就是给计入的字母状压,确认是否相同。 但是字符串长度又太长了,并且不好优化,只能放弃。 那么该怎么组合? 我们发现影响两个字符串在选择这几个字符后的串是否相等需要看两点: 字符的数量 不同字符之间的位置关系 第一个 阅读全文
posted @ 2025-12-07 13:05
huhangqi
阅读(6)
评论(0)
推荐(0)
摘要:
洛谷 先考虑推导式子。 设我们选择的奶牛为 \(i\),选择的苹果是 \(j\)。 那么可以得到式子: \[|x_i-x_j|\le t_j-t_i \]直接拆掉绝对值,因为绝对值会取较大的值,所以不需要考虑二者大小关系的影响,然后即可推得两式: \[x_i+t_i\le t_j+x_j \]\[t 阅读全文
posted @ 2025-12-07 13:03
huhangqi
阅读(5)
评论(0)
推荐(0)
摘要:
洛谷 蒟蒻给一个时间复杂度较劣的线段树做法。 我们可以发现两个字符处理的结果和处理的顺序没有关系,那么我们可以先考虑将每一部分都尝试合成一个或没有字符,再进行合并。 那么我们其实可以考虑使用线段树直接维护每个区间内经过合成剩下了什么,即可判断是否正确。 代码: #include<bits/stdc+ 阅读全文
posted @ 2025-12-07 13:01
huhangqi
阅读(10)
评论(0)
推荐(0)
摘要:
洛谷 首先需要知道独立集是什么。 简单来讲独立集就是一个没有相邻的点的集合。 我们已经处理过比较多的独立集问题了。 比如常见的线性独立集。 代码: for(int i=1;i<=n;i++){ dp[i][0]=max(dp[i-1][1],dp[i-1][0]); dp[i][1]=dp[i-1] 阅读全文
posted @ 2025-12-07 13:00
huhangqi
阅读(8)
评论(0)
推荐(0)
摘要:
洛谷 提供一种在模拟赛上自己观察出来的方法。 由于树是递归定义的,并且每次加入一个值在这个子树中,左右儿子会调换,再将这个点加入左子树。因此我们每次加入一个节点,必须保证这个点未加入的左右子树的节点数量相等或者左子树未加入节点比右子树多一个。 这样的状态我们才可以做到选择完左右的节点。 以下我们称未 阅读全文
posted @ 2025-12-07 12:58
huhangqi
阅读(3)
评论(0)
推荐(0)
摘要:
洛谷 由于两个人都是绝对聪明的,所以每个人都只会做出最好的选择。 由于这个游戏在加完星门以后的情况已经确定了,所以开始时的树的形态以及开的星门就会直接导致游戏的胜负。 那么我们可以先处理出在根的胜负。 我们记录状态 \(dp_i\) 在 \(i\) 为 \(0\) 或者 \(1\),分别表示在这个点 阅读全文
posted @ 2025-12-07 12:57
huhangqi
阅读(6)
评论(0)
推荐(0)
摘要:
Codeforces 对于 Easy 部分的做法: 很容易想到统计下来每个点的位置,枚举到达的点,然后进行转移统计即可。 时间复杂度 \(O(m^2n)\)。 由于个人习惯,代码中的 \(n\) 和 \(m\) 与原题目不同。 代码: #include<bits/stdc++.h> #define 阅读全文
posted @ 2025-12-07 12:55
huhangqi
阅读(11)
评论(0)
推荐(0)
摘要:
AtCoder 以出发点为根,我们可以发现门一定在一个节点的祖先上,如果你走到一个点放下门,再继续走子树部分,然后去走其它子树时,一定会经过放门的这个点,那么此时这个门在这已经没有用了,如果你先去走其它子树,可以发现必定不是最优情况,所以门一定是在节点的祖先。 题目需要求出遍历完所有位置得到的答案。 阅读全文
posted @ 2025-12-07 12:54
huhangqi
阅读(3)
评论(0)
推荐(0)
摘要:
洛谷 由于每一个节点最多只会连出一条边,所以一个连通的图必定是基环树或者树。 如果是基环树,那么一定会有环,且经过移动后必定在环内,直接按照有环的情况输出即可。 对于一颗树,我们可以将这一个节点连向的点视为父亲,那么最后的答案就是这棵树的根。 我们可以通过并查集来模拟建树的过程,但是拆树的过程并不好 阅读全文
posted @ 2025-12-07 12:52
huhangqi
阅读(4)
评论(0)
推荐(0)
摘要:
洛谷 首先对于最大值,很容易想到找一条边拆掉,然后把两个直径相连,此时最长直径就是两个树的直径和再加一。 而对于最小值,我们将拆出来的两个树找中点,把中点连起来,此时就是两个的直径折半向上取整的和加一以及两个树的直径的最大值。 现在问题就是如何处理一条边两端的树的直径了。 我们首先可以一次 dp 以 阅读全文
posted @ 2025-12-07 12:50
huhangqi
阅读(9)
评论(0)
推荐(0)
摘要:
洛谷 一个比较简单的思路,不需要二分。 考虑逆向操作,从路径两端开始处理数值范围,将蚂蚁群大小视为一次查询。 由于树的两点之间的简单路径只有一条,所以每个点的范围是唯一的。 处理时和 \(10^9\) 取最小值,因为此时已经超过了蚁群最大数量,再继续可能会把 long long 爆了。 之后我们再把 阅读全文
posted @ 2025-12-07 12:48
huhangqi
阅读(4)
评论(0)
推荐(0)
摘要:
https://www.luogu.com.cn/problem/P4037 由题目可知整个合成路径可以看作一个森林。 对于答案的统计,我们在处理完每棵树的消耗费用对应的最大力量以后,使用一个背包即可。 这样我们就可以统计出答案了。 现在问题在于如何处理出每一棵树的消耗费用对应的最大力量。 很明显这 阅读全文
posted @ 2025-12-07 12:47
huhangqi
阅读(7)
评论(0)
推荐(0)
摘要:
洛谷 一眼动态规划。 但是我们状态怎么设置? 我们分析题目,可以发现一个领头一定要开到最后,不再成为领头。 原因很简单,如果你把这只领队重新放回队尾,那么它在其它奶牛领队后跑了几圈,它最后能跑的圈数比其他没有跑过的少得更多,自然是希望在前面跑完以后就不再领跑。 这样我们就简化了题目,目前需要记录已经 阅读全文
posted @ 2025-12-07 12:45
huhangqi
阅读(3)
评论(0)
推荐(0)
摘要:
Codeforces 看题目如果直接从如何配对的角度去考虑的话,还是比较困难的。 但是我们不只能从点的角度入手,我们也可以尝试从边的角度入手。 一条边如果要被两个点之间的最短路径经过,那么这两个点一定分别分布在这一条边的两边。 由于我们选择的是最长路径,而任意两个点之间的简单路径只有一条。 那么很容 阅读全文
posted @ 2025-12-07 12:44
huhangqi
阅读(3)
评论(0)
推荐(0)
摘要:
洛谷 发现直接从起点开始不好处理,可以考虑从终点倒过来处理。 假设目前在位置 \((x,y)\) 那么下一次一定是选择值为 \(x\times y\) 的区域。 那么我们开按照当前区域的值存下这个区域的位置,使用广搜处理,记录每一个值是否加入过队列,防止重复。 时间复杂度为 \(O(n^2)\),可 阅读全文
posted @ 2025-12-07 12:42
huhangqi
阅读(4)
评论(0)
推荐(0)
摘要:
洛谷 由样例可以知道,一个圆只贡献一个区域,而一个圆在中间被几个圆完全连接时会被分成两个部分,计算两个贡献。 那么我们很容易想到先按照左端点排序,在左端点相同时,比较半径大小。 然后从后向前连接,如果前面与当前点的左端相等,那么我们就可以通过这个圆尝试把前面的圆分成两部分。 然后记录下状态,如果前面 阅读全文
posted @ 2025-12-07 12:38
huhangqi
阅读(2)
评论(0)
推荐(0)
摘要:
洛谷 对于暴力写法,我们很容易想到一个 \(O(n^2)\) 的暴力。 我们可以先从左到右枚举需要配对的字符,然后从后往前去找到一个合法且相同的字符配对。 对于怎样才算合法,我们通过此部分内部是否合法,以及前面是否有已选择的括号判断。 在括号本身是合法的情况下,我们处理右边是否合法,对于本身存在解的 阅读全文
posted @ 2025-12-07 12:32
huhangqi
阅读(4)
评论(0)
推荐(0)
摘要:
洛谷 首先我们设更赛牛为加一,荷斯坦牛为负一。 这样通过前缀和就可以得到这一组是否需要增加一。 设 \(dp_i\) 表示以 \(i\) 为末尾,最少的分区。 那么方程式就为: \[dp_i=dp_j+(pre_i-pre_j\le 0) \]然而表达式我们并不好判断。 但是由于表达式只能提供数值为 阅读全文
posted @ 2025-12-07 12:26
huhangqi
阅读(4)
评论(0)
推荐(0)
摘要:
洛谷 我们可以考虑使用动态规划来解决。 在线性情况下,我们可以直接将状态设为 \(dp_i\) 表示走到 \(i\) 号点的时候的最小路程。 可以得到状态转移方程: \[dp_i=\min(dp_j+(l_i-l_j)\times v_i+s_i) \]其中 \(l_i\) 表示 \(i\) 号点到 阅读全文
posted @ 2025-12-07 12:23
huhangqi
阅读(6)
评论(0)
推荐(0)
摘要:
洛谷 由于环非常难处理,但是这个数据范围又很小,所以很容易想到枚举一个谷仓的位置,然后以这个地点为起始点使用动态规划。 为了使转移方便,我这里选择了逆时针处理这样计算这一段奶牛的路程。 我们定义 \(dp_{i,j}\) 表示已经选择了 \(i\) 个谷仓,目前最后一个选择的谷仓为 \(j\) 时的 阅读全文
posted @ 2025-12-07 12:20
huhangqi
阅读(4)
评论(0)
推荐(0)
摘要:
洛谷 首先观察部分分,对于前两组部分分,可以直接暴力枚举左右端点。 对于第三组部分分,从前缀和的角度去思考,然后可以发现假设一个数字为正数,一个数字为负数,开桶进行统计,只要两种人数不打平即可。 代码: #include<bits/stdc++.h> #define int long long us 阅读全文
posted @ 2025-12-07 12:18
huhangqi
阅读(5)
评论(0)
推荐(0)
摘要:
Codeforces 很明显是一道偏序问题,我们先列出满足条件的台之间的关系。 \[\min(r_i,r_j)\ge|x_i-x_j| \]\[|f_i-f_j|\le k \]这看起来好像是两条式子,但是不能直接使用二维偏序解决,因为其中含有取最小值操作,所以无法直接使用二维偏序处理。 那么就可以 阅读全文
posted @ 2025-12-07 12:13
huhangqi
阅读(8)
评论(0)
推荐(0)
摘要:
洛谷 由于需要考虑颜色的问题,所以可以考虑将总方法减去相同颜色的方案数,以此得到本次的结果。 使用前缀和,得到此处的方案总数。 然后就需要考虑如何处理颜色的问题了,由于需要进行区间修改与查询,很容易想到使用线段树进行优化,但是按照颜色数写很多树状数组明显空间开不下。 所以使用动态开点的方法。由于一棵 阅读全文
posted @ 2025-12-07 11:59
huhangqi
阅读(2)
评论(0)
推荐(0)

浙公网安备 33010602011771号