08 2024 档案
摘要:原题链接 启发式思考 替换的过程,可以看成数组 内部的流动,既然是流动,我们可以用图来表示这种流动 经过样例测试发现,这样的图,每个节点最多有一个入度,但可以有多个出度,很像树,但是又存在环 感知一下,每一次替换,都是父节点的值赋给子节点,因此,k次替换后,该节点的值就是第
阅读全文
摘要:原题链接 题解 首先是朴素解法,每次遍历 然后查看 每个数的平方根是否是其前缀 时间复杂度 这里有两个数,一个是 ,即一个整数,一个是 ,是 的平方根,因此我们可以换一个视角. 统计对于每一个整数 \
阅读全文
摘要:原题链接 题意 对于有相同颜色传送门的城市 ,可以花 的代价从 或 问从城市 的最小代价,或者报告无法到达 分析 对于无法到达的情况,很简单,用并查集维护即可 而对于可以到达的情况,我们发现,两座城
阅读全文
摘要:原题链接 题解 什么情况下,答案为 -1 ? --两座城市没有任何直接或间接的传送门相连 所以如果我们把所有能通过传送门互相到达的城市放入一个集合,那么输出 -1 代表这两个城市不在一个集合里 不能相互到达的问题解决了,能相互到达的城市,cost 是多少?
阅读全文
摘要:原题链接 题解 1.暴力想法:维护n个集合,每次合并,遍历两个集合,最坏时间复杂度 2.优化想法:两个集合合并后,我们只需要查询大集合的大小,因此,我们可以只遍历两个集合中较小的那个 然后莫名发现竟然过了,我们上网查了一下,发现这种方法叫做启发
阅读全文
摘要:原题链接 题解 根据哥德巴赫猜想,任意大于2的偶数都可以表示为两个质数的和 因此,对于大于二的偶数,总有办法拆成两个质数,也就是只需要交两元钱 如果是质数,只用交一元钱 如果一个数减二后是质数,也只需要交两元 否则交三元 code #include<bits/stdc++.h> using name
阅读全文
摘要:原题链接 题解 如果在升区间内包裹降区间,那么这个降区间是不合法的 如果两个升区间有重叠,那么这两个升区间将合并成一个大的升区间 这种合并的操作让我们想到了并查集,我们用并查集维护升区间,如果一个降区间内的点不属于一个集合,代表不存在一个升区间包裹了这个降区间 yes or no的问题解决了,如何构
阅读全文
摘要:原题链接 题解 比较套路化的处理,将后半部分翻转过来乘二,查看前半部分是否有匹配的地方
阅读全文
摘要:原题链接 题解 分类讨论 1.如果 是 的倍数,答案为 2.否则,至少要经过两次转换,而 转换一次最少要花 , 转换一次最少要花费 ,所以,如果 有公因子,那么只需要两次转换 3.否则
阅读全文
摘要:原题链接 题解 方法1: 每次询问,每次遍历 方法二:利用大随机数代表每个数,异或哈希代表每个数出现的状态 code #include<bits/stdc++.h> using namespace s
阅读全文
摘要:原题链接 题解 多想几种暴力 1.遍历所有数对: 2.求有多少数对其乘积为平方数 求有多少平方数能被数对乘积: 3.如果两个数的乘积为平方数,代表他们的质因数,要么都是奇数,要么都是偶数 : 4.如果 \(a \times
阅读全文
摘要:原题链接 题解 暴力想法: 每次枚举每次查询 进阶想法:对查询按 排序,用树状数组维护 内,该范围内每个数最后一次出现的位置 code #include<bits/stdc++.h> using namespace std; /* #d
阅读全文
摘要:原题链接 题解 异或就是不进位的加法,所以区间内,每一位最多只有一个一 暴力方法: 遍历每一位区间,查看异或和加和 前缀和优化: 找每个右端点合法的左端点 利用性质优化: 由于最多只有一个1,所以这样的左端点不会随着右端点的递增而递增 c
阅读全文
摘要:原题链接 题解 的暴力方法: 遍历所有区间,然后找出每个区间内的最小值 的暴力方法: 考虑每个点的贡献,往左扩展直至出现比其小,往右扩展直至出现比其小的 观察 的暴力方法,我们发现往左扩展和往右扩展相互独立 所以我们只观察往左扩展 ”
阅读全文
摘要:原题链接 题解 首先,假设当前 括号序列为合法序列,则有如下几种情况: () (...) (...)...(...) code #include<bits/stdc++.h> using na
阅读全文
摘要:原题链接 题解 注意数据范围,设 为x只白鼠,y只黑鼠,A先手赢的概率 则每次选取要么A赢,要么B赢,要么都没有赢进入下一轮 code #include<bits/stdc++.h> using namespace std; /* #define int long long
阅读全文
摘要:原题链接 题解 总体上来讲,就是二分 查询 插入 时有多少数小于等于 ,查询插入 时有多少数小于等于 然后减一减,看看是不是 小于等于 我认为目前没有比ai讲的更清楚的了,请点击这里 code #include<bits/
阅读全文
摘要:原题链接 前情提要,结合原题解区的题解 题解 先简化问题,对于一对数 ,其中 ,要使其差为 的操作数是多少? 分类讨论 1.如果 ,操作数为 (不操作) 2.如果 ,操作数为 (增加a或者
阅读全文
摘要:原题链接 题解 原题解区写的很详细,所以这里总结一下自己的语言 性质1.如果两个数组相等,那么两个数组的差分数组也相等 根据这个性质,原题就转换成了对数组 的差分数组操作(选取两个点 使 或者 ) 性质
阅读全文
摘要:原题链接 题解 建桥相当于把区间内的路合并起来,这引导我们用并查集维护 可是具体如何实现呢? 我们令桥内的所有节点的统一指向最右端点作为首领,然后对于桥内的所有小桥,每次更新完了之后往右边走一格 code class Solution { public: int fa[2000005]; int f
阅读全文
摘要:原题链接 题解 对于一段区间 我们可以在 的位置查询一次,然后利用差分的思想跑到l-1再查一次 虽然这样不行,但是可以先在 的位置查询一次,然后再在 的位置查询一次,然后顺序遍历,每次遍历就把对应位置上的数激活,可以用树状数组 code #
阅读全文
摘要:原题链接 题解 假如不是环,你会做吗? 从左到右遍历 第 棵树的放置只与前面一棵树有关,线性dp 而图一定长这样: 当第 棵树为 的时候,无论第一棵树是 还是 (不能为3,因为3不会往上),都符合环的要求 同理 因此我
阅读全文
摘要:原题链接 题解 多想几个暴力 暴力1:每次询问,便对p跟随模拟 暴力2:预处理 代表 时的答案 暴力1的最坏时间复杂度: 其中当k,a很小的时候取到 暴力2的时间复杂度: 发现当 \(k\geq \sq
阅读全文
摘要:原题链接 题解 修改玫瑰 ,对答案的影响是: 减去只有玫瑰 的区间,加上只有玫瑰 和另一个玫瑰的区间,加上 m 因此我们对每个玫瑰 ,维护上述两个区间长度 由于每个玫瑰开花时间一样,所以我们可以用扫描线的思想,对所有区间的端点离散化排序,然后升序遍历,
阅读全文
摘要:原题链接 题解 很有意思的思想,一遇到括号就倒过来 code #include<bits/stdc++.h> #define ll long long #define lb long double #define lowbit(x) ((x)&(-x)) using namespace std; c
阅读全文
摘要:原题链接 题解 很抽象的建模,我一开始想的是韦恩图,然后韦恩图里选取 若干 个点,还要保证每个图都能选上,然后把韦恩图抽象成点,图中的点抽象成待匹配的点,然后就是二分图匹配了 code #include<bits/stdc++.h> #define ll long long #define lb l
阅读全文
摘要:原题链接 题解 割点的特性: 以 s 为根节点dfs,割点的dfn序小于 t 点,且在割点dfs之后 t 点才有dfn序 code #include<bits/stdc++.h> #define ll long long using namespace std; vector<ll> G[20000
阅读全文
摘要:原题链接 题解 如果某个半联通子图包含一个点,那么该点所在的强连通分量一定可以被包含进来,因此,我们可以对强连通分量缩点 缩完点之后最长链就是答案了 维护以每个点为首的最长链大小和个数
阅读全文
摘要:原题链接 题解 题目目的:建立一个最小生成树 那么直接按边权排序后合并就行了 啊!!!!
阅读全文
摘要:原题链接 题解 优秀博客 朴素贪心: 每次找一条路,易得一条路的最大流量为路径上的最小权值,因此多次bfs遍历找合法路径,然后dfs更新路径上的权值 缺点请看上面的优秀博客 因此建立反向边的作用,有点类似于二分匹配:这条路径的部分流量由我负责,现在你去负责其他路径 第一次学,还是有很多地方不懂 co
阅读全文
摘要:原题链接 题解 往无向图中添加至少几条边,使得图中包含奇数环? 注意是要添加少边,而不是使环小 讨论 1.0条 当且仅当原图中存在奇环,方案数为0 用bfs染色判断,即对于一个环,bfs一定会绕一圈该环,然后黑白染色判断奇偶即可 2.一条 当且仅当存在一连通图大小大于等于3 对于该连通图内,对方案数
阅读全文