3月杂题选做(part 2)

上回说到:Part 1

关于难度

可以秒杀的题。

思考一会儿后可以秒的题。

需要较长时间思考的题。

看题解、稍加指点就会做的题。

看题解后需要较长时间消化,甚至现在都没有完全理解的题。


本月主要板刷 cf *2300~*2400 的题。

一些简单的 DS 题就直接嘴巴了。

由于博客过长会导致 markdown 加载缓慢,所以源码长度超过 1000 行时进行分 P 处理。


[JSOI2011]分特产 +/

n 种物品,第 i 种物品有 ai 个,现在需要分给 m 个人,要求每个人至少分到一样东西,求方案数,对 109+7 取模。
n,m,ai1000

标签:组合数学,容斥。

每个人至少分到一个,这个条件比较难搞,考虑容斥,把这个条件去掉。

枚举有多少人没有分到任何东西,答案就是:

i=0m1(1)iCmij=1nCaj+mi1mi+1

code


CF1228E *2300

给定一个 n×n 的矩阵,用 1...k 的数填充,使得每行每列最小值均为 1,问有多少填法,答案对 109+7 取模。
n250,k109

标签:容斥。

考虑容斥一下,枚举 ij 列没有一个 1,然后就可以直接算了。

和上面的题差不多,不细讲。

时间复杂度 O(n2)

  • 容斥时一定要记得加上组合数,比如该题中 CniCnj

code

好像有 O(nlogn) 的容斥做法,不大会。


CF1117D *2100

有一个长度为 n 的串,开始都是 0,每次选择一个都为 0 的长度为 m 的空串,把这些位置都变成 1,问最后又多少种不同的序列,对 109+7 取模。
n1018,m100

标签:矩阵乘法,dp。

显然可以设 fi 表示 1..i 的方案数,分情况讨论,得到转移式:

fi=fi1+fim

显然矩阵快速幂优化一下,时间复杂度 O(m3logn)


CF1182E *2300

已知 f1,f2,f3,c,当 i4 时,fi=c2i6fi1fi2fi3,求 fn,答案对 109+7 取模。
n1018

标签:矩阵乘法。

这东西一眼矩阵快速幂,但是都是乘法,矩阵快速幂只能支持加法。

设答案为 f1a1f2a2f3a3ca4,只需要求出这些指数就可以算出答案了。

这些指数又满足加的条件,所以矩阵快速幂维护就好了。

一起维护比较困难,分开维护每一个,然后就做完了。

code


P6835 +/

有一条链,ii+1 连边,此外还有 m 条返祖边,x 连向 y(xy),在每个点随机选择一条出边走,求从 1 走到 n+1 的期望步数。
n106

标签:期望,dp。

期望入门题,虽然我推了好久。

fx,y 表示 x 走到 y 的期望步数。

fx,y=i=xy1fi,i+1

所以只需要算每一步就好了。

fx,x+1=1+1d(fy,x+fx,x+1)1dfx,x+1=1+1dfy,xfx,x+1=d+fy,x

d 表示出度,所以直接算出每一步的期望,后面的 fy,x 可以直接前缀和一下查询。

code


CF1139D *2300

给一个数列,每次随机选一个 1m 之间的数加在数列末尾,数列中所有数的 gcd=1 时停止,求期望长度。
m105

标签:莫反,dp,期望。

推式子好题。

首先设 fi 表示当前 gcd=i,后面的期望长度。

fi=1+1mj=1mfgcd(j,i)

这个可以根据期望显然得到。

换成枚举 gcd(j,i)

fi=1+1md|ifdj=1md[gcd(j,id)==1]

右边的式子莫反一下。

fi=1+1md|ifdj=1mdp|gcd(j,id)μ(p)

p 放前面来,得到

fi=1+1md|ifdp|idμ(p)mdp

预处理 μ 后暴力做,时间复杂度 O(nlog2n),就做完了。

code

看了题解,发现还可以继续推。

T=dp

fi=1+1md|ifdp|idμ(p)mT

T 扔前面。

fi=1+1mT|imTd|Tfdμ(Td)

F(T)=d|Tfdμ(Td)

fi=1+1mT|imTF(T)

F(T),可以在 dp 的过程中处理,复杂度是调和级数 O(nlogn),所以总时间复杂度 O(nlogn)

code

巨佬 George1123 有很强的 O(m) 做法,根本不会。


P6810 +/

已知 n,m,求

i=1nj=1md(i)d(j)d(gcd(i,j))

d(i) 表示 i 的约数个数。
n,m2×106

标签:数学。

简单题,显然枚举一下 gcd(i,j) 的约数,然后预处理一下 d,直接暴力就好了。

时间复杂度 O(nlogn)

code


CF1332E *2100

有一个 n×m 的矩阵,(i,j) 有数 ai,j,每次操作可以让一个 ai,j 加二,也可以把两个相邻的数同时加一,问有多少中不同的矩阵满足 ai,j[L,R],且可以通过若干次操作使得所有 ai,j 相同,答案对 998244353 取模。
n,m,L,R109

标签:数学,二项式定理。

其实这题也不是特别难。

考虑每次操作,ai,j 的奇偶性是不变的,并且可以发现由于可以无限次操作,所以可以操作到任意和的奇偶性相同的局面。

考虑如果 n×m 是奇数,那么最后状态的和可以是奇数也可以是偶数,所以必然有解,答案就是 (RL+1)n=m

考虑如果 n×m 是偶数,状态要满足奇数、偶数的个数都是偶数。

[L,R] 区间中有 X 个奇数,Y 个偶数。

那么答案的式子就是

i=0nm2Cnm2iX2iYnm2i

这个东西和二项式定理特别像,只是把奇数项全部去掉而已。

可以发现答案就是 (X+Y)nm+(XY)nm2X+Y=RL+1,XY 只需要判断 RL+1 的奇偶性就好了。

code

注意不要使用欧拉定理,因为指数取模后可能出现 00 情况,快速幂的结果是 1,但应该是 0


P4247 NOI/NOI+/CTSC

有一个长度为 n 的序列,有三个操作:
I a b c 表示将 [a,b] 这一段区间的元素集体增加 c
R a b 表示将 [a,b]区间内所有元素变成相反数。
Q a b c 表示询问 [a,b] 这一段区间中选择 c 个数相乘的所有方案的和 mod19940417 的值。
n,q50000,c20

标签:线段树。

这题真不难,不知道为啥是黑。

c 很小,适合暴力

每个节点暴力开 si 表示选 i 个数的答案。

合并是一个卷积形式,很简单。

所以 R 操作和 Q 操作解决了,考虑区间加。

假设原来选的是 x1x2...xk

变成 (x1+c)(x2+c)...(xk+c)

拆开,发现是 ci 乘上 kix,考虑 sisj 的贡献,实际上就是再选 jic,组合数算一下就好了。

打标记就和支持加乘的线段树一样。

做完了,但出题人很凉心,模数不是指数,不能 O(n) 预处理组合数,这个地方我调 1h

code


P7394 +/

有一棵数,每个节点有点权 0/1,维护 3 种操作。
1 xx 位置上的灯打开或关闭(原来如果打开就关闭,否则打开)。
2 x y 询问树上与 x 相同深度的点中与 x 结点距离为 y 的点中开着的灯的个数。
3 x 回到第 x 次事件发生之后的状态。

标签:主席树,dfs序。

挺简单的。

考虑 dis(i,j)=depi+depj2×depLCA(i,j)

由于 i,j 深度相同,所以可以得到 LCA 是哪个点。

问题转化为查询 LCA 子树下,不与 x 在一棵子树的,深度与 x 相同点的个数。

dfs 序再线段树乱维护就好了,可持久化的话可以离线做也可以直接主席树。

code


CF1523E *2600

n 个台灯初始时都是暗的,每次等概率随机一个暗台灯将其点亮,若点亮后存在一个长度为 k 的连续段有大于一个台灯被点亮则立刻停止,求期望点亮多少台灯。答案对 109+7 取模。

标签:数学,期望。

*2600 ???

考虑经典转化,因为算恰好 i 个灯不合法的方案难算,所以算放 i 个灯依然合法的方案,这个组合数随便算。

答案相当于求个和就好了。

code


P2447 +/

已知 m 个线性异或方程,问至少使用前多少个方程可以解出每个未知数的答案。

标签:高斯消元。

直接做高斯消元,答案就是使用的方程中编号最大的。

O(n3) 过不了,用 bitset 优化一下。

code


P6478 /NOI

题比较长,自己看。

标签:二项式反演,树上背包。

新科技,二项式反演。

题目中恰好非常难搞,考虑转化成大于等于。

假设 fk,gk 分别表示恰好 k 组匹配与至少 k 组匹配的方案。

gk=i=kn(ki)fi

反演一下

fk=i=kn(ki)(1)ikgi

fk 是答案, gk 可以直接用树上背包做。

dpi,j 表示以 i 为根的子树中匹配了 j 组的方案数。

直接合并,然后考虑一下 i 的情况就好了。

code


P2664 NOI/NOI+/CTSC

lrb 有一棵树,树的每个节点有个颜色。给一个长度为 n 的颜色序列,定义 s(i,j)ij 的颜色数量。以及

sumi=j=1ns(i,j)

现在他想让你求出所有的 sumi

标签:dfs序。

如果直接考虑计数不是很好做,考虑反过来,考虑每个颜色对答案的贡献。

把一个颜色单独拿出来,然后考虑中间的贡献。

像下面这样:

qJEfnH.png

直接考虑中间这个红色区域,贡献很好算,就是上面的加上下面子树的。

时间复杂度 O(n)

然后就做完了,不知道为啥要淀粉质。

code


CF718C *2300

在本题中,我们用 fi 来表示第 i 个斐波那契数(f1=f2=1,fi=fi1+fi2(i3)
给定一个 n 个数的序列 a。有 m 次操作,操作有两种:
alar 加上 x
(i=lrfai)mod(109+7)
n,m109

标签:线段树,矩阵乘法。

简单题。

CF633H 的弱化版,直接线段树维护矩阵,没了。


CF1175F *2500

给定数组 a1,a2an,若子序列al,al+1ar 满足 1,2rl+1 所有整数各出现一次,则称其为这个数组的一个子排列。求这个数组子排列个数。

标签:分治。

随便一个 *2500 都不会,我退役罢\kk。

考虑一个子排列需要满足:

  • 最大值是 rl+1

  • 没有重复的数。

考虑分治,只需要看经过分治中心 mid 的方案数。

这个比较难搞,我们可以钦定 midl...r 最大值,这样保证 amid 是最大值,也就知道了 rl+1

双指针扫一遍,用 st 表查询,没了。

code


CF1637F *2500

给定一棵 n 个结点的树,第 i 个点有一高度 hi 。你可以在任意一些结点上建信号塔,高度随意。结点 i 有信号且当 iu,v 的路径上,u,v 分别有两座信号塔 eu,ev ,满足 min(eu,ev)hi 。建高度为 x 的信号塔花 x 元,问最少得花多少钱使得所有结点都能有信号。

标签:贪心,dp。

首先一个显然的结论,信号塔必然在叶子上,不然把一个信号塔向下移动可以对更多的点产生贡献。

然后考虑一棵子树对外面的贡献只与该子树中最大的信号塔有关。

所以设 fi 表示满足 i 子树内部后最大的信号塔值。

但这样有个问题,如果想要满足 i ,可以子树中选两个叶子,也可以外面选一个叶子,内部选一个叶子。

一个巧妙的构造思路是令 hi 最大的为根,那么此时最大的信号塔必然在两个不同的子树中,这样可以让满足一个点的最优策略必然是内部选一个点,外部选一个点。

然后就可以直接 dfs 一遍跑 dp 了,如果 fx<hx 则需要把 fx 变大,否则不变。

code


CF1585G *2500

已知一个森林,都是有根树,Alice 和 Bob 轮流操作,每次选择一棵树和一个小于这棵树秩的正整数 d,然后把这棵树深度小于等于 d 的节点删去,不能操作者输,问先手是否有必胜策略。

标签:博弈论,SG 函数。

复习一下博弈论。

考虑计算出每个子树的 SG 函数,这样最后的答案就可以直接异或算出。

咋算呢。

考虑暴力就是枚举 d,那么把深度大于 d 的子树求个异或和,然后去 mex。

但这炸了,一条链就卡掉了。

考虑优化,实际上很简单,考虑如果一个点只有一个儿子,他的答案显然可以由儿子直接转移。这一部分跑得飞快,均摊一下就没了。

时间复杂度不大会,题解说是 nlogn 的。

code


ARC101C *2913

将给定的包含偶数 n 个点的树上的点两两配对,使得每对点之间路径的并集包含了每一条树边,求方案数。

显然可以想到容斥,如果当前有 i 条边没有被覆盖,那么就相当于把树分成 i+1 个联通块,每个联通块的答案是可以算的,乘起来就好了。

然后就不会了。

考虑树形 dp,设 fi,j 表示以 i 为根的子树中,i 所在的联通块大小为 j,答案乘上容斥系数的结果。

特别的 fi,0 表示和父亲之间有一条不合法边的答案。

j>0 就直接背包。

j=0 就直接考虑把当前联通块的答案加上再乘 1

答案就是 f1,0

code


ABC181F *2009

已知 n 个点在平面内第 i 个点坐标为 (xi,yi),100xi,yi100
现在有一个半径为 r 的圆,开始时在 (109,0) 的位置,像去 (109,0),不能碰到 y=100y=100 两条直线以及每个点。
r 最大值。
n100

标签:贪心,最小生成树。

随着 r 逐渐变大,会有一些两点之间的空隙这个圆无法通过,而如果某时刻左右不连通则圆无法通过。

所以点之间两两连边,在与上下直线连边,没加一条边后看看上下是否连通,类似于最小生成树。

code


CF1310D *2300

N 个点的图,给你图的邻接矩阵,求从点 1 出发经过 K 条边回到点 1,且路径上没有奇环的最短距离。
n80,k10

标签:图论,随机。

数据很小考虑暴力咋做。

直接暴力 nk,显然炸。

看到奇环想到二分图,相当于黑白染色后黑白交替走。

由于 k 很小,假设 1 是黑点,那么黑点数量只有 k2,所以可以暴力枚举黑点,然后就可以直接做了。

时间复杂度 O(nk2)

code

还有一个很强的做法,考虑每次随机每个点是白点还是黑点,然后进行一个 O(n2k) 的 dp,这样成功地概率很高,而且跑得飞快。

多做几遍就好了。


P8229 +/

有一个篮子,开始有一个草莓,每次抛一枚硬币,P 的概率为正面,篮子中草莓数乘 K1P 的概率为背面,吃完篮子中所有草莓,然后篮子中自动生成一颗草莓,求抛 n 次硬币后吃草莓数量的期望值,答案对 998244353 取模。
n1018

标签:数学。

不是很难的数学题,设 fi 表示抛 i 次硬币后篮子中草莓数量的期望,那么答案就是:

(1p)i=0n1fi

然后可以得到 f 的递推式:

fi=fi1×kp+(1p)

推一下通项,如果你不会推,可以看这里

得到

fi=(1+1pkp1)(kp)i1pkp1

然后再推一下答案,得到:

ans=(1p)(n(1p)kp1+(1+1pkp1)(1(kp)n1kp))

注意 kp 可能等于 1 ,此时分母为 0 ,需要特判计算。

code


CF741D *2900

一棵根为 1 的树,每条边上有一个字符( a...v22 种)。 一条简单路径被称为 Dokhtar-kosh 当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中最长的 Dokhtar-kosh 路径的长度。
n5×105

标签:dsu on tree。

学习了一下新算法 dsu on tree,发现不是个很难的算法,就不新开一个文章了,借这道题讲一下。

字母只有 22 个,显然状压,就是求最长的路径使得异或值只有一位是 1,考虑做到一棵子树时,只需要考虑经过根节点的路径,因为其他路径可以自底向上合并。

一个显然的结论是设 disi,j 表示 ij 路径上的异或值,那么 disi,j=dis1,i xor dis1,j

所以只需要考虑 dis1,i,即可,然后找 depi+depj2×depLCA(i,j)

后面的已知,相当于求前面的 depi+depj 的最大值。

考虑开桶,bi 表示异或值为 idepx 最大值,然后对于一个 depy 可以暴力找和它匹配的 x 统计答案。

暴力做 O(n2),一条链就可以卡掉。

然后需要 dsu on tree,其实就是重链剖分一下,然后重儿子的桶直接继承过来(做完不清空),轻儿子的暴力做,时间复杂度 O(nlogn)

code


P3694 +/

已知 n 个人,每个人有一个编号 ai,每次可以选择一个人离开,离开若干人后把这些人放回去(放在空位中),不离开的人位置不变,使得编号相同的人相邻,问最少多少个人离开队伍。
n105,m20

标签:状压 dp。

简单题,设 fi,表示当前已经在前面放了集合为 i 的队伍,所需要离开人的最小值,枚举接下来是哪个队伍,然后直接做就好了。

code


CF1499F *2400

给定一棵 n 个节点的树和一个正整数 k。求有多少种边的集合,使得在将此集合中的所有边断开后,形成的所有连通块的直径都不大于 k

标签:树形 dp。

fi,j 表示 i 子树内最长链为 j 时的答案。

直接暴力转移就好了。

code


P7214 NOI/NOI+/CTSC

n 个人排成一排,开始时他们都感染了病毒,有 m 个魔法,第 i 个魔法可以在 ti 时刻把 [li,ri] 中的人治愈,花费为 ci,每个时刻,一个被感染的人 i 会把病毒感染给 i+1i1 ,求最少花费使得所有人治愈。

标签:线段树,最短路。

神题,djwj233 推荐做的。

完全没啥思路啊,考虑两个魔法 i,j,令 li<lj,那么如果 rilj+1|titj|,那么显然这两个魔法操作后中间会都治愈,也就是说可以合并为一个魔法。

然后可以发现如果魔法治愈了边界 1,n,那么那个方向就不会感染过来。

所以大概就是合并成一个 [1,n] 的魔法,问最小花费。

考虑建边,如果满足上面那个条件就连边,最后问从左端点是 1 的魔法走到右端点是 n 的魔法的点权最小和。

暴力建边跑是 O(n2),寄。

可以分类一下,把绝对值去掉。

{1+ritiljtj (ti>tj)1+ri+tili+tj (ti<tj)

一个比较显然的是对于每个 i 必然走 lj>lij 所以上面的成立。

然后考虑咋建边,一开始想的是主席树,但感觉非常阿拉丁。

实际上可以直接线段树,开始时按 t 排序,这样的话相当于查询一个前缀后缀,然后由于是点权和最小,所以在做 dij 的时候每次必然可以更新一个点必然更新,相当于每个点只会被能到达自己的最小的点更新,只会被更新一次,所以更新完了后就直接在线段树上扔掉。

然后具体找的话记录两个右边值的最小值,比较一下,如果该区间中有答案就暴力向下找,因为每找一次 O(logn),且至少会找到一个。

总时间复杂度 O(nlogn)

code


开始板刷 CF *2600~*2700 了。


CF85E *2600

已知 n 座塔的坐标, 把他们分成两组,使得同组内的两座塔的曼哈顿距离的最大值最小 在此前提下求出有多少种分组方案,答案对 109+7 取模。
n5000

标签:二分。

考虑二分答案一下,那么久相当于知道了有一些点对他们不能分到一个组里,显然可以建二分图,然后染色判断一下,第一问做完了。

考虑第二问,建出二分图,那么实际上对于一个联通块来说有两种方法,直接并查集找一下联通块个数就好了。

时间复杂度 O(n2logn),常熟小一点就过了。

code


CF1344D *2700

给你一个长为 n 的数组 ai ,构造自然数数组 bi 满足
i,bi[0,ai],i=1nbi=k
并最大化 i=1nbi(aibi2),输出任意一组合法的 bi
n105

其实不是很难。

考虑求导一下,得到 f(x)=3x2+A,可以发现斜率单调递减。

考虑暴力咋做,每次选一个对答案贡献最大的,然后向后移动一格,时间复杂度 O(klogn)

考虑由于越取越小,所以满足单调,直接二分一下最大的是多少,然后微调一下就好了。

嘴巴很简单,但实现真的阿拉丁,还卡精度(建议找零点还是用二分。

code


CF1034C *2700

一棵 n 个点的树,每个点有权值。你想砍树。 你可以砍任意次,每次你选择一些边断开,需要满足砍完后每个连通块的权值和是相等的。求有多少种砍树方案。
n106

考虑如果已知每个连通块大小为 t 咋做。

记录一个 ai 表示子树权值之和,然后如果 aimodt=0,那么 i 向父亲的边必须断掉,不断掉就不合法,断掉一定最优。

然后可以发现实际上就是满足

[aimodt=0]=a1t

那么 t 就合法,并且方案数为 1

但是发现 t 的取值很大,不好做。

很妙的一点是考虑 a1t 表示分成几个连通块,容易发现 a1tn,所以可以枚举这个。

枚举 a1t,一个子树产生贡献的实际上就是 gcd(t,ai) 的因数,这些因数有需要满足 a1xn,所以可以直接预处理。

code


CF13E *2700

n 个洞,每个洞有弹跳值 ai,跳一次可以从 i 跳到 ai+i 个洞,维护两种操作。
0 x y 修改 ax=y
1 x 询问从 x 出发跳几次可以 >n ,并输出最后一个经过的洞。
n,m105

标签:分块。

P3203 一样。

考虑如果使用倍增跳,那么修改很难维护,所以考虑使用分块。

之前一道题的思路是记录 nexi 表示 in 步之后的位置,但这个东西在本题中也难维护,因为这是个树形结构。

看题解,发现用 nexi 表示从 i 开始跳,跳到第一个距离 i 超过 n 的点,si 表示这样需要跳几次。

这样就很好维护,因为一次修改只会影响块内的,暴力重构就好了。

时间复杂度 O(nn)

code


CF383E *2700

给出 n 个长度为3的由 ′a′...′z′ 组成的单词,一个单词是正确的当且仅当其包含至少一个元音字母。 这里的元音字母是 ax 的一个子集。 对于所有元音字母集合,求这 n 个单词中正确单词的数量平方的异或和。
n24

标签:高维前缀和,容斥。

一个比较显然的容斥,选一个减去选两个加上选三个,然后做一个高维前缀和。

时间复杂度 O(n2n),然后过了??

看了 CF 提交记录,发现只有一个是 O(2n) 的。

由于最多只会选 3 个,所以设 fi,j 表示集合为 i 选了 j 个的和。

然后发现这个东西像三维前缀和,直接做就好了,时间复杂度 O(2n)

code


loj6194

n 个二维点 (ai,bi) ,询问有多少种排列 p(答案对 109+7 取模)使得执行以下伪代码后留下的点是 i ,即最后 saved=i

saved = p[1]
for x from 2 to n
    if a[p[x]] >= a[saved] and b[p[x]] >= b[saved]
        saved = p[x]

保证 a,b 是排列。
n105

标签:树状数组,dp,数学。

考虑 saved 在过程中形成一个序列 q1,q2...,qk

那么一个性质是对于 qi 来说,所有 xj>xqi,yj>yqj 的数必须放在 pi+1 的后面。

假设有 x 个数需要放在一个数后面,那么总方案数可以推一下得到需要除以 x

假设 piAij 满足条件,那么答案就是

(n1)!A1A2A3...Ak1

需要注意第一个必须选 q1

可以得到一个 dp,直接按上面那个做,然后发现是个二维数点,可以直接树状数组做。

code


CF351D *2700

已知一个长度为 n 的序列 a,定义一次操作为选择三个数 v,t,k,满足 av=av+t=av+2t...=av+kt ,然后把这些数全部删去,删去后可以把该序列重排,现在有 Q 次询问,每次询问一个区间,求该区间至少多少次操作后被完全删除。
n,Q105

标签:回滚莫队。

考虑重排这个东西很有用,因为可以把相同的数放在一起,之后每次操作就是区间不同数的个数。

只有第一次操作前没有重排,问题相当于求一次操作后区间不同数个数的最小值。

一次操作最多去掉一种数,所以判断是否可以删除一种数就好了。

由于一次删除的是一个等差数列,所以用莫队维护一种数当前的左右端点以及公差是多少。

删除比较难做,所以直接回滚莫队,只需要增加就好了。

时间复杂度 nn

code

突然发现有 O(nlogn) 的做法,这里嘴巴一下。

考虑区间不同数的个数很好做,只需要判断是否有出现位置是等差数列的数即可。

然后可以记录一个 lasi 表示最小的一个 lasi 满足 [lasi,i] 区间中 ai 的出现位置是等差数列。

然后这个东西可以 O(n) 预处理,然后查询就和区间不同数个数一样了。


CF1270F *2700

给定一个长度为 n01s
求有多少个区间 [l,r] 满足 rl+1slr1 的个数的倍数。
n2×105

标签:根号分治。

首先可以得到一个比较简单的暴力,枚举一个左端点,然后枚举一下有多少个 1,向后跳判断一下就好了。

会寄,考虑根号分治。

rl+1srsl1=t,如果 srsl1n,可以发现 tn

然后可以化简一下,变成 tsrr=t(l1)(l1),所以开桶做就好了。

时间复杂度 O(nn)

code


posted @   houzhiyuan  阅读(206)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示
主题色彩