2024.07 NOI 模拟赛笔记

柳阴直,烟里丝丝弄碧。隋堤上、曾见几番,拂水飘绵送行色。登临望故国,谁识京华倦客?长亭路,年去岁来,应折柔条过千尺。

闲寻旧踪迹,又酒趁哀弦,灯照离席。梨花榆火催寒食。愁一箭风快,半篙波暖,回头迢递便数驿,望人在天北。

凄恻,恨堆积!渐别浦萦回,津堠岑寂,斜阳冉冉春无极。念月榭携手,露桥闻笛。沉思前事,似梦里,泪暗滴。

7.6#

简单写点省队集训考试题和讲课的题。

T2 UOJ427 化学竞赛#

给定一个大小为 n 的阿贝尔群,再给定一个序列 am,其中每个元素都在群中,q 次询问一个区间内的数的生成群大小。n3×103,m,q1×106

一个结论是 Abel 群可以被直积分解成若干个循环群,即如果 n=p1q1p2q2pcqc,那么 S=Zp1q1××Zpcqc,这个证明以后补一下,读抽代的时候没仔细看。

然后就是 OI 内容了,考察所有 q 为 1 怎么做,不难发现这时候一个向量(我们把数分解掉)的生成群阶数其实就是它所有有数的位上的 p 的积,这个还是比较显然的,因为所有 gcd 都是 1,所以我们就不用管太多东西,只要考虑哪些位上有数。

接着问题转化为求区间并的位数,但是 p 只有 log 种,扫描线 l,维护一些 r 使得这些 r 相较于前面答案发生了变化,这个只有 log 种,而且每次操作 r 集合的变化是 O(1) 的,二分修改一下就是第一个 log

q 不是 1 呢?这时候每位上就不一定是 1 或者 0,但是我们发现把它扩充到 q 就还能沿用上述做法,且较小数一定比大数优,把并换成线性基就可以做到两个 log

T3 UOJ705 黄忠庆功宴#

给定一个大小为 p 的环,q 次询问每次从环上 x 点跳 l 步每步跳 k 个间隔,路上所有点 a 加起来是多少。p质数p,q3×105

暴力做法:断环成链,然后暴力跳。这个做法能扩展到 k 比较小的情况,但是比较大比较无能为力,这启发我们根号分治,但是我们其实并没有什么比较好的做法。

还有一个思路:发现走到边界返回开头这个过程是比较关键也是我们不好处理的,我们能不能尽量把这部分简单化?

两部分殊途同归,有两个做法:

第一个是考虑我们在走 k1 后等价往前走了一格,然后剩下的部分相当于是前面部分到的点全部 +1 ,我们就把原序列划分成了 k1 个公差是 1 的等差数列,如果 k1 很小,我们直接暴力找到这个等差数列,然后算一算就做完了。

但是这两部分还是没办法平衡,kk1 没有必然联系,这时候有个惊人的观察,就是每个 k 必然存在一个分解使得 k=ab 使得两个数都是根号级别的,证明可以考虑所有 abk 中必然有重复(鸽笼),然后大的减一下就有了,有了这个结论之后我们就预处理所有 a 的对应等差数列,问题转化成每次在对应 a 处理出来的序列上走 b1 个格子,然后就运用上面做法解决。

其实这个做法的本质还应该是考虑 k 怎么缩小或者分解成若干个子部分,这样能比较好做,然后你按照每次一步走小于根号所有预处理出来,一次走 k 也存在一个分解在预处理的上面走的步数不多,然后能按照上述方法处理。

但是这个还是很严格,还是太抽象了,于是有方法二:考虑每次我们不走到初始点加一,而是放宽限制,到加小于根号,这个可以发现如果你一次迈过的间隔大于根号,那必然在根号步内能到,证明是类似的,考虑集合 ayy 是你一次迈的间隔,只要有两个的差小于根号那就有解,否则是一个平铺之类的东西,也就不合法。

然后这个就跟上面差不多了,分成根号个公差根号的等差数列,预处理即可,这个的本质也差不多是把等差数列作小的划分,殊途同归。

7.7#

T1 QOJ5034 >.<#

有一张 n 个点,m 条边的带权有向图(无重边、自环),再给定 k 条路径,求一条 1 到 n 的最短路径(不要求是简单路径),使得这条路径不包含给定 k 条路径中的任何一条(包含指连续地经过某条路径)。输出此路径的长度,如果找不到输出 −1。n2×105

不会官方题解,讲一下自己的做法。

先考察 O(n2) 怎么做,如果要做一些平凡的最短路之类的东西,无论怎样我们肯定都要记录一个状态表示现在对于这些限制的违反程度是怎样的,那这个状态我们能做到多好呢?一个方法是注意到如果我们现在同时处于若干条路径的前缀,那我们只要记最长的那条,但是其他条的合法性还是得判断的,怎么判断这个合法性?不难发现这个跟 ACAM 的 fail 很像,那我们把这些路径放到 ACAM 上,终止节点就不能走,fail 子树里的点也不能走。

我们还得加上一些边完善这个图,注意到上面的限制其实不是充要的,因为我们如果走了一条路径组没有的边,但是他的 fail 父亲有,我们还得转过去,这个可以通过继承父亲的后继做到,做这个可以主席树或者暴力合并,我自己算的暴力合并大概是根号,可能更劣,但是很难卡,因此也过了。

而对于一条边 (u,v),我们还得给那些没有包括这条边的路径组上的点加上这条边,还得新建一些点表示走到了这个点但是目前没有处在任何前缀完善这个图,这样表示其实就是把上面 n2 的状态减少,加上边可以对同样的边线段树优化建图之后区间连边。最后直接跑最短路就做完了。

T2 QOJ5029 在路上#

有一棵未知的树,保证树的大小为奇数,你需要找到这棵树重心的编号,你可以进行询问,每次询问你可以询问三个点 (x,y,z),若不存在一条简单路径同时经过三个点,则交互器会返回 0,否则若存在,那么交互器会返回三个点在路径上相对顺序中间的一个点。

这个题要求询问次数 O(n),对于链来说相当于你要找中点,不难发现通过这个操作我们可以找到链的两端,只要每次询问一个点然后扩展两端就能做到,之后就是线性第 k 大,跟快速排序差不多。

树怎么办?这时候重心不再是中点了,我们还是考虑放到链上做,一个关键观察是随机期望两次就能随机到一条链且经过重心,这是很好的,我们还是相当于求带权中点,但是找到之后还得判定,一个快速的方法是摩尔投票,于是现在我们需要解决带权重心的问题。

先找到链上所有的点,链的做法是随机点然后分到两边,这里我们也要把不在链上的点分到两边,但是这里每个点都挂了很多子树,如果你直接做就可能一直找不到重心然后退化多一个 log,于是得带权随机,这个权还得跟 siz 相关,一个方便的方法是直接随点然后找到根,钦定这个点是要随的点,这样就是带权的了,但是怎么找到根呢?直接暴力是跟区间长度相关的,也就是直接暴力就对了,于是这个题就做完了。

实际实现可能还要卡卡常数,但是我是口糊选手,有心情可能会再去写一下。

T3 QOJ5017 相等树链#

给定两棵点集均为 {1,2,,n} 的树 T1,T2。问有多少个点的非空子集在 T1,T2 上均为一条链。n2×105

提纲挈领地说一下,做法细节比较多。

树链问题先对第一棵树淀粉质,然后这时候我们就发现两条需要拼起来的链贡献没办法独立,而且第二棵树的贡献很难处理,这是不好的,那我们就尝试找找性质。

把需要合并的两条链的位置在第二棵树上表示出来,我们把第二棵树上的根定作淀粉质的根,设两条链开始和结束的端点分别是 (x,y)(z,w),根是 u,出于分离两部分贡献的需要,我们找出 (x,u)(y,u) 这两个点集在第二棵树的这条链上最左和最右边的节点,尝试用这些节点到根的路径表示整个集合,这样就第二棵树把贡献拆到了点上

再分离 x,y 的贡献,考虑 zw 分别属于哪个集合:

如果都在 (x,u) 里面,那么就只用 (x,u) 中节点在第二棵树上的到根信息,然后用这些信息跟 (x,u) 来计算和判断,可以用异或哈希;在 (y,u) 同理,如果不同,那么就刚好 (z,w) 每个一个。

列出式子,合法其实就是异或相同,然后分别异或到两边就能分离 (x,y) 贡献了,具体式子可以看 solution,这里我懒得写了,aibi 都是固定的,求出来的细节比较复杂,不过也不难,然后就是哈希和计数了。

但是还有一个问题,如果 aibi 在同一个子树,然后刚好有一个或者若干个不是 (x,u)(u,y) 的交,也会被我们统计到,这个需要分类再算一遍相同的贡献并减掉,这样才算真正做完,不过感觉代码写起来一坨。

7.9#

昨天普及场,就没写笔记。

今天也是简单题,但是写得一坨。

T1 aw#

给定一棵 n 个结点的树,结点 wawaw,定义一组给所有 n1 条边定向的方案的权值为:按输入顺序依次考虑每条边 uv 将结点 uaw 全部移动至结点 v,最终每两个 aw 所在结点之间的距离之和。两个结点之间的距离为它们在树上的最短路径经过的边数。求所有 2n1 组方案的权值之和,对 998244353 取模。

点对距离套路地放到边上考虑,这条边对距离和的贡献就是 sizu×sizv,那如果加上移动呢?不难发现修改对答案的影响其实很小,在不动这条边之前,子树大小不会动,而移动后权值的改变只和移动时两边的点权相关。题目性质很重要,这启发我们从小到大考察每条边,然后 dp 记录所有方案下两边的权值。

fu,t 表示 t 时刻 u 点所有可能权值之和(一共有 2t1 种权值,有的相同,看前面怎么操作),那一次操作的转移即为:fu,tfu,t1+fv,t1fv,tfu,t1+fv,t1。注意中间可能要补充若干个 2k。最后贡献是 (sizugu,t)(sizv+gu,t),我们由于这里面有二次项,我们还得维护一个平方和,但是维护平方和的时候你发现我们需要支持两个序列对应位置相乘,类似点积,这非常难做。

那怎么办呢?要点积是因为我们把权值和事件绑定在一起了,导致对应事件只能互相相加然后平方,这里感谢 HeHeHyt 佬,一个重要的观察是两边是独立的,我们就不用管具体情况,只要两边单独算然后直接卷积就行,或者一个更方便的情况是算期望,这也是发现方案不好算之后的一个解决方法,因为期望可以直接卷积。

T2 awa#

给定两个由小写字母组成的字符串 s,t。求有序二元正整数对 (x,y) 的数量,满足 1x,yn,且 s 的长度为 x 的前缀和长度为 y 的后缀拼接得到的字符串是 t 的子串。这里,拼接表示将后一个字符串拼在前一个字符串之后。

赛时没空想了,但是后面发现其实很简单。

首先考虑我们肯定要找到某些办法确定一些东西,不然限制太散不好直接求,多试试就发现枚举拼接起来的位置是比较好的,那问题就转化成有多少这个位置向前或向后延伸的字符串是 s 的前缀和后缀,这个可以直接考虑把 s 的前后缀放到 t 的 kmp 自动机上跑,然后合法的一定是跑到 i 位置的祖先。

那我们现在就要求合法点对个数,枚举所有位置的两个点的祖先会有重复,我们不妨直接枚举 x 有多少个合法的 y,而 y 的取值范围是 x 子树内所有合法的 x(就是某一位置的最长前缀的匹配长度)对应的 y。然后这个是子树问题,在正串失配树上启发式合并维护虚树大小就行,值得一提的是我今天才知道线段树合并可以做 1 个 log。尽管我做过 ZJOI2019 语言那个题。

T3 awaw#

m×m 的网格上有 n 个矩形,第 i 个矩形覆盖了 aixai+w1biybi+h1 的所有格点 (x,y)。求没有被覆盖的格点形成的所有四连通块的大小的平方和。所有 wh 都相同。

这个题出奇简单,关键就在于考察所有 wh 都相同。把整个网格分块分成若干个 w×m 的小块,考虑每个块中的空白方形,所有方形个数是 O(n) 的,双指针找到后相邻的连边并查集即可。

7.10#

技不如人,甘拜下风。

T1 QOJ7877 等差#

给定一个初始为空的数列,每次往数列末尾插入一个数,并询问是否存在一个 32k+1nk 使得数列每个下标模 k 相同的位置形成的子数列都是等差数列。n2×106

注意到一个 k 不合法后不会再次合法,也就是有单调性,这就给我们两种思路,一种是实时维护所有合法的 k 并把不合法的排除掉,另一种是求出所有 k 合法的最远右端点,两种思路需要解决的问题不一样,而后者是有单调性的,性质更好,可以二分,于是我们选择后者。

二分之后就变成了判定在某个 k 下某个前缀是否合法,看着很难做?但是其实有字符串哈希的妙妙方法,考察我们把每 k 个作为一段哈希,也就是看做一个很大的数,那么原来的条件其实等价于对于每个在中间的数 i,都有 ci1+ci+1=2ci,不难发现这和原来的条件等价,而且非常好判定。

但是我们其实还可以去掉这个 log,考虑像 exkmp 和 manacher 一样维护最右边的 r,然后试图暴力往右拓展,这样就可以做到线性。

T2 叉积#

在平面直角坐标系上有 n 个点 A1,A2Anm 次询问,每次询问给出一个点 P,请找到区间 [l,r],使得 i=lrOP×OAi 并输出这个最大值。

考察叉积有分配率,我们可以直接算前缀和,或者考虑 O(nm) 的暴力,维护类似区间最大子段和的东西,但是后者牵一发而动全身,不方便维护,于是我们考虑从前缀和下手减少要考虑的向量。

把叉积的式子写出来后可以发现最优的点其实都在凸包上,也就是说我们要求出所有前缀和相减的凸包,这里只能后面减前面,减法凸包和加法凸包类似,以及前面的线段树最大子段和算法,启发我们在序列上分治然后闵可夫斯基和维护凸包,这个题就做完了。

T3 qoj1262 序列变换#

给定数列 a1,a2,,an,保证 ai 互不相同,你可以进行如下操作任意次:选取 1i<jn,将 ai,aj 加一。操作完毕后 ai 仍然需要互不相同。又给定数列 b1,b2,,bn,保证 bi 互不相同,请问有多少种操作序列能够将 a1,a2,,an 变成 b1,b2,,bnn30,bi200

感觉很精妙的推柿子题,综合运用了很多知识!

首先是一步非常智慧的转化:我们把 {an}{bn} 写在类似一条河的两端,每次操作就相当于选取两个 a 网上走一步,问题转化为不相交格路计数,这个转化太牛了!我想的是相当于有一队 1 不能越位,整齐地往前走,但是这种转化把问题变成了更容易求解的形式,方便我们用计数方法来解决。

然后就是一些比较平凡的操作,应用 LGV Lemma,把行列式拆开,我们要求的就是 σ(1)sgn(σ)f(i,σi),其中 f(i,j) 表示 ij 的路径条数,乘积里面的东西也就是每个 iσi 的可交路径方案数,由于有每次选两个往前走的限制,我们不能直接算 f,而要算路径组的方案数。

怎么算路径组方案数?问题等价于我们现在有 n 个变量,每次可以选两个不同的变量减一,问最后变成 0 的方案数。先算出没有相同变量的方案数,设 di=biai,S=di,考察我们现在有 S 个有标号盒子,表示每次操作是减哪个变量,注意这里每两个变量之间无序,最后要除以 2S2,那这个就是放小球方案数,也就是 12S2(Sd1,d2,,dn)

然后要加上条件,把选不同变量这个条件容斥掉,设 i 这个变量被容斥了 ki 次,k=ki,写一点简单的组合数,就能列出方案数为:

k1,k2,,kn(1)k2S2(S2k)(kk1,k2,,kn)(S2kd1,d2,,dn)

这里的 ki 不好处理,我们把组合数拆开,发现其实带 ki 的项都可以提出来,然后外面是 k=ki,这启发我们写成生成函数的形式,设生成函数 P(x)=gixigi 表示有关项系数,然后我们就不用枚举了,内层直接卷积就行。

然后看到最开始,由于我们用生成函数分离了各部分,也可以直接求行列式了,暴力维护多项式会超时,我们可以把变量代几个值进去然后后面插值,这样就能通过全部数据,考察知识全面的一道好题!

7.11#

FJOI 场。本来不想写了但是这个 T1 我有点不太会。

T1 P5998 Plemiona#

给定 n 个矩形,有公共点的矩形会进行合并并变成一个恰好包含两个原矩形的新矩形,问不再有合并发生时的所有矩形。

矩形并首先考察扫描线,我们扫 x 维用线段树维护 y 维,现在要做的就是合并两个相邻的矩形,扫描线后变成合并相交线段,这个东西可以放到线段树上处理,有线段相交等价覆盖到的节点至少有一对在线段树上有父子关系,那我们直接插入的时候遍历所有访问到的节点看能不能合并,记得合并完懒惰删除。

T2 QOJ888 Travel around China#

给定一个 3×n 的网格,点有点权,问任意不同两点间最短路的和。

额,我能说啥,网格图最短路的一个常用方法是分治,然后你只要处理到中间最短路,dp 即可,然后就做完了。

T3 燕鸥#

燕鸥年复一年地往返于南北极。燕鸥的行程一共经过 n 个补给站,它的初始体力为 0,第 i 个补给站能补充 i 单位体力。燕鸥的飞行高度和体力正相关,如果它的体力不小于 i,那么它会因为飞得太高而错过补给站,这样它反而会损失 i 单位体力。燕鸥可以对任意一个补给站使用一次提醒机会,这样它一定不会错过那个补给站,从而补充 i 单位体力。请你帮燕鸥求出,它选择哪些补给站使用提醒机会时,它的最终体力会落在区间 [L,R] 中。

注意到这个东西的规律大概是 x+1,x+2,(x+3),然后一直加减加减删到 0 然后继续这个规律,不难发现每重复一次长度乘三,而且加减加减的部分如果你强制钦定减法,这之中有很多答案是重复的,只考虑不重复的即可。

7.12#

T1 电车#

给定 n,你需要计算有多少个 1n 的排列 s 满足完全积性函数的性质。即对于任意 1i,j,i×jn 都有 ai×j=ai×aj

先考虑一些性质,由于这是完全积性函数,每个位置上的值必然要满足某些限制,但是从限制的角度来看比较难考虑,我们不妨只确定质数位置上的数并考察这种钦定是否合法。

首先,单位排列肯定是合法的,那其他排列呢?不妨只考察两个质数能否交换,因为每个质数相对独立,一个质数的位置比较不会受到其他的影响。如果我们交换这两个质数下标位置上的数,不妨设为 p1p2,那其实相当于我们对于所有有 p1p2 作为质因子的数作了交换,即对于所有 c,交换 cp1cp2 位置上的数。

不难发现这种交换可能不成立,不成立当且仅当存在一个 c 使得 cp1cp2 有一个不小于等于 n 而另一个小于等于,这样二者构成的数的集合大小不同,也就不能交换,那交换合法的情况也显而易见了,因此我们只要判断二者集合大小是否相同,一个观察是我们只要判断两个数 np 相不相同就行,这个只要整除分块,在一个区间内的数都可以任意互换,就做完了。

T2 波长#

对于一个序列 a,可以对其进行若干次操作,每次将一个数减少 1。定义 fk 表示进行 k 次操作后序列的最大子段和最小能达到多少。给定 a,K,计算 k=1Kfk,答案对 998244353 取模。

看起来很典但是很神秘的题,考场上糊了一个贪心+线段树,直到最后也没调完,现在想想应该是贪心的部分假了,不需要猜结论的做法还是舒服。

这个东西看着就很不好做,既然不猜结论贪心那我们就先往判定的角度想,考察对于一个值 x 和一组方案 bi 判断是否合法,bi 指的是在 i 位置操作多少次,那我们设 {bn} 的前缀和是 {dn},条件等价于 k=jiak(didj1)xdidj,这个东西化化式子就是个差分约束,相当于要跑个最短路。

但是这个边太多了,我们不能直接跑最短路啊,但是这个边也没有什么性质,不太好做,没有性质创造性质,令 didi+j=1iaj,那这时候最短路上的边权就变得很简单了,我们跑最短路的过程相当于一路走 ai 边然后突然跳一个 x,问你最短路是多少。

但是这个最短路是依赖 x 的,而我们不能枚举 x,只能考虑确定其它的东西,这时候你发现如果我们确定选了多少个 x,那么确定边怎么走是唯一的,这就很好了,而且这还很好求,就是求若干个不交子段的最小和,每次贪心选然后 reverse,相当于一个反悔贪心。

然后你就发现这是若干个一次函数,我们可以放到凸包上,原先要求的是所有操作后的最大子段和最小,现在我们建的凸包相当于给你子段和求最小操作次数,所以你相当于要对 yx 的和,然后可能得类欧,不知道有没有更高明的做法。

T3 捕获#

不会,有没有人教。题解太抽象了。

7.13#

UNR DAY 1,没写题,下午 mai 去了,UNR 之后不能摆了。

UNR8 D1T2 UOJ888 里外一致#

给定一个序列,有 q 次询问,每次问序列中的一个区间有多少个子集满足子集内颜色数等于补集颜色数(补集是区间),对 264 取模,n3×105

这个主元法太牛了!利用模数性质实在是没绷住。首先我们你考虑把所有颜色都拉出来,然后选两个集合大小相同很容易就能让人想到生成函数,设 ci 表示颜色为 i 的数的出现次数,那我们就相当于要求 [x0](x1+x1+2ci2),负指数不好处理,全部乘 x,就有 [xn](x2+1+x(2ci2))

然后怎么办呢?二次项是难处理的,考虑先做一些简化,我们设 y=(1x)2,然后答案就是 [xn]((x1)2+2cix),类似二项式定理,我们独立两部分贡献,设我们选了 K(x1)2Gi=2cix+1,答案就变成 [xn](x1)2KxnK[xnK]Gi,再把 (x1)2K 拆开,有答案为 (1)K(2KK)[xnK]Gi

这就是纯纯的卷积形式了,但是我们单独算一项肯定是不好算的,这时你发现模数是 264,如果 K 太大组合数会变成 0,否则卷积项会变成 0,换言之,我们卷积中要保留的项其实次数不超过 64,答案也不会超过两倍的这个值(一个不精确的上界)。

暴力卷积是三个 64 的,我们有若干优化方法,例如先 ln 再 exp,这时要把若干一次多项式并行计算,或者直接发现是微分有限的然后整式递推,这个你可以设原式为 F,导完就有 F=F×C1kx 这样的形式,而这是好做的。不过你也可以从大到小卷积,因为每个贡献是 2ci,所以你贡献若干次就会变成 0,然后就能大致分析一下得到是两个 log,就做完了。

水 u 群的时候发现一个小结论,说模 264 意义下逆元是 x2621,网上查了下简化剩余系得结论,发现它的缩系是一个循环群(元素数为这个数除以 4)与 {1,1} 乘法群的笛卡尔积。然后就有这个结论?其实不是很懂,有空再看看初等数论。

UNR8 D1T3 UOJ889 二维抄袭检测#

给定一个字符串矩阵和字符串,每次问一个子串在矩阵某个位置开始的最长匹配长度,只能向右或者向下走。n10

如果我们考察匹配的过程可以发现在 n4 的时候是有贪心解法的,但是 n 一大路径结构就会变得复杂,于是我们不妨从朴素的 dp 入手。最简单的 dp 是设 fi,j 表示这个位置能不能到,然后转移,bitset 压位可以做到 104 级别,但是再往下我们就需要优化转移了。

考虑这个东西很能矩乘优化,但是每次询问转移矩阵都不一样,我们得先解决这个问题。先做点简单的处理,把第 i 行右移 i1 个单位,然后你每次要么向右要么向右下。如何控制转移矩阵呢?我们得找到每次转移的相似处,考虑你每次在第一行最长能匹配到哪个位置,从初始位置到这个位置的这段区间的转移矩阵只跟矩阵有关(前提是匹配),是固定的,你先在这部分矩乘,不行了栽往下跳,然后继续重复上述操作。

接着就是上猫树,压位矩乘,然后利用非 0 元素个数优化,就做完了。

7.14#

UNR DAY 2,还是没写题,下午去打羽毛球。T2 对格点分治然后小优化,感觉不怎么 educational,就不写了。

UNR8 D2T1 UOJ890 兵棋#

小重和小庆正在下“兵棋”。n 个士兵棋子排成一行,每个士兵要么是小重的要么是小庆的。接下来有若干天,每天如果第 i 个士兵和第 i+1 只士兵不属于同一玩家,那么第 i 只士兵会击杀第 i+1 只士兵。所有击杀操作会同时进行,士兵被击杀后会被移除。例如,如果某一天第 3 个士兵击杀第 4 个士兵,第 4 个士兵击杀第 5 个士兵,那么结果就是第 4 个和第 5 个士兵都会被移除。现在小重和小庆已经在一些位置上摆好自己的士兵了,但他们还没确认其余位置摆什么士兵。你需要对于所有方案,求出 k 天后剩下的士兵数的总和,答案对 998244353 取模。

我真不觉得这个 dp 有多好想,如果你没有去想对时间轴记录的话,反正我想了 45min 左右,可能还是得想想朴素的东西。

找性质很难,考虑每个点会不会被删只跟前面的数怎么边有关,然后你暴力记录前一个位置每个时刻是 0 还是 1,然后转移的时候类似给最低位加 1 和减 1,但是你发现我们不关心具体方案,只关心有多少个 1,然后记录这个就做完了。

UNR8 D2T3 UOJ892 大海的深度#

若干次单点修改,求整个序列所有子区间 min 和。n2×105,时限 8s。

对答案贡献的拆分不同,引导出了两种不同的解法。

O(nn) 解法#

对序列分块不太好做,考虑对询问分块,把这几次询问涉及到的点拎出来,这些点把整个序列分成若干段。在这种情况下,我们可以把答案看作 (iprei)(sufii)ai,因为 presuf 是相对好维护的。

先考虑 pre,不难发现分块后每个块内的所有操作只会对每个段的前缀最大值有影响,你把这些有可能被影响的数也拉出来,其他的贡献直接加,然后考虑每次的单个询问,把受到影响的数和每个段的最小值拉出来跑单调栈,因为只有这些数会对 pre 有影响,每个影响的位置是一段区间。

如果每到一个段,我们都把单调栈所有数拉出来找影响区间然后算贡献,这最优只能做到 O(n53),但是其实你考虑到每次单调栈加入这段最小值的时候,只有被 pop 掉的数才对这段里的 pre 有贡献,否则段中的 pre 都是单调栈中固定的一个数,换言之,除了被 pop 掉的数,其他只有 O(1) 个数有贡献,随便处理一下就能做到 O(nn) 了。

O(nlog2n) 解法#

考虑直接处理每个区间,分治,考虑所有跨过中点的区间,然后从小到大扫描 x,线段树维护每个时刻离分治重心左边和右边第一个 x 的数的位置,从小到大 segtree beats 维护即可。

作者:eastcloud

出处:https://www.cnblogs.com/eastcloud/p/18288095

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   eastcloud  阅读(207)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示