08 2024 档案

摘要:原题链接 启发式思考 替换的过程,可以看成数组 \(A\) 内部的流动,既然是流动,我们可以用图来表示这种流动 经过样例测试发现,这样的图,每个节点最多有一个入度,但可以有多个出度,很像树,但是又存在环 感知一下,每一次替换,都是父节点的值赋给子节点,因此,k次替换后,该节点的值就是第 \(k\) 阅读全文
posted @ 2024-08-28 19:45 纯粹的 阅读(30) 评论(0) 推荐(0)
摘要:原题链接 题解 阅读全文
posted @ 2024-08-27 19:28 纯粹的 阅读(18) 评论(0) 推荐(0)
摘要:原题链接 题解 首先是朴素解法,每次遍历 \(n\) 然后查看 每个数的平方根是否是其前缀 时间复杂度 \(O(T\cdot n\cdot \log n)\) 这里有两个数,一个是 \(x\),即一个整数,一个是 \(y\),是 \(x\) 的平方根,因此我们可以换一个视角. 统计对于每一个整数 \ 阅读全文
posted @ 2024-08-22 05:11 纯粹的 阅读(20) 评论(0) 推荐(0)
摘要:原题链接 题意 对于有相同颜色传送门的城市 \(i,j\),可以花 \(|i-j|\) 的代价从 \(i\to j\) 或 \(j \to i\) 问从城市 \(x\to y\) 的最小代价,或者报告无法到达 分析 对于无法到达的情况,很简单,用并查集维护即可 而对于可以到达的情况,我们发现,两座城 阅读全文
posted @ 2024-08-21 04:53 纯粹的 阅读(116) 评论(0) 推荐(0)
摘要:原题链接 题解 什么情况下,答案为 -1 ? --两座城市没有任何直接或间接的传送门相连 所以如果我们把所有能通过传送门互相到达的城市放入一个集合,那么输出 -1 代表这两个城市不在一个集合里 不能相互到达的问题解决了,能相互到达的城市,cost 是多少? 阅读全文
posted @ 2024-08-20 22:01 纯粹的 阅读(23) 评论(0) 推荐(0)
摘要:原题链接 题意 有两个数 \(a,b\) 每次可以拿走其中一个数的若干个质因子,请问恰好 \(k\) 次操作后能否使 \(a=b\) 分析 假设 \(a,b\) 最后到达的是 \(c\) ,那么 \(\frac{a}{c}\) 的质因子个数加上 \(\frac{b}{c}\) 的质因子个数一定大于等 阅读全文
posted @ 2024-08-15 22:29 纯粹的 阅读(26) 评论(0) 推荐(0)
摘要:原题链接 这个题解写的很好 阅读全文
posted @ 2024-08-15 21:13 纯粹的 阅读(17) 评论(0) 推荐(0)
摘要:原题链接 题解 方法一: 双重循环, \(O(n^2)\) 方法二: 顺序遍历 \(i\),然后查找目前所有比 \(a_i\) 小的数,这是一个比较经典的树状数组的运用 时间复杂度 \(P(n\log A)\) 考虑优化,由于 \(A\) 可以达到 \(1e8\) ,而 \(n\) 只有 \(4e5 阅读全文
posted @ 2024-08-15 20:25 纯粹的 阅读(25) 评论(0) 推荐(0)
摘要:原题链接 题解 对于 \(a_i,b_i\),如果存在一个 \(j\),使得 \(a_j\in[a_i,b_i],b_j\notin [a_i,b_i]\),则存在交叉点 即对于 \([a_i,b_i]\) 这一匹配,其内部的点也必然一一匹配,否则存在一个匹配点在外面,会导致交叉 有点像括号匹配,我 阅读全文
posted @ 2024-08-15 20:00 纯粹的 阅读(19) 评论(0) 推荐(0)
摘要:原题链接 题解 1.暴力想法:维护n个集合,每次合并,遍历两个集合,最坏时间复杂度 \(O(q\cdot n\cdot \log n)\) 2.优化想法:两个集合合并后,我们只需要查询大集合的大小,因此,我们可以只遍历两个集合中较小的那个 然后莫名发现竟然过了,我们上网查了一下,发现这种方法叫做启发 阅读全文
posted @ 2024-08-13 21:25 纯粹的 阅读(22) 评论(0) 推荐(0)
摘要:原题链接 题解 根据哥德巴赫猜想,任意大于2的偶数都可以表示为两个质数的和 因此,对于大于二的偶数,总有办法拆成两个质数,也就是只需要交两元钱 如果是质数,只用交一元钱 如果一个数减二后是质数,也只需要交两元 否则交三元 code #include<bits/stdc++.h> using name 阅读全文
posted @ 2024-08-13 20:38 纯粹的 阅读(23) 评论(0) 推荐(0)
摘要:原题链接 题解 如果在升区间内包裹降区间,那么这个降区间是不合法的 如果两个升区间有重叠,那么这两个升区间将合并成一个大的升区间 这种合并的操作让我们想到了并查集,我们用并查集维护升区间,如果一个降区间内的点不属于一个集合,代表不存在一个升区间包裹了这个降区间 yes or no的问题解决了,如何构 阅读全文
posted @ 2024-08-13 00:26 纯粹的 阅读(31) 评论(0) 推荐(0)
摘要:原题链接 题解 比较套路化的处理,将后半部分翻转过来乘二,查看前半部分是否有匹配的地方 阅读全文
posted @ 2024-08-12 23:46 纯粹的 阅读(19) 评论(0) 推荐(0)
摘要:原题链接 题解 分类讨论 1.如果 \(b\) 是 \(a\) 的倍数,答案为 \(b\) 2.否则,至少要经过两次转换,而 \(a\) 转换一次最少要花 \(a\) , \(b\) 转换一次最少要花费 \(b\) ,所以,如果 \(a,b\) 有公因子,那么只需要两次转换 \(a+b\) 3.否则 阅读全文
posted @ 2024-08-12 23:29 纯粹的 阅读(39) 评论(0) 推荐(0)
摘要:原题链接 题解 方法1.遍历所有子集,查看是否合法 \(O(2^n\cdot n)\) 方法2:观察到 \(a_i\leq 70\) ,而七十内的质数有19个,可以状态压缩dp code 阅读全文
posted @ 2024-08-12 15:10 纯粹的 阅读(14) 评论(0) 推荐(0)
摘要:原题链接 题解 方法1: 每次询问,每次遍历 \(O(q\cdot n\cdot \log n)\) 方法二:利用大随机数代表每个数,异或哈希代表每个数出现的状态 \(O(q+n\cdot\log n)\) code #include<bits/stdc++.h> using namespace s 阅读全文
posted @ 2024-08-12 00:06 纯粹的 阅读(31) 评论(0) 推荐(1)
摘要:原题链接 题解 多想几种暴力 1.遍历所有数对: \(O(n^2)\) 2.求有多少数对其乘积为平方数 \(\to\) 求有多少平方数能被数对乘积: \(O(n^2)\) 3.如果两个数的乘积为平方数,代表他们的质因数,要么都是奇数,要么都是偶数 : \(O(?)\) 4.如果 \(a \times 阅读全文
posted @ 2024-08-11 22:53 纯粹的 阅读(39) 评论(0) 推荐(0)
摘要:原题链接 题解 比较套路性的题 由于 \(k\geq 10\) ,所以我们可以建立分层图,第 \(i\) 层的点代表使用 \(i-1\) 次免费航线后到达该点的最小花费 阅读全文
posted @ 2024-08-11 22:02 纯粹的 阅读(14) 评论(0) 推荐(0)
摘要:原题链接 分析 很逆天的一道题 设 \(dp[i][j]\) 为到达第 \(i\) 个点的时刻 \(t\) 且满足 \(t\mod k=j\) 的最小 \(t\) 则有答案为 \(dp[n][0]\) 更新也很简单,设当前点为 \(u\),当前时间为 \(t\) 需要遍历的下一个点 \(v\),则有 阅读全文
posted @ 2024-08-11 20:28 纯粹的 阅读(274) 评论(0) 推荐(0)
摘要:原题链接 题解 暴力想法: 每次枚举每次查询 \(O(q\cdot n)\) 进阶想法:对查询按 \(r\) 排序,用树状数组维护 \([1,r]\) 内,该范围内每个数最后一次出现的位置 code #include<bits/stdc++.h> using namespace std; /* #d 阅读全文
posted @ 2024-08-11 17:09 纯粹的 阅读(32) 评论(0) 推荐(0)
摘要:原题链接 题解 1.题目要求我们最小化吃完食物时间的最大值,这给了我们一种二分的感觉。 2.假如给定最大值为 \(K\),那么所有 \(y\) 对应的 \(x\) 都满足 \(x\leq \lfloor \frac{K}{y} \rfloor\) 所以,我们要安排 \(x\),使得每个 \(x\) 阅读全文
posted @ 2024-08-11 16:27 纯粹的 阅读(26) 评论(0) 推荐(0)
摘要:原题链接 题解 异或就是不进位的加法,所以区间内,每一位最多只有一个一 暴力方法: 遍历每一位区间,查看异或和加和 \(O(n^3)\) 前缀和优化: 找每个右端点合法的左端点 \(O(n^2)\) 利用性质优化: 由于最多只有一个1,所以这样的左端点不会随着右端点的递增而递增 \(O(n)\) c 阅读全文
posted @ 2024-08-11 12:25 纯粹的 阅读(28) 评论(0) 推荐(0)
摘要:原题链接 题解 \(O(n^3)\) 的暴力方法: 遍历所有区间,然后找出每个区间内的最小值 \(O(n^2)\) 的暴力方法: 考虑每个点的贡献,往左扩展直至出现比其小,往右扩展直至出现比其小的 观察 \(O(n^2)\) 的暴力方法,我们发现往左扩展和往右扩展相互独立 所以我们只观察往左扩展 ” 阅读全文
posted @ 2024-08-11 12:04 纯粹的 阅读(35) 评论(0) 推荐(0)
摘要:原题链接 题解 首先,假设当前 \(s(l,r)\) 括号序列为合法序列,则有如下几种情况: \(l+1==r\) () \(match[r]==l\) (...) \(match[r]!=l\) (...)...(...) code #include<bits/stdc++.h> using na 阅读全文
posted @ 2024-08-10 19:43 纯粹的 阅读(20) 评论(0) 推荐(0)
摘要:原题链接 题解 注意数据范围,设 \(dp[x][y]\) 为x只白鼠,y只黑鼠,A先手赢的概率 则每次选取要么A赢,要么B赢,要么都没有赢进入下一轮 code #include<bits/stdc++.h> using namespace std; /* #define int long long 阅读全文
posted @ 2024-08-10 16:22 纯粹的 阅读(30) 评论(0) 推荐(0)
摘要:原题链接 分析 考虑两个点对 \((a,b),(x,y)\) 如果点对 \((a,b)\) 的路径与点对 \((x,y)\) 的路径不存在共同的点,那么此时我们交换 \(a,x\),则有点对 \((x,b),(a,y)\) 此时两个点对的路径相交,且 \(dis(x,b)+dis(a,y)\gt d 阅读全文
posted @ 2024-08-10 15:32 纯粹的 阅读(38) 评论(0) 推荐(0)
摘要:原题链接 题解 总体上来讲,就是二分 \(x\) 查询 插入 \(l-1\) 时有多少数小于等于 \(x\),查询插入 \(r\) 时有多少数小于等于 \(x\) 然后减一减,看看是不是 小于等于 \(k-1\) 我认为目前没有比ai讲的更清楚的了,请点击这里 code #include<bits/ 阅读全文
posted @ 2024-08-10 13:50 纯粹的 阅读(39) 评论(0) 推荐(0)
摘要:原题链接 题解 无论如何,首先头脑中要有一个甚至若干个暴力的方法非常重要 暴力方法1:每次查询,遍历一次怪物,每战斗 \(x\) 只怪物,等级+1,直到遍历到怪物 \(i\) 最坏时间复杂度 \(O(n\cdot q)\) 阅读全文
posted @ 2024-08-10 10:59 纯粹的 阅读(21) 评论(0) 推荐(0)
摘要:原题链接 前情提要,结合原题解区的题解 题解 先简化问题,对于一对数 \(a,b\),其中 \(a\leq b\),要使其差为 \(X\) 的操作数是多少? 分类讨论 1.如果 \(b-a==X\),操作数为 \(0\)(不操作) 2.如果 \(X\lt b-a\),操作数为 \(1\)(增加a或者 阅读全文
posted @ 2024-08-09 15:46 纯粹的 阅读(24) 评论(0) 推荐(0)
摘要:原题链接 题解 原题解区写的很详细,所以这里总结一下自己的语言 性质1.如果两个数组相等,那么两个数组的差分数组也相等 根据这个性质,原题就转换成了对数组 \(a\) 的差分数组操作(选取两个点 \(i,j\) 使 \(d[i]+1,d[j]-1\) 或者 \(d[i]-1,d[j]+1\)) 性质 阅读全文
posted @ 2024-08-09 14:21 纯粹的 阅读(25) 评论(0) 推荐(0)
摘要:原题链接 题解 建桥相当于把区间内的路合并起来,这引导我们用并查集维护 可是具体如何实现呢? 我们令桥内的所有节点的统一指向最右端点作为首领,然后对于桥内的所有小桥,每次更新完了之后往右边走一格 code class Solution { public: int fa[2000005]; int f 阅读全文
posted @ 2024-08-08 21:21 纯粹的 阅读(22) 评论(0) 推荐(0)
摘要:原题链接 题解 假如 \(b=2\),则有 \(\sqrt[2]{n}\) 个这样的数 假如 \(b=3\),则有 \(\sqrt[3]{n}\) 个这样的数 所以总共有 \(\sum_{k=2}^{log_2(n)}\sqrt{k}\) 个这样的数 考虑去重 由于 \(\sqrt[3]{n}\le 阅读全文
posted @ 2024-08-08 16:57 纯粹的 阅读(22) 评论(0) 推荐(0)
摘要:该图中,最左端的点会重复更新其周围点 \(n\) 次,有 \(n\) 条边,所以最坏 \(n^2\) 阅读全文
posted @ 2024-08-07 19:53 纯粹的 阅读(27) 评论(0) 推荐(0)
摘要:原题链接 题解 对于一段区间 \([l,r]\) 我们可以在 \(r\) 的位置查询一次,然后利用差分的思想跑到l-1再查一次 虽然这样不行,但是可以先在 \(l-1\) 的位置查询一次,然后再在 \(r\) 的位置查询一次,然后顺序遍历,每次遍历就把对应位置上的数激活,可以用树状数组 code # 阅读全文
posted @ 2024-08-07 18:56 纯粹的 阅读(72) 评论(0) 推荐(0)
摘要:原题链接 获取题意 1.只能传送一次。 2.走树边没有限制。 3.只能传送至非相邻节点 4.路径一定是如下形式: \(S\to x \to T\) 其中要么 \(x\to T\) 传送要么 \(S\to x\) 传送 \(S\to x \to y \to T\) 其中 \(x\to y\) 传送 \ 阅读全文
posted @ 2024-08-07 15:34 纯粹的 阅读(52) 评论(0) 推荐(0)
摘要:原题链接 题解 假如不是环,你会做吗? 从左到右遍历 \(i\) 第 \(i\) 棵树的放置只与前面一棵树有关,线性dp 而图一定长这样: 当第 \(n\) 棵树为 \(3\) 的时候,无论第一棵树是 \(1\) 还是 \(2\)(不能为3,因为3不会往上),都符合环的要求 \(1\) 同理 因此我 阅读全文
posted @ 2024-08-06 22:13 纯粹的 阅读(21) 评论(0) 推荐(0)
摘要:原题链接 题解 多想几个暴力 暴力1:每次询问,便对p跟随模拟 暴力2:预处理 \(dp[i][j]\) 代表 \(k=j,p=i\) 时的答案 暴力1的最坏时间复杂度: \(q\cdot n\) 其中当k,a很小的时候取到 暴力2的时间复杂度:$k\cdot n $ 发现当 \(k\geq \sq 阅读全文
posted @ 2024-08-06 15:19 纯粹的 阅读(24) 评论(0) 推荐(0)
摘要:原题链接 暴力做法 每次询问,遍历点 \(u\) 的相邻节点,打上标记,然后遍历 \(v\) 的相邻节点,查询被标记的点的数量为 \(k\),答案为 \(deg[u]+deg[v]-k\),其中 \(deg[u]\) 表示节点 \(u\) 的度数 最坏时间复杂度为 \(O(q\cdot n)\) 优 阅读全文
posted @ 2024-08-06 13:56 纯粹的 阅读(22) 评论(0) 推荐(0)
摘要:原题链接 题解 修改玫瑰 \(i\) ,对答案的影响是: 减去只有玫瑰 \(i\) 的区间,加上只有玫瑰 \(i\) 和另一个玫瑰的区间,加上 m 因此我们对每个玫瑰 \(i\) ,维护上述两个区间长度 由于每个玫瑰开花时间一样,所以我们可以用扫描线的思想,对所有区间的端点离散化排序,然后升序遍历, 阅读全文
posted @ 2024-08-05 11:53 纯粹的 阅读(49) 评论(0) 推荐(0)
摘要:原题链接 题解 很有意思的思想,一遇到括号就倒过来 code #include<bits/stdc++.h> #define ll long long #define lb long double #define lowbit(x) ((x)&(-x)) using namespace std; c 阅读全文
posted @ 2024-08-04 15:30 纯粹的 阅读(21) 评论(0) 推荐(0)
摘要:原题链接 题解 很抽象的建模,我一开始想的是韦恩图,然后韦恩图里选取 若干 个点,还要保证每个图都能选上,然后把韦恩图抽象成点,图中的点抽象成待匹配的点,然后就是二分图匹配了 code #include<bits/stdc++.h> #define ll long long #define lb l 阅读全文
posted @ 2024-08-04 12:39 纯粹的 阅读(20) 评论(0) 推荐(0)
摘要:原题链接 题解 割点的特性: 以 s 为根节点dfs,割点的dfn序小于 t 点,且在割点dfs之后 t 点才有dfn序 code #include<bits/stdc++.h> #define ll long long using namespace std; vector<ll> G[20000 阅读全文
posted @ 2024-08-04 11:17 纯粹的 阅读(35) 评论(0) 推荐(0)
摘要:原题链接 题解 如果某个半联通子图包含一个点,那么该点所在的强连通分量一定可以被包含进来,因此,我们可以对强连通分量缩点 缩完点之后最长链就是答案了 维护以每个点为首的最长链大小和个数 阅读全文
posted @ 2024-08-03 22:11 纯粹的 阅读(18) 评论(0) 推荐(0)
摘要:原题链接 题解 题目目的:建立一个最小生成树 那么直接按边权排序后合并就行了 啊!!!! 阅读全文
posted @ 2024-08-03 19:27 纯粹的 阅读(29) 评论(0) 推荐(0)
摘要:原题链接 题解 优秀博客 朴素贪心: 每次找一条路,易得一条路的最大流量为路径上的最小权值,因此多次bfs遍历找合法路径,然后dfs更新路径上的权值 缺点请看上面的优秀博客 因此建立反向边的作用,有点类似于二分匹配:这条路径的部分流量由我负责,现在你去负责其他路径 第一次学,还是有很多地方不懂 co 阅读全文
posted @ 2024-08-03 14:16 纯粹的 阅读(16) 评论(0) 推荐(0)
摘要:原题链接 题解 往无向图中添加至少几条边,使得图中包含奇数环? 注意是要添加少边,而不是使环小 讨论 1.0条 当且仅当原图中存在奇环,方案数为0 用bfs染色判断,即对于一个环,bfs一定会绕一圈该环,然后黑白染色判断奇偶即可 2.一条 当且仅当存在一连通图大小大于等于3 对于该连通图内,对方案数 阅读全文
posted @ 2024-08-01 20:44 纯粹的 阅读(23) 评论(0) 推荐(0)