- 博客(125)
- 收藏
- 关注
原创 Codeforces Round 997 (Div. 2) A~D题解
每次只排列入度为 0 点,意味着当前放置的点已经不受限制,直接放即可,放完之后把下标往后加,并把周围的入度减一。重叠部分是由上一个矩形的右上角和下一个矩形的左下角重叠而成,所以重叠矩阵的四条边都不会被计算。的子数组大小为奇数时一定是好数组,因为不知道奇数数组具体有多少个,也不知道偶数数组具体有多少个,最好的方法就是用所有的方案数减去。PS:这其实是区间计数问题的模版,因为区间计数问题几乎都是要找到一个能转换为方程式的性质,然后进行前缀和计数这种。所谓可控,就是要量足够小,规律性足够强,能够重复构造的东西。
2025-02-04 17:15:46
593
原创 ### 2024 江西省赛题解(A,C,D,G,H,J,K,L) BEFI待补
次,其他时候都是承接上一秒的状态,对于上一秒的状态直接记录即可。门开和门关时重新计算一下每个点到哪个门是最近的。所以可以对于每种质因子,为每种质因子创建一个出现次数列表,将出现次数最多的依次从后往前分配。当任意操作都会取等号的时候。中每种质因子的最多出现次数留下来组成的值。也就是当数组中任意两个数都成倍数关系的时候。的每种质因子最小出现次数留下后组成的值,那么存在所有人说的都是真话的可能。个人说的是真话,最后一个人是假话。的倍数,它的最后一位必须是。中的每一位对最终答案的贡献。使得最后的数最大,次大,
2025-01-31 16:01:03
635
原创 Codeforces Round 987 (Div. 2)题解 A~D
看似上面一直说合并集合,实际上我们可以发现,当前最高的树只能往右边跳,我们只要维护上一个集合的左端点,以及维护上一个集合的最小值即可。因为最终要求的数是非递减的,所以最终数组内都是同一种数的方案是可行的。回到这个问题,也就是说,最多我们用三份相同的调料包,不可能用四份及以上的调料包。,需要判断是否这棵树能跳到最高的树后面,如果可以的话,那么从。,它可以直接跳到它后面所有的树上,所以直接遍历即可。是偶数的时候,显然可以相邻地放两个相同的数。是奇数的时候,最小的一组勾股数是。由于给定的数是非递增的,所以。
2025-01-30 16:51:09
744
原创 Codeforces Round 990 (Div. 2) 题解 A ~ D
所以我们累积每天的拼图总数,如果当前拼图总数达到了当前记录的层数所需的拼图数量,就把层数增加且答案增加。对于一个列它要么是只被经历过第一行,要么只被经历过第二行,要么它是转折处(第一行第二行都被记录答案)。最后判断栈顶的数和堆顶的数谁更大,如果栈顶的数大于堆顶,那么不断将其弹出加一塞到堆内。里面的数有哪些,我们只需要在所有数还没操作的时候,从小到大操作一遍它们即可。我们可以枚举哪些列当转折处,对于剩下的还没被分配的列,不难发现,如果第。里面的元素都是已经被操作过相同次数的数,那么集合。
2025-01-28 19:26:02
1036
原创 动态规划求解最小斯坦纳树(证了一天两夜)
为什么写这一篇文章,主要是因为我实在看不懂网上的题解,有好多地方不清楚,然后又没有人细讲,所以干脆自己写了一篇,供大家参考。,如果此时我们进行合并子树的话,是不会有任何反应的,因为没有进行连通,所以一个点只对应一个集合。天半,并网上查阅了很多资料,再加上自己的一些证明,终于能够彻底搞懂这个算法的精髓。中,根是终端点本身,包含的集合也是终端点本身。因为算的是子树的最小边权和,而只有一个点的树显然没有边,所以赋值为。周围的点,我们重新从最小堆中拿出最小的点作为起点去松弛周围的点。这是怎么从初始态转移而来的?
2024-08-09 04:43:50
1452
1
原创 Divisibility Part2(整除理论2)
Divisibility Part2本节内容是Part1的进阶内容,主要讲的是整除在竞赛中的一些常用的技巧。数的分解一、带余除法对于任意两个整数 a、b(b≠0)a、b(b\neq 0)a、b(b=0),都有唯一确定的整数 q,rq,rq,r, 满足a=qb+r(0≤r<b)a=qb+r\quad (0\leq r<b)a=qb+r(0≤r<b)二、分解式若 nnn 是正整数,则xn−yn=(x−y)(xn−1+xn−2y+⋯+xyn−2+yn−1)\qqu
2024-05-27 22:39:51
1011
原创 Divisibility Part1(整除理论1)
学习本节的基础:任意个整数之间进行加、减、乘的混合运算之后的结果仍然是整数。接下来,我们会给出定义,且给出并证明定义引申出的定理,最后对这些加以运用。),所以我们需要引进整除的概念,这节会对整除进行深入讨论。接下来从定义出发,证明一些关于整除的基本定理。整除),再利用第五题的结论,检查是否被。的数去除另一个数所得的商却不一定是整数(引导出来,本章最主要的内容都是在定理。,所以二者相减的绝对值不超过。的倍数,所以存在两个整数。 的数中最小的正整数,证明。是偶数的时候,结果如何?的数中最小的正整数,设。
2024-05-27 22:36:49
1073
原创 Game Theory In Competitive Programming|Part2(原创)
在上一个Part部分,我们介绍了Bash game、Nim game、Misere Nim game 这三个游戏的玩法、必胜策略,以及必胜策略的证明,并介绍了有关必胜态以及必败态的两条定理,接下来我们会以Part1为基础,深挖其中的理论。
2024-05-06 16:55:30
678
原创 Game Theory In Competitive Programming|Part1 (原创)
在算法竞赛中,博弈论是一个经常出现的题目类型。通常是两个人在给定规则下,每个人都按照最优策略进行博弈,我们的任务是找出获胜者。这通常是贪心算法、动态规划等算法的混合。下面,将对博弈论中的一些经典问题进行讨论。
2024-05-05 22:28:09
611
原创 数论:不定方程的引入
研究的对象:不定方程文章目录研究的对象:不定方程不定方程引入:裴蜀定理证明:欧几里得算法证明:充分性证明:必要性证明:战术总结:不定方程引入:不定方程,又称丢番图方程,定义为:未知数为整数,系数也为整数的多项式等式。形如a1x1b1+a2x2b2+...+anxnbn=ca_1x_1^{b_1} + a_2x_2^{b_2}+...+a_nx_n^{b_n} =ca1x1b1+a2x2b2+...+anxnbn=c如果我们能找到一组整数解:x1,x2,...,xnx_1,x_2,
2024-05-01 20:33:54
964
原创 数论:中国剩余定理证明
同余在数学中是指数论中的一种等价关系,符号为≡\equiv≡。指当两个整数aba,bab除以同一个正整数mmm,若得相同余数rrr,则称这两个整数aba,bab对于模mmm同余。记作a≡bmodma≡bmodm,读作aaa与bbb关于模mmm同余。在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次。ax≡bmodmax≡bmodm 的方程。
2024-04-27 09:09:22
2024
原创 0基础刷图论最短路 3(从ATcoder 0分到1800分)
AT最短路刷题3(本文难度rated 1200~ 1400)题目来源:Atcoder题目收集:(里面按tag分类好了Atcoder的所有题目,类似cf)(访问需要魔法)这算是一个题单,各位有兴趣可以按照这个顺序来刷。我的代码仅供参考。会提示关键性质和步骤。部分有注释。洛谷、知乎、可以搜到题解。
2024-04-11 16:35:41
845
原创 0基础刷图论最短路 2(从ATcoder 0分到1800分)
ATC最短路2 (本文难度rated 1000~ 1200)题目来源:Atcoder题目收集:(里面按tag分类好了Atcoder的所有题目,类似cf)(访问需要魔法)
2024-04-11 16:30:45
539
原创 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
1211
原创 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
888
原创 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
977
原创 AtCoder Beginner Contest 340
选择用vector,如果是操作1,就pushback。用dikjstra算法即可,一个很板的题。很简单的记忆化搜索,按照题意模拟即可。如果是操作2,直接从后往前找第k个。单点查询,区间修改,懒惰标记。
2024-02-28 11:42:39
442
原创 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
1712
原创 AtCoder Beginner Contest 335
我们最开始的状态倒过来存入数组中,然后每次修改一次,就往数组后面添加一个状态。查询的话就输出 v[ v.size() - p ] 即可。朴素做法是,每一次修改前,修改a[i]=a[i-1]蛇形矩阵,记录一个是否前方为边界,或前方是否被占用。时间复杂度为O(nq) =把最后一个字母改成字符串。三重for循环嵌套即可。
2024-02-28 11:40:53
440
原创 Hello 2024
如果负号少,正号多,那么一定能有一个或多个区间将正负号抵消,那么剩下来的正号单独划分即可。可以得出,如果元素之和的绝对值>=1 的时候,若长度大于1,其罚金必然比 单独元素交的罚金多。此时需要放在y后面,因为如果放在x后面,x本来很长的板子就缩短了,不利于后续的操作。所有情况就讲完了,但是有一个错误点,就是,不一定a[2]作为一个区间的开头更优秀。将a[2]放在t2后面更优,因为t2的原本短的结尾更长了,能挡住更多的元素。wa了很多次,先讲讲错了的思路,然后可以更好的过度到正确的思路。
2024-02-28 11:39:03
949
原创 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
370
原创 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
352
原创 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
872
原创 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
969
原创 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
843
原创 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
904
原创 Codeforces Round 925 (Div. 3)
我最开始的想法是模拟,将所有数据插入multiset中,然后当sasha操作的时候,取出里面最大的和最小的,合并,然后放回multiset中。一共就三个字母,我们只要每次从第一个字母开始,如果搜满三个字母,且正好总和为n,那么这就是答案,直接返回即可。算出平均数,然后从1开始,将多了的传递给下一个,直到最后一个,再检查一下第一个和最后一个是否为平均数即可。先手Anna,她最优的操作是反转后置0最多的数,使得总位数减少的多。所以记录位数之和,然后记录每个数的后置0,并按后置0个数从大到小排序。
2024-02-28 11:33:31
1617
原创 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
435
原创 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
1008
原创 单源最短路总结+练习题
处理方式很简单,只要让每一条边的边权都为1,跑一遍最短路即可,原理也很简单可以自行推导。刷到一道题,需要我们找到1~N这条路径里的两个有序的点,一个在前一个在后。有一些题看不出来是最短路,是因为他没有直接问你从起点到终点的最短路。集合之间的最短路问题,有n个连通块,求到终点最少经过几个连通块。由于这两个点是在1~N这条路径上,所以最好用spfa。然后求出 1~i 的小权值,和i~n的最大权值即可。后者我们不可能以i为点跑spfa,这样复杂度过高。也可以不想这些,用数学构造出一个新的最短路。
2024-02-16 03:54:00
495
原创 前缀和、差分
普通的二维前缀和,如果为了节省空间的话,可以用前缀和数组和原数组公用一个数组。中,正数和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
895
原创 0x01位运算
它通过使用二进制位来表示不同的状态,并使用位运算来操作和检索这些状态。在二进制状态压缩中,每个状态被赋予一个唯一的二进制编码,称为状态掩码。例如,假设我们有一个集合 {A, B, C, D},其中每个元素可以处于两个可能的状态:存在或不存在。我们可以使用一个4位的二进制数来表示这四个元素的状态,其中每一位对应一个元素,0表示不存在,1表示存在。例如,0000表示所有元素都不存在,而1111表示所有元素都存在。通过使用位运算,我们可以高效地对这些状态进行操作。
2024-01-30 17:38:49
1500
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人