2026/10/15衡中集训

专题-差分、前缀和1

洛谷 - P1115(B题)

这个题有一点贪心的意思,令dp[i]等于1到i的最长的子段和
对于每个i有两种可能:一种是接着延续以前的最长字段和,一种是拉倒从头再来,取一个max
很明显就可以推出式子:dp[i]=max(dp[i-1]+a[i],a[i])
最后对dp[1]~dp[n]取最大值即可

AtCoder - abc477c(C题)

第一眼看以为是个大水题,直接用substr然后.find()一下子串内是否包含t就可以了
然而.find()的时间实在是太长了,所以T掉了两个点,考虑前缀和的做法
可以设pre[i]表示从1到i中子串t的数量,如果i在t内部也会+1(这是为了以后r会在t内部的情况)
最后对于每个l, r,输出pre[r-t.length()+1]-pre[l-1]即可 注意:r-length()-1是因为r有可能在t内部,所以要把当前的t刨出去 如果r是t的最右边其实就还会加上当前的t
另外本题还有一个坑点,就是s的长度可能小于t,l到r的长度也有可能小于t,要特判一下

AtCoder - abc469c(D题)

这个题还是挺简单的,可以把o看成“再来一瓶”
首先先留着自己已经买的,接着再用“再来一瓶”买,一个o能再加上的糖果就是后面类似oo...ox的形式的子串(因为子串也有o,相当于一直再来一瓶了,如果没有o是单独的x,也要加上),选择子串的个数就是已经买的里面是o的糖果
可以定义cnto[i]与cntx[i]为1~i出现的o与x的数量,nxt[i]为第i个x出现的位置,最终k=l位置的答案就是第cnto[l]+cntx[l]个x的位置,即nxt[cntx[l]+cnto[l]]

AtCoder - abc462d(H题)

思路还是挺简单的,但是一开始没想出来,还要多练啊!
可以定义cf[i]为i时间点内可以开始作案(对于每个人可以在s~t-d时间点内开始作案)的嫌疑人的个数(注意不是可以作案,是开始作案),可以用差分来求,就是cf[s]++, cf[t-d+1]--,最后的答案就是所有\(C^{2}_{cf_i}\)求和
另外,如果s~t时间段内无法作案就可以跳过对这个人的差分,特判一下就行

AtCoder - abc475c(I题)

这个题不是很难,在当前的小镇走,无非就两种情况:一直走到左边,折返回到右边(或者不回去),或者走到右边回左边(或者不回),可以枚举左右到达的端点x与y,到x的距离就是pre[s-1]-pre[x-1]到y的距离就是pre[y]-pre[s-1],到达小镇的个数就是y-x,最后判断是否小于l,取最大值即可
注意:x可以取s,因为左边可以不走,这样pre[s-1]-pre[x-1]即为0,同理y也可以取s-1

CodeForces - 2248D(F题)

感谢我宋哥提供的思路与讲解,太强了%%%
观察两个字符串,发现有对于每个si与ti有两种状态:相同(00,11)或不同(01,10),其中不同的状态是无法消去的,考虑怎么把这些不同的消去
对于不同的状态:有两种消去的方法:

01
10

或者

0x
1x(x是相同的数)

这里思路已经很一目了然了:在二元组内,如果\(|01的个数-10的个数|-相同元素的个数<0\),那么这个二元组就是好的

可以定义三个前缀和数组,cnt0[i],cnt1[i],cnte[i]代表1~i中01,10,相等的数量对于每个询问输出上面判断的结果即可

AtCoder - abc468_e(K题)

已严肃完成本次乘法逆元大学习
感觉是题单里面思考分量最大的一题,思路都很精妙,值得整一整
首先看分子,可以在分母为1~n(即选择分子数为1~n)时,找找规律
在选择时,有些分子会被重复选,我们可以列出来在元素个数=6的时候对于每个分母,分子重复选的个数,先拿分母等于三为例,应该会选到\(f(1,3),f(2,4),f(3,5),f(4,6)\),重复选的次数为12333321
把分母(下面用fm替代)从1~6的情况全部列出来,会形成这样:

fm=1 1111111
fm=2 1222221
fm=3 1233321
fm=4 1233321
fm=5 1222221
fm=6 1111111

似乎出现了奇妙的规律!看起来似乎是一个回形
另外我们发现,fm=1~3时是从fm到n-fm+1全部+1,fm=4~6时是-1
实际上我们有一个很巧妙的实现办法,令pre[i]表示1~i的数之和,对于每个分母,分子就每次累加 pre[n-i+1]-pre[i-1],就相当于在原先分子上加上/减去了in-i+1位置的数,巧妙的是当$i\geq\lceil\frac{元素个数}{2}\rceil$时,他也可以相应的减去元素in-i+1位置的数
接下来看分母。
分母即为\(fm^{-1}\),根据费马小定理,我们知道对于任意质数 \(p\) 和整数 \(a\),如果 \(a\) 不是 \(p\) 的倍数,则有\(a^{p-1}\equiv 1(\mod p)\) ,因为\(a\times a^{p-2}=a^{p-1}\),所以\(a\)的乘法逆元为\(a^{p-2}\),所以分母就是\(fm^{MOD-2}\),最后与与分子相乘并%MOD即可

posted @ 2026-10-15 11:27  lzacode  阅读(6)  评论(0)    收藏  举报