自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 二分图学习笔记

使用题单:二分图 - 从入门到入土。对于一个图,如果能够把它的点集恰好分成两个部分,使得这第一个部分里面的点两两不连边,第二个部分里面的点也两两不连边,则该图是二分图。或者说每一条边都横跨了两个集合。举个例子:这个图是二分图,因为我们可以将它分成 {1,3,5,7}\{1,3,5,7\}{1,3,5,7} 和 {2,4,6}\{2,4,6\}{2,4,6} 两个点集:但是这个图:可以发现这个图无论如何也无法划分点集,所以这个图不是二分图。还是给一下不说人话的形式化定义:注意,二分图可以不是连通图。很容易想到

2025-04-02 08:34:06 1052

原创 差分约束学习笔记

如果一个有n个变量x1​x2​,⋅⋅⋅,xn​和m个约束条件(也是不等式)和**m个常量w1​w2​,⋅⋅⋅,wm​xi​−xj​≤wk​1≤ij≤n1≤k≤m差分约束系统。**这个名字的由来是这样的:“差分”代表的是每一个约束条件里面都是做差的形式,“约束”代表的是每一个差都有一个最大值上界作为约束,“系统”字面意思。有如下几个问题:1.有没有解2.求一组解3.一组变量(a−b)的极值。

2025-04-02 08:33:26 448

原创 口胡的,一些结论的证明

而在叶子节点之间加边顺便还包含了父亲节点,一旦加了边,就会添加一个环,那么这个环上的边,都不可能成为桥了,因此考虑在叶节点之间加边即可。但是,点双连通分量指的是极大联通分量,所以这几个合起来的分量才是真正的点双连通分量。但是,点双连通分量指的是极大联通分量,所以这几个合起来的分量才是真正的点双连通分量。那么这几个分量合起来也应该合法,因为去掉一个点,而且这几个都是合法的,那么去掉之后一定联通。那么这几个分量合起来也应该合法,因为去掉一个点,而且这几个都是合法的,那么去掉之后一定联通。

2025-03-22 21:15:34 1004

原创 莫队算法学习笔记

莫队算法的发明者是一个叫做 莫涛 的人,所以被称为莫队算法,简称。英语。

2025-02-23 09:40:21 864

原创 信息学竞赛练习方法:从 Codeforces 评级 1000 到 2000

(另外,抱歉我的英语水平有限。AtCoder 有 ABC(AtCoder 初学者竞赛)、ARC(AtCoder 常规竞赛)和 AGC(AtCoder 重大竞赛),但在这篇博客中,我只介绍 ABC 和 ARC。ABC 的题目分别是 ABC - A、ABC - B、ABC - C、ABC - D,ARC 的题目分别是 ARC - C、ARC - D、ARC - E、ARC - F。在每场竞赛中,ABC - C 和 ARC - C 是同一难度的题目,ABC - D 和 ARC - D 也是同一难度的题目。

2025-02-21 15:48:04 574

原创 三分算法学习笔记

二分算法,顾名思义,就是每一次将区间分成 2 个一样的区间。三分算法,同样顾名思义,就是每一次将区间分成 3 个一样的区间。三分算法主要用来求解一些关于单调函数的问题。 而且考试中有一定的几率考到。二分算法主要用来求一些简单的最值问题,例如在一些一次函数上。三分算法主要用来求一些凹函数和凸函数的最值问题,典型地,在一些二次函数上,甚至是高次函数。凸函数的定义:学术描述:对此函数进行二次求导,最后的值恒 <0<0<0。人话描述:先上升后下降的函数。凹函数的定义就是先下降后上升的函数。当然,函数的形状各种各样,

2025-02-15 10:03:18 555

原创 关于费马小定理的证明

关于费马小定理的证明。

2025-02-09 08:27:20 502

原创 (树形)高级数据结构学习笔记

本文介绍了线段树以及其各种衍生数据结构即算法。

2025-02-08 09:58:08 941

原创 Tourists

题解

2025-04-04 14:54:18 107

原创 圆方树学习笔记

首先,圆方树和差不多,,然后在上面跑各种乱七八糟的算法:LCA、DP、甚至树链剖分……但是,圆方树和 Kruskal 重构树所基于的东西不同:Kruskal 重构树是基于的,而圆方树是基于的不会 Kruskal 重构树?不用担心,你以后会学到,这里也不会讲 Kruskal 重构树。不会点双连通分量?不用担心,你可以见我的其他文章,但是你确实一定得会。圆方树,顾名思义,包含两种点,一个是圆点,另一个是方点。圆点代表原图中的点,方点代表原图中的点双连通分量。

2025-04-04 11:17:08 757

原创 CF2041C Cube

对应的所有情况都存起来,到时候直接取即可。根据常见的套路,考虑将三维中的两维状压。个点(从题面可以看出每一层仅可能选。在这种实现方法下是跑不满的,因为。固定的情况下,可能的种数正好是。首先有一种朴素的思路:直接枚举。我们考虑优化枚举范围:发现。,然后枚举这一层选择的点。是数一个数二进制下的。实际上取不到那么多,

2025-03-25 14:25:12 625

原创 P4768死亡报告

前情提要:这道题我做了一个下午,知道傍晚才做完。中间还红温了若干次。

2025-03-16 09:35:12 904

原创 题解:CF1276B Two Fairs

左边的点外其他所有的点。于是可以做一遍搜索,然后再算出来。所以根据乘法原理得知答案为。就不搜了,一定会而且只会搜到除。两种结果算出来一乘就是答案。右边的点才可行,因为。右边的点的个数就是从。搜,一样方法算出来。

2025-03-16 09:32:07 666

原创 AT_abc271_e [ABC271E] Subsequence Path

因为要按顺序的匹配,所以我们考虑按顺序的转移。我们思考 Bellman_Ford 算法的本质,发现它就是枚举已经走的步数,对于每条边执行松弛操作,也就是枚举每条边,然后看边的起点能否更新终点的最短路长度值。我们回归某些最短路算法的本质,虽然可以不采用最短路算法,但是我们可以借鉴它的思想。因为绝大多数的最短路算法,本质上都是 dp 发展过来的。中的边执行松弛操作,于是这道题就被做完了,可以感性理解一下,这种方法一定是正确的。已经匹配到了哪个位置,比较麻烦,所以我们这道题不采用最短路的方法。

2025-03-16 09:30:46 828

原创 题解:CF301D Yaroslav and Divisors

对于每次询问,答案显然就是包含的区间个数。所以我们可以采用离线做法,先把询问的区间加入然后排一个序,最后就是用树状数组维护区间包含的老套路。所以我们考虑用调和级数进行优化。由于给出的数列是一个排列,所以里面每一项都是不同而且。就可以用调和级数预处理出来所有的倍数关系,这样会形成一个个的区间。的数据范围,这道题很有可能就是用调和级数进行优化的。一看到“倍数关系”的字样,根据平日写题的直觉,以及。

2025-03-16 09:30:13 199

原创 题解:CF301D Yaroslav and Divisors

对于每次询问,答案显然就是包含的区间个数。所以我们可以采用离线做法,先把询问的区间加入然后排一个序,最后就是用树状数组维护区间包含的老套路。所以我们考虑用调和级数进行优化。由于给出的数列是一个排列,所以里面每一项都是不同而且。就可以用调和级数预处理出来所有的倍数关系,这样会形成一个个的区间。的数据范围,这道题很有可能就是用调和级数进行优化的。一看到“倍数关系”的字样,根据平日写题的直觉,以及。

2025-03-16 09:28:09 299

原创 题解:CF1896E Permutation Sorting

由于肯定是小的区间先走完,所以当一个区间走完的时候,被它包含的区间一定都走完了,所以就会造成若干次“加速”,也就是说如果在走这个区间的任意时刻,这个区间的子区间同时走完了,那么就会使得那个子区间的左端点满足要求了,当走到左端点时,就会自动跳过,也就是会减少一次的跳跃,跳跃的次数显然就是包含其他区间的个数。可以发现,到达的次序是有“优先级”的,首先是步数最少的,然后是步数第二少的……这就形成了区间的包含关系(步数大的肯定包含步数小的),所以我们考虑从计算区间走完的个数来统计答案。表示左端点和右端点,

2025-03-16 09:26:59 309

原创 题解:AT_abc224_e [ABC224E] Integers on Grid

由最长路的值就可以想到可以无实物建图,那么此时 DAG 上的 DP 就变成了普通的 DP。观察题目可以发现这类似一个图论的问题,我们可以把可以到达的位置对建有向边,这显然是一个 DAG,所以直接跑拓扑排序最长路即可。一定可以到达更大的格子,也就优化了建边,这里可以使用 set 来记录那个格子。的时候,可能会取到和它相同的值(因为我们这里设最长路值更大的更优),这样我们判断一下就可以了。开始的路径的最长长度,为了保证无后效性,一开始要把所有格子的。可以到达的格子全部连上,只需要连上最小的比它大的格子。

2025-03-16 09:26:12 438

原创 题解:CF1156D 0-1-Tree

的所有 dp 的值,然后再跑换根 dp,这个时候已经和前面提到的搜索没多大关系了。由于这种树上路径的问题若假定一个点为根会更加的好求,所以我们可以枚举。然后的换根 dp 就是这样的反着来,最后答案显然就是对于每一个根节点。的原因是需要根据目前的路径最大权值选择可以走过的边,例如。一种换根 dp 的做法,但是是一种和题解区不同的做法。前面的树形 dp 的转移方程很好想,就是对于每一个。为根节点,再去找有多少个满足条件的。分别表示目前的点的编号。下面这个值可以是不同的。可以到达的点的个数。

2025-03-16 09:25:16 634

原创 ABC372F

如果是循环右移的话就好办了,这一步实际上不需要动原来的数组,只需要记录一个右移的偏移量。这就是第一部分的表示。(当然,并不需要真正的执行,我们可以使用。至于如何第二部分的表示,由于最后要使用滚动数组,根据一番推算可以发现。但是要处理这个过程则需要使用很多的数学计算。即可(不要在意我这个名称),对于每一个下标。由于最后还需要搞一个滚动数组,所以还需要。赛后 20 分钟做出来这道题,糖丸了。部分可以优化掉,因为这就相当于一个。的,很明显需要更加深入的优化。数组,就可以把状态优化掉一维。,这样就可以表示了。

2025-03-16 09:23:37 605

原创 AT_abc371_f [ABC371F] Takahashi in Narrow Road

找到影响的人那部分,不就是二分可以解决的吗?我们可以使用线段树当中的区间和查询,答案就是等差数列的各项和减去区间和即可。所影响的人一定是拼在一起的。为了验证这个想法,可以把其他的样例也都推一下,可以发现这是正确的。那道题,那道题是加法,而这道题只是变成了赋值,主题思路是不变的。赛后20分钟做出来了 F 题,第一次切 F,写篇题解纪念一下。但是我们并不满足于这样的做法,但是这种做法让人有一股优化到。第一步:二分查找被影响到的人(容易发现是个区间)。的做法,找到影响的人(人数为。里面,注意影响的人并不包括。

2025-03-16 09:22:50 902

原创 中国剩余定理学习笔记

中国剩余定理

2025-03-16 09:15:27 988

原创 C++函数总结

在上述代码中,add 函数被重载,一个接受两个 int 类型的参数,另一个接受两个 double 类型的参数。上述代码定义了一个名为 add 的函数,它接受两个 int 类型的参数 a 和 b,并返回它们的和。在上述代码中,先对 add 函数进行了声明,然后在 main 函数中调用该函数,最后进行函数定义。函数定义由函数头和函数体组成,函数头包含返回类型、函数名和参数列表,函数体包含具体的代码实现。内联函数是一种特殊的函数,编译器会将函数体直接嵌入到调用处,减少函数调用的开销。

2025-03-16 06:25:32 235

原创 C++穷举算法总结

穷尽算法,也称为穷举算法或暴力算法,是一种通过遍历问题所有可能的解空间,逐一检查每个可能的解,以找到满足特定条件的解的方法。穷尽算法是一种简单直接的算法策略,不依赖于复杂的数学模型或优化技巧,它的核心思想是将问题的所有可能解都列举出来,然后对每个解进行检查,判断其是否满足问题的要求。综上所述,穷尽算法是一种简单直接的算法策略,但在处理大规模问题时效率较低,需要根据问题的具体情况选择合适的算法。:这里不需要额外的检查,因为每个排列都是有效的。:对于每个生成的排列,将其输出。:n 个元素的所有排列。

2025-03-04 08:27:24 345

原创 解交互题时如何规划交互流程

在竞赛中,交互题通常会有特定的交互协议,以下以一个简单的询问式交互题为例,题目要求在一个 1 - n 的整数序列中找出目标数字。评测系统会根据你的询问返回信息。通过以上不同场景的示例,你可以看到规划交互流程的关键在于明确每个阶段的任务、输入输出内容以及状态的转换,这样才能有条不紊地解决交互题。以一个简单的猜数字游戏为例,目标是让用户猜出一个 1 - 100 之间的随机数,程序需要根据用户的猜测给出提示。以一个点菜系统为例,用户可以多次点菜、修改订单、结算。

2025-03-04 08:06:32 522

原创 C++交互题是什么?如何去解交互题?

C++ 交互题是一类在程序运行过程中,需要与用户或评测系统进行数据交互的题目。与普通编程题不同,交互题不是一次性读取所有输入并输出结果,而是在运行时动态地接收输入、给出输出,就像人和人对话一样有来有往。比如常见的场景有用户输入数据,程序根据输入进行计算并返回结果;或是程序向评测系统询问某些信息,再根据反馈继续执行。

2025-03-04 07:45:06 578

原创 c++ 文件及基本读写总结

在 C++ 中,文件操作是非常重要的一部分,主要用于将数据存储到文件中,或者从文件中读取数据。C++ 标准库提供了fstream头文件,其中包含了用于文件操作的类,主要有ifstream(用于输入文件流,即从文件读取数据)、ofstream(用于输出文件流,即向文件写入数据)和fstream(既可以用于读取也可以用于写入)。使用ifstream类可以从文件中读取数据,与使用cin从控制台读取数据类似,使用>>运算符。使用ofstream类可以将数据写入文件,与使用cout输出到控制台类似,使用<<运算符。

2025-03-02 11:06:27 518

原创 C++中的位运算与逻辑运算

位运算:操作对象是整数类型的二进制位,用于对二进制位进行逐位操作。逻辑运算:操作对象主要是布尔类型,用于进行逻辑判断,具有短路特性。// 结果为truestd::cout << "逻辑或结果: " << std::boolalpha << result << std::endl;return 0;3. 逻辑非(!逻辑非运算符是单目运算符,它会对操作数的逻辑值进行取反操作,即true变为false,false变为true。a;// 结果为false。

2025-03-02 10:22:35 778

原创 CF构造场+掉分场2071

CF2071总结,不是学习笔记。

2025-03-01 09:33:39 908

原创 在 Windows 系统中,可以使用以下自带工具来截图并识别图中文字

使用截图工具(Snipping Tool)和 OCR 功能使用 OneNote

2025-02-26 08:00:09 267

原创 图论学习笔记1(已骏工)

最新力作最后更新于3.13 8:18

2025-02-14 09:20:57 295

原创 C++编程时常见爆零错误

记得文件的保存格式,一旦出错直接0分。复赛中,命名规范至关重要。不管是文件夹、程序、输入输出读写文件,其名称都需与题目要求完全一致。文件目录结构也必须严格遵循题目规定。freopen一定要写对!!!一旦出错0分。比赛结束前,一定要检查调试代码是否注释掉,freopen是否关注释。Windows 如何用?正常 Windows 中用 DveC写,那为什么要操作 Liunx 虚拟机?因为担心你写的代码,在评测机里面编译不通过,所以我们才使用 Liunx 虚拟机里的 IDE编译一下,防止。

2025-02-10 11:00:05 689

原创 c++ string 总结

在 C++ 中,std::string 是标准库提供的一个用于处理字符串的类,它封装了一系列对字符串操作的方法,相比 C 风格的字符串(以 ‘\0’ 结尾的字符数组),使用起来更加方便、安全。综上所述,std::string 是 C++ 中处理字符串的强大工具,在大多数情况下推荐使用,但在对性能要求极高的场景下,可能需要考虑使用 C 风格字符串。:相比于 C 风格字符串,std::string 有一定的性能开销,因为它需要额外的内存管理和函数调用。

2025-02-10 09:20:37 368

原创 c++ 排序算法总结

选择一个基准值(pivot),将数组分为两部分,使得左边部分的元素都小于等于基准值,右边部分的元素都大于等于基准值,然后分别对左右两部分递归地进行排序。:利用堆这种数据结构,将数组构建成一个最大堆(或最小堆),然后将堆顶元素与最后一个元素交换,再对剩余元素重新调整为堆,重复这个过程直到整个数组有序。:采用分治法,将数组分成两个子数组,分别对两个子数组进行排序,然后将排好序的子数组合并成一个有序的数组。:平均和最坏情况下为 (O(n^2)),最好情况下(数据已经有序)为 (O(n))。

2025-02-10 09:00:27 933

原创 c++唯一分解定理总结

唯一分解定理是数论的基石之一,在 C++ 编程中,通过对自然数进行质因数分解,可以高效地解决许多与数论相关的问题,如计算最大公约数、最小公倍数、约数个数等。若N是合数,设 N = a x b(1 < a,b < N),由归纳假设可知,a 和 b 都能分解成质数的乘积,所以 N 也能分解成质数的乘积。这里的 “唯一” 指的是,除了质因数的排列顺序外,分解形式是唯一的。假设对于所有小于 N的自然数,都能分解成质数的乘积。,根据质数的性质逐步推导,可得出这两种分解形式实际上是相同的(除了质因数的排列顺序)。

2025-02-10 08:29:50 515

原创 c++ 素数表的埃氏筛法和线性筛法总结

具体来说,先假设所有数都是素数,然后从最小的素数 2 开始,把 2 的倍数(除 2 本身)都标记为合数;接着找到下一个未被标记的数,它就是素数,再把它的倍数标记为合数,依此类推,直到遍历完所有小于等于给定范围的数。具体做法是在遍历过程中,对于每个数 (i),都与已找到的素数表中的素数相乘,并标记乘积为合数,当 (i) 能被当前素数整除时就停止,这样可以确保每个合数只被其最小质因数筛一次。下面为你详细总结这两种算法。素数,也叫质数,是指一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数。

2025-02-10 08:07:05 460

原创 C++ 辗转相除法(也称欧几里得算法)总结

辗转相除法基于一个基本的数学原理:对于任意两个正整数 (a) 和 (b)((a \geq b)),它们的最大公约数等于 (b) 和 (a \bmod b) 的最大公约数,即 (\gcd(a, b) = \gcd(b, a \bmod b))。:递归实现的空间复杂度为 (O(\log(\min(a, b)))),主要是递归调用栈的深度;:辗转相除法的时间复杂度为 (O(\log(\min(a, b)))),这是因为在每次迭代中,两个数中的较小数至少会减少一半。

2025-02-10 08:02:41 377

原创 C++ 单链表、双链表、循环链表总结

单循环链表是在单链表的基础上,将链表的尾节点的指针域指向链表头节点,形成一个环;双循环链表则是在双链表的基础上,将链表的尾节点的下一个指针指向链表头节点,链表头节点的前一个指针指向链表尾节点,同样形成一个环。单链表的节点只能单向遍历,即从链表头开始,依次访问每个节点,直到链表末尾(指针域为 nullptr)。双链表也是由节点组成,与单链表不同的是,双链表的每个节点除了包含数据域和指向下一个节点的指针域外,还包含一个指向前一个节点的指针域。可以方便地找到链表的头节点和尾节点,因为它们是相连的。

2025-02-10 07:56:20 334

原创 C++ STL用法总结

使用 emplace_back() 替代 push_back() 避免临时对象拷贝。修改容器(如 vector 插入/删除)可能导致迭代器失效。unordered_map:快速查找(哈希冲突影响性能)。移动语义(std::move)提升容器操作效率。随机访问迭代器(vector, deque)双向迭代器(list, set/map)vector:随机访问频繁,尾部操作多。前向迭代器(unordered容器)list:频繁中间插入/删除。

2025-02-10 07:40:30 168

原创 C++ 结构体用法总结

在这个示例中,使用 std::vector 来存储 Book 结构体元素,std::vector 可以根据需要动态调整大小,使用 push_back 方法可以向数组中添加新的元素。这里定义了一个包含 3 个 Book 结构体元素的数组,但没有对元素进行初始化,此时 library 数组中每个元素的 title、author 和 year 的值是不确定的。:除了使用固定大小的数组,你还可以使用动态数组(如 std::vector)来存储结构体元素,这样可以在运行时动态调整数组的大小。

2025-02-10 07:39:37 343

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除