自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Game Theory In Competitive Programming|Part2(原创)

在上一个Part部分,我们介绍了Bash game、Nim game、Misere Nim game 这三个游戏的玩法、必胜策略,以及必胜策略的证明,并介绍了有关必胜态以及必败态的两条定理,接下来我们会以Part1为基础,深挖其中的理论。

2024-05-06 16:55:30 584

原创 Game Theory In Competitive Programming|Part1 (原创)

在算法竞赛中,博弈论是一个经常出现的题目类型。通常是两个人在给定规则下,每个人都按照最优策略进行博弈,我们的任务是找出获胜者。这通常是贪心算法、动态规划等算法的混合。下面,将对博弈论中的一些经典问题进行讨论。

2024-05-05 22:28:09 551

原创 数论:拓展欧几里得求解二元一次不定方程

本节内容,主要围绕这三个关系来讲解。

2024-05-01 20:35:18 716

原创 数论:不定方程的引入

研究的对象:不定方程文章目录研究的对象:不定方程不定方程引入:裴蜀定理证明:欧几里得算法证明:充分性证明:必要性证明:战术总结:不定方程引入:不定方程,又称丢番图方程,定义为:未知数为整数,系数也为整数的多项式等式。形如a1x1b1+a2x2b2+...+anxnbn=ca_1x_1^{b_1} + a_2x_2^{b_2}+...+a_nx_n^{b_n} =ca1​x1b1​​+a2​x2b2​​+...+an​xnbn​​=c如果我们能找到一组整数解:x1,x2,...,xnx_1,x_2,

2024-05-01 20:33:54 780

原创 数论:欧几里得算法与斐波那契数列

欧几里得算法的运行时间,就取决与递归的次数。的取值,大概判断,调用的次数。所以,我们就可以通过,

2024-05-01 20:33:39 424

原创 数论:中国剩余定理证明

同余在数学中是指数论中的一种等价关系,符号为≡\equiv≡。指当两个整数aba,bab除以同一个正整数mmm,若得相同余数rrr,则称这两个整数aba,bab对于模mmm​同余。记作a≡bmodma≡bmodm,读作aaa与bbb关于模mmm​同余。在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次。ax≡bmodmax≡bmodm​​ 的方程。

2024-04-27 09:09:22 1002

原创 0基础刷图论最短路 3(从ATcoder 0分到1800分)

AT最短路刷题3(本文难度rated 1200~ 1400)题目来源:Atcoder题目收集:(里面按tag分类好了Atcoder的所有题目,类似cf)(访问需要魔法)这算是一个题单,各位有兴趣可以按照这个顺序来刷。我的代码仅供参考。会提示关键性质和步骤。部分有注释。洛谷、知乎、可以搜到题解。

2024-04-11 16:35:41 611

原创 0基础刷图论最短路 2(从ATcoder 0分到1800分)

ATC最短路2 (本文难度rated 1000~ 1200)题目来源:Atcoder题目收集:(里面按tag分类好了Atcoder的所有题目,类似cf)(访问需要魔法)

2024-04-11 16:30:45 412

原创 0基础刷图论最短路 1(从ATcoder 0分到1800分)

ATC最短路1 (本文难度rated 0~ 1000)题目来源:Atcoder题目收集:https://atcoder-tags.herokuapp.com/tags/Graph/Shortest-Path(里面按tag分类好了Atcoder的所有题目,类似cf)(访问需要魔法)文章目录ATC最短路1 (本文难度rated 0~ 1000)1-**Hands**2- **Cat Snuke and a Voyage**3-**Collision** https://atcoder.jp/cont

2024-04-11 16:27:00 886

原创 Educational Codeforces Round 156 (Rated for Div. 2)

对于我们要获得第几次的字符串,就需要从位置n入手,因为第0次的字符串,删除了0个字符,长度为s.size()可以提前算出来 0----a、0-----b、a-----b、a----p、b-----p 之间的距离。假如我们要获得第 k次的字符串,那么我们重复k次,每次将第一个遇到的逆序字符删除就行了。第k次的字符串,删除了k个字符,长度为s.size()-k。因为2%3的余数是2,4%3的余数是1。对于一个数,它模以3只有三种结果:0,1,2。那么a,b模以3也只有三种结果,0,1,2。

2024-03-02 13:16:14 808

原创 Codeforces Round 905 (Div. 3)

对于k==4, 因为任何数不是偶数就是奇数,所以计算奇数偶数个数即可。题目比较仁慈,只要我们的集合里面有不相交的线段,就输出yes。所以我们先统计出现奇数次的字符有多少次,设为cnt。所以若k>cnt,那么多出来的用偶数次的抵消即可。=4,只需要取模k找余数离k最近的即可。若k<cnt,若cnt-k>1,则无法构成回文。当偶数只有一个,且奇数大于1个,则答案为1。所以只有全都是相交的线段时,才输出NO。所以分为k==4 和k!当偶数超过2个,或者存在4,答案为0.当没有有数,如果有3,那么答案为1。

2024-02-28 11:58:20 925

原创 AtCoder Beginner Contest 340

选择用vector,如果是操作1,就pushback。用dikjstra算法即可,一个很板的题。很简单的记忆化搜索,按照题意模拟即可。如果是操作2,直接从后往前找第k个。单点查询,区间修改,懒惰标记。

2024-02-28 11:42:39 391

原创 AtCoder Beginner Contest 339

(a[j]\in[\ a_i-d,a_i+d\ ])$结尾的最长合法序列的长度。显然,要优化,不可能优化第一层循环,因为这是必需的时间复杂度O(n)的。我们就以a[i] 作线段树的下标,然后 dp[i] 作对于的值。所以我们只要再来一层循环,枚举 $j \in [1,i-1]而以 a[i]结尾的最长合法序列的前一项------a[j]通俗一点就是,在已经出现过的序列内的一个区间中找区间最大值。由于是bfs,所以每次步数都是上一次+1,很好转移。暴力做法就是,求以a[i]为结尾的最长合法序列。

2024-02-28 11:41:57 1588

原创 AtCoder Beginner Contest 335

我们最开始的状态倒过来存入数组中,然后每次修改一次,就往数组后面添加一个状态。查询的话就输出 v[ v.size() - p ] 即可。朴素做法是,每一次修改前,修改a[i]=a[i-1]蛇形矩阵,记录一个是否前方为边界,或前方是否被占用。时间复杂度为O(nq) =把最后一个字母改成字符串。三重for循环嵌套即可。

2024-02-28 11:40:53 387

原创 Hello 2024

如果负号少,正号多,那么一定能有一个或多个区间将正负号抵消,那么剩下来的正号单独划分即可。可以得出,如果元素之和的绝对值>=1 的时候,若长度大于1,其罚金必然比 单独元素交的罚金多。此时需要放在y后面,因为如果放在x后面,x本来很长的板子就缩短了,不利于后续的操作。所有情况就讲完了,但是有一个错误点,就是,不一定a[2]作为一个区间的开头更优秀。将a[2]放在t2后面更优,因为t2的原本短的结尾更长了,能挡住更多的元素。wa了很多次,先讲讲错了的思路,然后可以更好的过度到正确的思路。

2024-02-28 11:39:03 910

原创 Codeforces Round 922 (Div. 2)

只要我们把一个数组排好序,那么不管怎么交换,都不会减少逆序对的数量。如果发现一行填不满,只需要将一个位置换成 1x3的砖块即可。1、选中的下标里有一对逆序对,那么交换后,仍然是一对。找到a中第一个与b不同的位,且a在这位上是1.2、选中的下标里有两对逆序对,交换后变成0对。3、选择的下标里有0对逆序对,交换后变成2对。第x位为1大于 0~x-1 的所有位为1的值。此后,所有的a与b不同的位,x都与a相同即可。不需要竖着的砖块,全部为横着的砖块即可。其余的都填1x2的砖块。二进制,位运算,贪心。

2024-02-28 11:38:22 312

原创 Codeforces Round 921 (Div. 2)

所以,我们可以从1~m扫一遍,记录有多少份合格的单元(包含前k种字符)构造一个 n*k 长度的字符串,将字符串分成n份,每一份长度为k。开始打擂台, ans=max(ans,符合条件的因数)如果合格的单元少于n,那么这个字符串一定是不合格的。(合格的单元的最后一个字符+不合格单元缺少的字符)那么将x分为n份方案,每份方案必然是x或x的倍数。由第一题可知,给定的m必须是大于或等于n*k。(这个规律很难找,需要自己多写一些长的样例)如果 (x/i)*n < x 也记录答案。枚举x的因数i,x/i。

2024-02-28 11:37:36 307

原创 Codeforces Round 919 (Div. 2)

/当g==0时,说明,v[j+1]=v[j],也就是每一项都相同。如果爱丽丝要消除j个元素(必然从最大的开始消除),那么消除掉的元素之和:nxt[n-j]显然,要找到一个m,使之满足上面的所有式子,那么m必然是它们的最大公约数。注意到,如果不满x个,那么我们就选剩下的所有: sum-nxt[n-j]只要枚举j 使2nxt[n-j-x]-nxt[n-j] 最小即可。我们需要找到m,使得每一段的数,分别对m取模的结果是一 一对应的。也就是减去 2倍的 nxt[n-j-x]-nxt[n-j]

2024-02-28 11:36:58 830

原创 Codeforces Round 906 (Div. 2)

所以,这个数组的长度必须是偶数,不能是奇数,因为奇数会多出一个自己和自己配对的情况。给一个数列a,元素只包含01,我们可以选择插入数组b 使得数列a的元素交替进行。若数列a内有两个元素,如果这两个元素能满足交替进行的数量那么也是YES。给你一个数列,任意排序,使得相邻两项的和为k,判断是否存在这样的构造。2、当连续的数是00,且数组b交替进行,且数组b的两端是1,则yes。1、当连续的数是11,且数组b交替进行,且数组b两端是0 则yes。显然,当数列a中有两个连续的数的时候,我们才需要插入01。

2024-02-28 11:36:13 925

原创 Codeforces Round 161 (Div. 2)

如果 x<y , 那么我们需要不断的往右移动,如果x+1 是x的最近城市,那么移动到x+1只需要1个金币, 否则移动到x+1就需要 a[i+1]-a[i] 个金币。​ 2.C[i]与它们相同时,则不可能存在t[i]与AB匹配的同时与C不匹配 , ans++​ 1.C[i]与它们不同时,那么可以找到一个t[i]与AB匹配与C不匹配,bns++​ 2.C[i]与它们相同时,则不可能存在t[i]与AB匹配的同时与C不匹配, ans++作为等边三角形的边的种数。

2024-02-28 11:35:42 808

原创 Codeforces Round 929 (Div. 3)

他的部分值为:sum2= (u+1) + (sum[pos]-sum[l-1]-u-1) 分为两个部分,一部分是能力增长的,一部分是能力下降的。能力值:(u-sum1+1 + u)*(sum1)/2 (等差数列,首项为u,末项为u-sum1+1,项数为sum1)(负值) (1+ sum[pos]-sum[l-1]-u-1)*(sum[pos]-sum[l-1]-u-1)/2。当sum=1,最少的操作是1,前提是取模后的a数组内有1存在,对a排序后用find查找即可。

2024-02-28 11:34:10 862

原创 Codeforces Round 925 (Div. 3)

我最开始的想法是模拟,将所有数据插入multiset中,然后当sasha操作的时候,取出里面最大的和最小的,合并,然后放回multiset中。一共就三个字母,我们只要每次从第一个字母开始,如果搜满三个字母,且正好总和为n,那么这就是答案,直接返回即可。算出平均数,然后从1开始,将多了的传递给下一个,直到最后一个,再检查一下第一个和最后一个是否为平均数即可。先手Anna,她最优的操作是反转后置0最多的数,使得总位数减少的多。所以记录位数之和,然后记录每个数的后置0,并按后置0个数从大到小排序。

2024-02-28 11:33:31 1502

原创 Codeforces Round 923 (Div. 3)

将a,b数组内所有的小于等于k的数字都插入到集合a1、b1、 t中。(t是插入a,b元素的总和)=a[i-1] , s[i]=i-1;否则 s[i]=s[i-1];如果,第i个数与第i-1个数不一样,记录这个不一样的地方的开端:i-1。如果区间[l,r] 之间所有数都一样,那么 s[l]=s[r]s[i] 等于 i的左边第一个与a[i]不一样的点的下标。s+=c 和 s=s+c 的时间复杂度是不同的。三:计算集合a,b之间不重复元素的个数,记为cha。如果i+1还是不一样的话,那么记录不一样的开端:i。

2024-02-28 11:32:56 371

原创 Codeforces Round 913 (Div. 3)

所以我们要想三位数不进位,那么就将每一位数分成3份,放到 相应的位上。当出现b/B,就将计数器++,当出现大小写,就将计数器–,并标记。当a+b+c 会进位的时候, 9+1–>10 ,位数之和就减少了9。当k超级小的时候, 如k=1 ,l[i]=2,r[i]=4。所以当 start>end 的时候,这个区间是不存在的。我们注意到,每一次跳,start的结果必然>=l[i]很好理解,因为a,b,c都是十进制,当你缝9进1。例如99,将个位的9,分成3份到abc的个位上。

2024-02-28 11:30:40 958

原创 单源最短路总结+练习题

处理方式很简单,只要让每一条边的边权都为1,跑一遍最短路即可,原理也很简单可以自行推导。刷到一道题,需要我们找到1~N这条路径里的两个有序的点,一个在前一个在后。有一些题看不出来是最短路,是因为他没有直接问你从起点到终点的最短路。集合之间的最短路问题,有n个连通块,求到终点最少经过几个连通块。由于这两个点是在1~N这条路径上,所以最好用spfa。然后求出 1~i 的小权值,和i~n的最大权值即可。后者我们不可能以i为点跑spfa,这样复杂度过高。也可以不想这些,用数学构造出一个新的最短路。

2024-02-16 03:54:00 437

原创 前缀和、差分

普通的二维前缀和,如果为了节省空间的话,可以用前缀和数组和原数组公用一个数组。中,正数和p、负数和的绝对值q。理论上,如果一个序列中的所有的数是一样的话,那么其差分数组。若 l、r 能互相看见,说明 l、r 之间的数都需要-1。故,如果我们需要对一个区间进行增减同一个数x的操作。有操作,那么b[1]只可能会被操作 1~p-q次。例如,我们需要将[2,5]内的元素全部都增加1。只需要让b[2]+1, b[6]-1 即可。2、如果b[1]无操作,说明p-q次操作都在。将a[l+1]-1, a[r]+1。

2024-01-30 17:51:21 857

原创 0x02递推与递归

递推者,自小而大,循序渐进;递归者,由上而下,分而治之。

2024-01-30 17:48:43 878

原创 0x01位运算

它通过使用二进制位来表示不同的状态,并使用位运算来操作和检索这些状态。在二进制状态压缩中,每个状态被赋予一个唯一的二进制编码,称为状态掩码。例如,假设我们有一个集合 {A, B, C, D},其中每个元素可以处于两个可能的状态:存在或不存在。我们可以使用一个4位的二进制数来表示这四个元素的状态,其中每一位对应一个元素,0表示不存在,1表示存在。例如,0000表示所有元素都不存在,而1111表示所有元素都存在。通过使用位运算,我们可以高效地对这些状态进行操作。

2024-01-30 17:38:49 915

原创 双向搜索的理解和板子

/开一个二维map,m[i][string]= step;无论0在哪个位置,它都可以往四个方向交换,当然,这里面有很多无效的操作,所以我们考虑剪枝,如果它交换后的坐标,是合法坐标,那么我们认为这次交换时有效的。//在字符串中,向左移动,向右移动,向上移动,向下移动。//在字符串中,向左移动,向右移动,向上移动,向下移动。//在字符串中,向左移动,向右移动,向上移动,向下移动。//在字符串中,向左移动,向右移动,向上移动,向下移动。

2024-01-18 14:00:01 1148

原创 简单数位dp

如:34 与 345 , 由于前面的数都贴合,所以当我们枚举下一位的时候,我们枚举的选择只能是 0~5. 也就是0~N在这一位的数位。我们第一个数枚举的是1,显然,不管后面五个数是什么,我们都不会超过N,所以,在不受限制的情况下,后面五个数能产生的1的总和是固定的。枚举完以1开头的数后,当我们枚举到以2开头的数,发现此时后面五个数仍然不受限制,所以,这与上一种的答案是一样的。如果我们枚举的数,从某一位开始不贴合的话,那么从这一位之后,每一位的枚举范围,将不受限。// 如果枚举完了,直接返回sum。

2024-01-16 16:54:48 480

原创 换根DP求树的重心/求最小距离和

i++) { // 遍历节点pos的所有子节点。i++) { // 遍历节点pos的所有子节点。// 输入节点权值、子节点1、子节点2。// 将节点i添加到子节点1的邻接表中。= fa) { // 如果子节点不是父节点,则递归计算子节点的子树大小。// 将节点i添加到子节点2的邻接表中。// 节点权值、子节点1、子节点2。

2024-01-12 22:44:50 901

原创 图论中的树

树的直径是指树中最长路径的长度。也可以理解为在树中任选两个节点,它们之间的最长路径的长度即为树的直径。求法首先从任意节点开始进行一次深度优先搜索,找到距离该节点最远的节点A。然后从节点A开始进行第二次深度优先搜索,找到最远的节点B,那么节点A和节点B之间的路径长度就是树的直径。注意一棵给定的树中,直径的长度是一定的,但直径的路径是不一定的将树中的某一结点删除,这棵树将散架,分成若干棵子树,设其中最大的一棵树结点数量为 N。以此类推,遍历每一个结点,找到最小的N,此时删除的结点就是重心。

2024-01-11 17:06:16 2012

原创 假设法做线段树

这时候,又有疑问了,因为我们只有在先加后乘的情况下,左右儿子的加法标记才能更新为:LAdd*Mul + Add 的形式啊。ps:(sum、add、len、mul,分别表示当前区间的区间和、加标记、长度,乘标记)对于1,我们只要把它展开: sum = sum*mul + add*mul * len。所以,我们只要把儿子的加标记更新为这样的形式就行了: ladd*Mul + add。而,每次执行,乘法或加法的时候,只会更新乘法标记或加法标记。要么没有标记,要么只有加标记,要么只有乘标记。

2024-01-05 16:46:39 326

原创 权值线段树的一些个人理解(小白

假设我们现在有6个数: -11 ,-18 , -118 , 11 ,118 , -71 .拿上面 的数举例子吧: -11 ,-18 , -118 , 11 ,118 , -71 .然后看-118 ,找-118右边的桶内有几个元素.....找到了,有-18、-11这俩个元素。然后看-18 ,找-18右边的桶内有几个元素.....找到了,有-11这一个元素。6、找-71,发现-71右边有:-18、-11、11、118 四个元素,1、先查找-11有多少个逆序对(也就是找-11右边的桶内有几个元素)

2024-01-03 02:02:16 564

原创 结构体的一些小技巧

然后又因为,如果出列了一对,那么这一对的左右两边的人要自动补齐,所以这样就又多了一对的数据,把这一对数据插入最小堆即可。这一对的数据很好得到,就是出列的那一对的左边和右边,所以我当时想到了链表。再加上本地ide背锅(明明最后的答案是对的,但是编辑器不给过,就浪费了好久时间,后面无奈交了,发现对了。因为,题目要求,如果差值相等,输出最左边的一对,所以我们需要记录每个人站的编号。有一天在写洛谷的一道题的时候,我想出来大概思路,但是有几步我想破头也无法实现。切记,一定要按照顺序结构体里的顺序赋值。

2024-01-02 17:34:46 833

原创 二叉堆的简单板子+理解+例题

小根堆内的元素仍然是i个,但在新元素插入后,调整了大小关系,仍然使得小根堆的堆顶的元素是当前的第i大的元素(即时现在有超过i个元素,大于第i大的元素,都被放到了大根堆里)如果i开始变化,如i变成i+1,那么我们直接把当前大根堆的堆顶的元素加入小根堆中,这个元素一定会在小根堆的堆顶,然后我们在删除大根堆的堆顶,使之调整结构。先往小根堆里插入元素,然后取出小根堆的堆顶,加入上面的大根堆,然后删除小根堆的堆顶。堆顶堆由两个堆组成,一个大根堆,一个小根堆。而,二叉堆是堆的最常见的实现方式。

2024-01-01 12:01:36 914

原创 KMP算法的理解+板子

其实,我们一开始定义next数组的时候,单纯的希望它有一个功能,就是如果文本串和模板串发生不匹配,那么指针j 去往的地方是 next[j-1]。next[k] 的值和 “在模板串中从0开始到下标为k的字符串中,最长相等前后缀“ 的长度相等。如果i , j 匹配不成功,那么我们希望 j能重新跳到模板串的某一个位置,重新开始匹配。如果i,j匹配, 那么说明 [0,j-1]肯定是匹配上了的,又[0,j-1]的长度是 j。那么当i,j匹配的时候,我们就用第二条性质,直接让next[i] = j+1.

2023-12-29 21:56:50 410 1

原创 线段树简单板子+介绍

这就是经典的二分了,查询这个区间是在哪个结点处,如果这个区间能把当前结点对应的区间包含住,那么我们直接返回这个结点的值就可以了。而第三种情况就是,当你的目标区间和结点区间完全没有交集的时候,我们直接返回0就可以了。“ 这个区间的最大值,取决于 这个区间左半边的最大值,和区间右半边的最大值 ”一个区间的最大值,取决于 这个区间左半边的最大值,和区间右半边的最大值。当结点区间的左端点为目标区间的左端点的时候(结点区间的右端点是绿色处)给你一段区间,然后给你 q次询问,每次询问让你输出这个区间的最大值。

2023-12-28 00:48:39 945

原创 《洛谷深入浅出进阶篇》简单数据结构

简单数组简单栈简单队列简单链表简单二叉树简单集合图的基本概念二叉堆线段树树状数组与字典树线段树进阶。

2023-12-17 21:00:52 1173

原创 《洛谷深入浅出进阶篇》 进阶数论

啥玩意是模?

2023-12-13 20:26:13 929

空空如也

空空如也

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

TA关注的人

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