Loading

摘要: 思路 与 P9749 [CSP-J 2023] 公路 颇为类似。 很显然的贪心:要在油费少的加油站加更多油。 模拟驾驶顺序:从 \(0\) 点出发,寻找油费低的加油站。如果能开到一个油费比当前点还低的站,那就加到刚好开到那一站的油,后面的路程用新加油站的油一定更优;如果开不到,那就找一个能开到的油费 阅读全文
posted @ 2025-12-12 23:38 Seqfrel 阅读(9) 评论(0) 推荐(0)
摘要: 题意分析 这个题面比较抽象。 简单来说就是有 \(n\) 个病毒和 \(n\) 个细胞,病毒 \(i\) 开始都在细胞 \(j\) 里面。每个细胞都有针对每个病毒的易感染程度,病毒可以攻击其他细胞,如果目标细胞所存在病毒的对于目标细胞的易感程度小于攻击病毒对于目标细胞的易感染程度,那么目标细胞就会被 阅读全文
posted @ 2025-12-12 23:35 Seqfrel 阅读(8) 评论(0) 推荐(1)
摘要: 1. 题目大意 给定一个正整数 \(x\),每次可以将 \(x\) 除以两个质数的正整数次方的积,直到不能再除为止。求除完之后最小的 \(x\)。 2. 思路分析&代码实现 ① 分解质因数 因为要将 \(x\) 除以质数的正整数次方,所以需要把 \(x\) 分解质因数。 分解质因数的代码很好写。这里 阅读全文
posted @ 2025-12-12 23:33 Seqfrel 阅读(15) 评论(0) 推荐(0)
摘要: 题意分析 给定一个 \(n \times n\) 的矩阵 \(A\) 和正整数 \(k\),求 \(S=A^1+A^2+\cdots+A^k\)。 解题思路 求 \(A^n\) 要用到矩阵快速幂。但是 \(k \le 10^9\),求 \(k\) 个幂会超时,所以需要用到分治的策略。 我们知道,矩阵 阅读全文
posted @ 2025-12-12 23:29 Seqfrel 阅读(5) 评论(0) 推荐(0)
摘要: 题目大意 给定一个递推式 \(a_n=x \times a_{n-1}+ y \times a_{n-2}(n≥3)\),求 \(\sum_{i=1}^na_i^2\)。 解题思路 递推通常是 \(O(n)\) 解法,但是本题 \(1 \le n \le 10^{18}\) 且 \(T=30000\ 阅读全文
posted @ 2025-12-12 23:28 Seqfrel 阅读(19) 评论(0) 推荐(0)
摘要: 最近公共祖先(LCA) Luogu P3379【模板】最近公共祖先(LCA) 倍增能在 \(\log(n)\) 解决从 \(u\) 到 \(v\) 的路线问题。 我们往上跳,\(f[i][j]\) 表示 \(i\) 节点往上跳 \(2^j\) 步。 \(f[i][0]=father[i]\) \(f 阅读全文
posted @ 2025-12-12 23:26 Seqfrel 阅读(20) 评论(0) 推荐(0)
摘要: 求区间最值:RMQ问题。 用ST表求解。 递推公式: \(K=(\log (R-L+1) \div \log (2))\) 直接在 cmath 中调用,cmath 中是以 \(10\) 为底,所以用到以上换底公式。 也可以预处理 \(\log\) 优化常数复杂度。 log[i]=log[i/2]+1 阅读全文
posted @ 2025-12-12 23:26 Seqfrel 阅读(28) 评论(0) 推荐(0)
摘要: 矩阵快速幂 矩阵乘法 + 快速幂 矩阵加法: 定义矩阵 \(C=A+B\)。 \(C_{i,j}=A_{i,j}+B_{i,j}\)。 矩阵乘法: 计算两个矩阵的乘法。\(n \times m\) 阶的矩阵 \(A\) 乘以 \(m \times k\) 阶的矩阵 \(B\) 得到的矩阵 \(C\) 阅读全文
posted @ 2025-12-12 23:24 Seqfrel 阅读(32) 评论(0) 推荐(0)
摘要: 龟速乘与快速幂 n&1: 取n的二进制最末位 n>>1: 右移一位,相当于去掉n的二进制最末尾(相当于n/2) n<<1 相当于n*2 if(n%2==1) 可以写成if((n&1)==1)或if(n&1) 位运算比 +-*/ 更快 龟速乘 求 $ (a\times b) \bmod p$。 例: 阅读全文
posted @ 2025-12-12 23:20 Seqfrel 阅读(3) 评论(0) 推荐(0)
摘要: 二分分为二分查找和二分答案。 二分查找 每次查询或询问的结果: 找到,结束; 找不到,答案所在范围缩小一半。如果小了就查找大的那一半,如果大了就查找小的那一半。 查找次数为对数级。 前提:序列有序。 二分查找可以解决的问题: 大于等于 \(x\) 的最小值是哪个?大于等于 \(x\) 的有多少个? 阅读全文
posted @ 2025-12-12 23:17 Seqfrel 阅读(34) 评论(0) 推荐(0)
摘要: 题目大意 给定一个矩阵,每次选择一个比它所有“邻居”都大的项,不断减一直到它不满足以上条件,求修改完后的矩阵。 “邻居”的定义是左右相邻或上下相邻,不包括对角线的情况。 解题思路 我们首先要明白一点,别看题目中讲要找坐标小的先修改,实际上修改顺序是不重要的。 而要明白这一点我们又要明白另一点,那就是 阅读全文
posted @ 2025-12-12 23:09 Seqfrel 阅读(9) 评论(0) 推荐(0)
摘要: 题目大意 有 \(n\) 天 \(m\) 个任务,每个任务需要一台机器用一天时间完成,每个任务最多推迟 \(d\) 天完成。给定 \(m\) 个任务提交的时间,求最少需要几台机器才能满足所有任务。 解题思路 解决此题,需要想清楚两个性质: 性质一:所需机器数量是单调的 这个性质不难理解,如果 \(x 阅读全文
posted @ 2025-12-12 23:08 Seqfrel 阅读(3) 评论(0) 推荐(0)
摘要: 一、强连通分量 强连通:有向图 G 强连通是指 G 中任意两个节点相通。 强连通分量(Strongly Connected Componets, SCC),是指一个有向图中的强连通子图。 用处:可以把 SCC 看作一个点,构造新图解决问题。 二、Tarjan Tarjan 是一种用来求强连通分量的算 阅读全文
posted @ 2025-12-12 23:07 Seqfrel 阅读(48) 评论(0) 推荐(0)
摘要: 该算法可以离线求最近公共祖先,大幅节省时间复杂度(\(O(n \log n)\)->\(O(n+m)\))。 缺点是如果题目要求强制在线那么就用不了了。 具体实现是这样的:把原树用双向边存起来,然后把每一对要求 LCA 的两个点在一个新图上存一个双向边(称为查询边)。 对原图进行一次 DFS 遍历, 阅读全文
posted @ 2025-12-12 23:05 Seqfrel 阅读(16) 评论(0) 推荐(0)
摘要: 1. 海拔预处理 因为小 A 和小 B 开车涉及选择最短距离的问题,所以我们需要把他们两个开到每个城市要选择的最短距离预处理出来。 朴素做法用 \(O(n^2)\) 打擂台求出最近和第二近的城市,但显然过不了。我们可以这么做: 读入时存储每个城市的高度和编号。 读入完成后按照高度排序。此时与排序后的 阅读全文
posted @ 2025-12-12 23:03 Seqfrel 阅读(25) 评论(0) 推荐(0)
摘要: 该算法可以两次 DFS 求出以每个节点为根所得树的深度。 算法实现 朴素做法:枚举每个节点作根的情况进行 DFS,\(O(n^2)\)。 要想优化,就必须避免改变树的结构。我们发现,子树 \(u\) 的节点在以 \(u\) 为根的大树中到根 \(u\) 的距离都减少了一,其他节点因为要经过 \(u\ 阅读全文
posted @ 2025-12-12 23:02 Seqfrel 阅读(28) 评论(0) 推荐(1)
摘要: Luogu P1896 [SCOI2005] 互不侵犯 因为一行的状态只有放与不放国王,所以可以用 \(0\) 和 \(1\) 表示,然后就可以把一行的状态压缩成一个 \(9\) 位二进制数表示,状态个数为 \(2^9\)。随后定义状态 \(f(i,j,s)\) 表示前 \(i\) 行放 \(j\) 阅读全文
posted @ 2025-12-12 23:00 Seqfrel 阅读(39) 评论(0) 推荐(1)
摘要: 思路分析 1. 判断负环 这个部分相对来说比较简单,可以用经典的 SPFA 算法判断负环,时间复杂度 \(O(nm)\)。这里给出一种效率更高的负环判断方法,使用 DFS 判断负环。遍历这个图,进行松弛技术,如果一个节点被访问第二次,那么就说明存在负环,直接退出。时间复杂度 \(O(n)\)。 vo 阅读全文
posted @ 2025-12-12 22:59 Seqfrel 阅读(37) 评论(0) 推荐(0)
摘要: 一、介绍和功能 线段树是用于维护区间信息的一种常用数据结构,又称区间树。 线段树可以在低复杂度内实现单点查询、单点修改、区间查询(区间求和、求最值等)、区间修改等操作。 一般可以使用线段树的题,序列长度 \(n\) 和修改次数 \(m\) 的范围在几倍 \(10^5\) 左右。 二、构造和性质 线段 阅读全文
posted @ 2025-12-12 22:56 Seqfrel 阅读(21) 评论(0) 推荐(0)
摘要: 一、最大公约数,欧几里得算法,GCD 这一部分非常简单,普及-难度的算法。 首先是一段初学者都会的递归求 GCD 的辗转相除法: int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a%b); } 这也被称为欧几里得算法。 这里重点探 阅读全文
posted @ 2025-12-12 22:53 Seqfrel 阅读(41) 评论(0) 推荐(0)
摘要: 二分图:可以把所有点分为两个点集,相同点集里的点之间没有边的无向图。 当且仅当一个无向图中有奇环存在时,这个图不是二分图。 第一部分:二分图判定 - 染色法 我们可以把图中的点染成两种颜色,白色是一个点集,黑色是另一个点集。 染色的规则:因为相同点集里的点之间没有边,所以每个节点的颜色必须与父节点不 阅读全文
posted @ 2025-12-12 22:50 Seqfrel 阅读(36) 评论(0) 推荐(0)
摘要: 一种基本技巧。 思想 离散化的目的:把无限空间中的有限个体映射到有限空间中去,以此提高算法的时空效率。 具体实现方法:在不改变数据相对大小的前提下对数据进行缩小。 例如: 离散化前:192329,999999,0 离散化后:2,3,1 离散化前:{100,200},{200000,50000000} 阅读全文
posted @ 2025-12-12 22:49 Seqfrel 阅读(29) 评论(0) 推荐(0)
摘要: A - Cut 题意分析 给定 \(N\) 个整数,要求进行 \(K\) 次操作,每次将数列末尾的数放到最前面,输出操作过后的数列。 解题思路 虽然题目中说的是栈,但其实一眼就能看出来是队列。 每次把末尾的数放到最前面就对应了一个从队尾出队和从队头入队的操作。 不过这样比较绕,因为一般的队列都是队头 阅读全文
posted @ 2025-12-12 22:49 Seqfrel 阅读(25) 评论(0) 推荐(0)
摘要: 题目大意 给定一个无向树。有两个扫雪机可以任意选择出发终止点,可以走回头路。求两个扫雪机遍历整个树所需的最短路程。 解题思路 不妨先考虑只有一个扫雪机的情况。 我们知道,在无向树上从任意一个结点出发,将所有的边经过两遍,串成一个环,最终都能回到那个结点。就像这样: 这也就是这一个扫雪机遍历整个树的最 阅读全文
posted @ 2025-12-12 22:44 Seqfrel 阅读(10) 评论(0) 推荐(0)
摘要: 题意 求一个点,使得数轴上所有点到一个点的距离加上其权值的最大值最小。 思路 三分 当选定点在所有点左侧时,距离最大值较大。 向右移动该点,最大值减小。 在所有点右侧时,最大值也较大。 由此可推测该最大值是一开口向上的单峰函数,在中间某个点取最小。 再思考发现每个点对于选定点的距离加权值函数都是一个 阅读全文
posted @ 2025-12-12 22:43 Seqfrel 阅读(33) 评论(0) 推荐(0)
摘要: 题意 题面花里胡哨。直接看到棋盘那一段,告诉我们 \(K=N\times M\),也就是按给定递推式算出前 \(N\times M\) 项,按规定交换 \(1\sim K\) 的递增序列,最后再按顺序填入 \(N \times M\) 的数表。在上面找排序后字典序最小的路径序列。 思路 前半部分直接 阅读全文
posted @ 2025-12-12 22:41 Seqfrel 阅读(9) 评论(0) 推荐(0)
摘要: 题意 统计:从串 \(A\) 中提取 \(k\) 个不相交子串,按前后顺序首尾相接可得到串 \(B\) 的方案数。子串的位置不同算作不同方案。答案对 \(10^9+7\) 取模。 思路 遇到这种“答案可能很大”的统计方案数的题多半是 DP。 设计状态 在这道题中,需要在 \(A\) 中匹配 \(B\ 阅读全文
posted @ 2025-12-12 22:41 Seqfrel 阅读(12) 评论(0) 推荐(0)
摘要: 题意 给定一个仅包含与或的中缀表达式,在每一个数值位填 0 或 1,求有多少种填法使得表达式的值为 0。 思路 统计方案数,首先考虑 DP。要想得知表达式的值,就要得知参与最后运算的两个值。这启示我们将中缀转后缀,建表达式树。 定义 \(f_{u,0}\) 为以 \(u\) 为根的子树的表达式为 \ 阅读全文
posted @ 2025-12-12 22:40 Seqfrel 阅读(12) 评论(0) 推荐(0)
摘要: 思路 考虑转化为背包问题。将每个玩家视为一组物品,每个城堡的出兵视为一个物品,因为如果要占领该城堡,就要出严格大于对手两倍的兵,所以每个物品的重量为 \(2\times a_i+1\),每个物品的价值为城堡编号。这样题目就转化为了分组背包问题。 但此题不同组的物品并不是相互独立的,如果选取了重量为 阅读全文
posted @ 2025-12-12 22:39 Seqfrel 阅读(14) 评论(0) 推荐(0)
摘要: 思路 容易发现题目给出了一张 \(n\) 个点 \(n\) 条边的有向图,联想到基环树。又因为每个点出度均为一所以是内向基环树。 考虑到题目中的“拜访”类似于拓扑排序,冲突仅存在于环上,所以总边权和去掉环上最小的一条边即为答案。但题目不保证联通,所以其实是基环森林,每棵树上都有一个环。全部去掉即可。 阅读全文
posted @ 2025-12-12 22:38 Seqfrel 阅读(27) 评论(0) 推荐(0)
摘要: 题意 数轴上有 \(n\) 个整点,求最多删除多少个整点,使得 \(k\) 个条件依然满足。每个条件形如:在 \([l_i,r_i]\) 范围内至少存在 \(t_i\) 个整点。 思路 删点操作有悖于满足条件的逻辑,因此正难则反,考虑最少保留多少个点使得所有条件被满足。为了使点数最少,应使每个点贡献 阅读全文
posted @ 2025-12-12 22:35 Seqfrel 阅读(26) 评论(0) 推荐(1)
摘要: 思路 动态维护区间信息,考虑线段树。但每次查询的值不固定,如要使用线段树维护,则需针对每个查询的值单独建一棵树,时空复杂度均不可接受。因此考虑分块。 区间加问题类比线段树,只需为每个全包含于区间的块打上懒标记,两端的块暴力修改即可。重点考虑小于 \(x=c^2\) 的数字个数。这类问题容易想到二分, 阅读全文
posted @ 2025-12-12 22:34 Seqfrel 阅读(5) 评论(0) 推荐(1)
摘要: 明明是很容易的题,模拟赛却没注意到。 题意 略。 思路 不妨从 \(5\) 下手。一数仅当最后一位是 \(0\) 或 \(5\) 时,该数才是 \(5\) 的倍数。因此如果第 \(i\) 位是 \(0\) 或 \(5\),所有最后一位是 \(5\) 的连续子串都满足条件,子串数量 \(+i\)。 同 阅读全文
posted @ 2025-12-12 22:32 Seqfrel 阅读(18) 评论(0) 推荐(1)
摘要: 思路难以发现但易于理解的题。 题意 从 \(N\times M\) 的网格中,找尽可能多的路径,要求: 起点在左上角,终点在右下角,路径只能向右和向下延伸 两条路径不能相互穿过 相邻两条路径之间必须包含有洞 求出路径数量的最大值 \(K\)。 思路 题面为路径定义了“编号”,描述不是很好理解,所以画 阅读全文
posted @ 2025-12-12 22:29 Seqfrel 阅读(10) 评论(0) 推荐(1)
摘要: 思路 对整串反异或有些唬人。但进行反异或操作的时刻是任意的,操作后依然可以往串首尾加数。也就是说,我们可以把问题转化成:一个长度为 \(|T|\) 的 01 串 \(S\),从中选取一段字串对其进行反异或操作使其变为 \(T\),求串 \(S\) 中 1 的最少数量。 异或的定义中,1 和 1 异或 阅读全文
posted @ 2025-12-12 22:28 Seqfrel 阅读(7) 评论(0) 推荐(1)
摘要: 数据生成器: #include<iostream> #include<cstdio> #include<random> #include<chrono> using namespace std; int n; mt19937 rnd(chrono::steady_clock::now().time_ 阅读全文
posted @ 2025-12-12 22:26 Seqfrel 阅读(24) 评论(0) 推荐(1)
摘要: 在 freopen 后面加: ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); 注意用 '\n' 代替 endl,不要与 scanf 和 printf 混用。 保留小数格式: cout<<fixed<<setprecision(10); 后接输 阅读全文
posted @ 2025-12-12 22:25 Seqfrel 阅读(36) 评论(0) 推荐(1)
摘要: 思路 遇事不决先排个序。注意到如果要让所有人分得的糖果重量相等,那么糖更少的人需要的大糖更多。因每人分得糖果数量确定,所以总重量越大,每人需要的大糖数量就越多。为了让大糖总数最多,不妨给糖最少的人全分大糖,此时糖总重量就取到了上界。我们有了糖总重量,可以用二元一次方程组解出每个人需要的大糖数量,统计 阅读全文
posted @ 2025-12-12 22:23 Seqfrel 阅读(21) 评论(0) 推荐(1)
摘要: 思路 考虑什么情况下 \(S\) 为最终 \(R\) 的前缀。第一种情况, \(S\) 的长度小于一次翻转后 \(R\) 的长度,这时候我们就需要找包含末尾的回文串,相当于初始 \(R\) 在此串的回文中心处截止,一次翻转后,\(S\) 只截取到初始 \(R\) 的一部分回文。第二种情况,\(S\) 阅读全文
posted @ 2025-12-12 22:21 Seqfrel 阅读(15) 评论(0) 推荐(1)
摘要: 思路 首先不难想到,如果要取一个糖果两次,为了使花费最小,我们一定要取 \(x_i+y_i\) 最小的糖果。 然后是取一次的糖果,显然要取 \(x_i\) 最小的前若干个,所以先对 \(x_i\) 排序。 接着就有两种处理思路: 第一种,可以观察到花费随糖果数量增加而增加,因此我们可以二分糖果数量 阅读全文
posted @ 2025-12-12 22:19 Seqfrel 阅读(16) 评论(0) 推荐(1)
摘要: Luogu P3805 【模板】manacher 解决问题:字符串中最长回文子串。 解决方法:求出字符串中每个字符作为回文串中心时最长回文串长度。 朴素做法,对于每个字符向后枚举比较,时间复杂度 \(O(n^2)\)。 Manacher 算法提供一种优化策略,使得相同的回文串不被重复计算,时间复杂度 阅读全文
posted @ 2025-12-12 22:18 Seqfrel 阅读(6) 评论(0) 推荐(1)
摘要: CSP-J 2025 题解 拼数(number) 思路 维护一个桶,统计字符串中各数字的出现次数。按数字大小倒序输出对应数量个数字即可。 注意前导零的情况。 实现 #include<bits/stdc++.h> using namespace std; const int N=1e6+10; cha 阅读全文
posted @ 2025-12-12 22:13 Seqfrel 阅读(25) 评论(0) 推荐(1)