2月做题记录

2月做题记录

✩ trick
✯ 会大部分,要tj提示
✬ 会小部分/完全没想到,看了tj才会
◈ 脑电波
✡ 有某一算法的神秘通用性质
⊗ 待补

【PR #14】安顿 ✩✯

我组合数化式子咋恁烂呢

k=2K

区间异或和可以用前缀异或和差分一下表示,且显然前缀异或和数组一一对应了一组A,所以直接考虑前缀异或和数组

相当于要求选出一个极长子序列,满足相邻俩元素的异或和不为X,且0n必选

这个条件是比较严苛的,对于所有v[0,k)考虑把vv xor X标为同种颜色,那么对于所有同色的极长连通段,设里面两种值分别有ab个,则它的贡献就是max(a,b)

X=0是一种情况,X0是另一种情况,且X0显然等价

对于一个长为len的极长同色连续段,其概率为(k2k)2(2k)len1,总贡献是i=0lenClenimax(i,leni),在ilen2时和后半对称,所以只考虑一半

需要快速计算i=0len12iCleni,化一下式子得到leni=0len121Clen1i

f(n,m)=i=0mCni,则递推式有f(n,m)=2f(n1,m)Cn1m,然后差不多就是可以直接推

当然对于这个段在两端的情况就概率那去掉一个k2k,然后还有整个序列都是同一个段的情况,单独搞下就好

复杂度O(N)

【PR #14】狼抓兔子

最开始想的是显然狼的匹配肯定不会出现,i<j,但matchi>matchj的情况,所以可以来个O(N2)dp

然后正解是维护dp[i][j],表示1i位置,现在有j只兔子要往后匹配,若j是负的代表狼

  • 每走一步,要+bi+1×|j|
  • 如果当前是狼,若有a只,显然dp[i+1][j]=dp[i][ja]
  • 若是兔子,有a只,不必全部放下去,则有dp[i+1][j]=mink[ja,j]dp[i][k]

显然每一步都满足凸包性质,只需要支持加上一个V字形函数,整体左移,部分右移即可

可以平衡树维护的

好像有反悔贪心的做法。。。?

【PR #14】字符串 ✡✩✬

首先有个显然的在trie树上dp,列出式子然后可以高消,复杂度O(NM3)

然后可以考虑用一些主元来表示所有的元素

注意到n很小,可以考虑重链剖分,把每个重链头当作主元,显然只有O(N)

???这怎么想到的啊

考虑怎么用主元表示所有dp表示dp式,注意到转移式dpx=1+cpcdpch[x][c],注意到ch[x][c]只能指向x的儿子和depdepx的点,它们的表达式都已经得出了,又因为x只有一个重儿子,其他的儿子全都是主元,所以就能表示出dpsonx

复杂度O(N3)

CF2045J Xorderable Array

对于限制,AipAjqAiqAjp,要异或上的东西涉及pq,导致式子很麻烦

所以变换一下,设bi=Aipt=pq,则限制就变成了bibjtbitbj,已经简易多了

现在枚举p,看哪些t合法,比较大小显然从高往低位

  • 若当前位t0,则必须把bi在这一位是0的放前面
  • 若当前位t1,此时bi在这一位不能有相同的值,无其余限制

我们称每一层还放到一起的那些数的集合为等价类

发现每一层的划分只和bi在这一位是否相同有关,即完全可以用Ai替代bi进行这个操作,那么就没有必要枚举p

进一步的,对于t当前位为1时,此时每个等价类的大小都必须2,且显然无论何时,每个等价类都是把Ai排序后的一段区间

所以可以一开始先确定前d层的t必须是0,且进行完d层操作后,才会导致所有等价类大小2

此时把大小2的等价类的ii+1(排序后)的AiAi+1存到集合S

考虑当前S中剩余的数在当前层的值

  • 存在0,此时t在这一位只能是0,然后所有S中在这一位是1的就被扔了
  • 都是1
    • t在该位是0,那么S直接清空,t后面的位就随便填了
    • t在该位是1,那么S不变

若建一个0/1trie,合法的t就是从跟走到叶子的一条路径,其中可能某个节点的不在路径上的那个子树的全部点也都可以选

可以发现,这也代表着tmin{AiAi+1}

那么方案数就是简单的了

NQ同阶,复杂度O(NlogN)

P4704 ✩✯

显然直线和圆的交点会选在圆的两个结点的中心,然后和这条直线相交的线段是那些两个端点不在被该直线划分出来的两个弧的同一个弧的

发现对直线直接考虑怎么放不好做,转为考虑直线和圆的那些交点

显然对每条线段,被它划分的两个弧里都至少要有一个交点,发现只要满足这个条件,然后若点有k个,连k2条直线就好(就把点顺时针排序后,一个点连它对面的点)

拆环为链,如果是序列,那么就是贪心,找到最前面的ri即可,但是拆环成的链就有点问题,那么可以考虑枚举断开的地方,并钦定它这里是一个交点,然后倍增的跳就好

这样是O(NlogN)

但是可以做到线性的,考虑所有限制区间中最短的那个,设它的长为d,注意到所有的关键点间的距离都d,也就是说,我们可以一边枚举这个最短区间中的那个关键点,然后再O(nd)的模拟贪心的过程

总复杂度就O(N)

CF1693F

这道题比较经典吧

首先显然每次操作都会有c0=c1

那么根据当前是0还是1更多,以0更多为例,找到最末尾的0,然后找到最长后缀满足后缀中c0=c1,然后操作

可以O(NlogN)

当然也可以把前缀和存下来,然后实时维护一下

可以做到O(N)

CF1329E ✩✯

一开始一直在想构造的方式,但是并没有太多进展

这种就转换思路,考虑怎样的(L,R)合法,显然它的充要条件是:

  • iciR1ciL1
  • m+ciRkm+ciL

剩下的就简单了,显然对于第二个条件,能得到L的上界L0R的下界R0

  • L0R0

    此时答案一定为0,取任意L=R[R0,L0],因为ciRciL,且ciRciL,所以一定有ciR=ciL

  • L0<R0

    因为1+ciRciL,且当1+ciR=ciL就不合法了,所以对于每个点i,都会有组限制(ui,vi),表示LuiRvi至少要满足一个

    要求把所有二元组分成两组ST,使得maxiTviminiSui最小,显然可以按ui排序后从大到小扫即可

复杂度O(NlogN)

CF1637H ✯✩

考虑选出的位置集合是S,逆序对数量的减少量Δ=iS,jS,i<j[pi>pj][pi<pj]

有一个重要的性质,对于任意逆序对(i,j)i<j&&pi>pj),若把i选到S中了,也必须把j选到S

考虑证明:

为方便描述,把(i,pi)当作一个二维坐标上的点,那么以(i,pi)(j,pj)为中心划平行于坐标轴的直线,则其余所有点被分成了九个部分,从上到小,从左到右,标号为块19

考虑每个部分在把S中的i替换成j后对答案的贡献

  • 首先把i替换成j本身就有1的贡献

  • 对于四个角,块1,3,7,9,显然无变化

  • 对于这个十字形的部分,发现只有块2S的部分和块8中不在S的部分产生的Δ>0

    此时,我们采取这样的策略,一直把l往块2中在S的点跳,r一直往块8中不在S中的点跳,直到不能跳,此时把l替换成r一定不劣,然后再沿着这个跳的路径跳回来,再继续换

    显然这样就证得了我们的结论

有了这样一个结论后,再来考虑把总的贡献尽量拆分成S中每个点的贡献,设di=j<i[pj>pi][pj<pi]=i12j<i[pj<pi],那么总的Δ=iSdi2i,jS,j<i[pj>pi]+|S|(|S|1)2

根据我们的性质,对于一个ji,jS,j<i[pj>pi]就是j<i[pj>pi],那么设di=di2j>i[pi>pj],答案就是选前k大的即可

这里能直接选前k大的,是因为,设vi=2j>i[pi>pj],显然viinv({S}),所以如果选到的方案不合法,就会有>成立,也就是说算出的值比当前这个不合法的情况都不优,显然也不会优于合法的情况了,显然不优

复杂度O(NlogN)

CF1481F

设树高h,显然最优情况是ans=h,此时用背包判一下即可,用二进制分组可以做到O(NN)

猜测其余情况就是ans=h+1,构造方法是简单的:

遍历每一层,设ab的余量分别为rarb,若该层有k个非叶节点,则有2kra+rb,取大的那个把k填满,然后尽量填满该层的叶子,如果填不满,就可以结束了,因为剩下的点都用另一种颜色填即可

GYM101221A ✩✬

我不会构造,玉玉

首先构造的trick就是尽量考虑递归到子问题去

手摸可以发现答案是n,且它就是下界,考虑证明:

最终有2(n1)个字符满足它们后一位和它相同,而每一次操作最多增加两个,第一次操作最多增加一个

考虑怎么构造,这个证明的方式也给我们提供了思路

显然实际有用的空位只有俩,那么现在就是 _ _ B A B A ... B A B A,把最后一个 A B放到前面去,变成 A B B A ...B _ _ A,再把第五位和第六位拿到空位上,变成 A B B A _ _ ... B B A A,对于中间的部分就可以递归处理了

AGC024E

发现每次插入的数,只要满足在它插入的位置后第一个和它的值不同的那个数的值小于它即可

又考虑到对于一段数值都相同的区间,任意顺序的插入会导致算重,所以钦定每次插到末尾

即我们只需要满足插入位置的后一个数值小于当前插入的这个树值即可

这种类型,显然考虑An的形态,再从An的形态考虑插入顺序的方案数

dpi,j表示已经有i个数,插入了jk,转移考虑枚举j出现的第一个位置k以及时刻p

dpi,j=kpdpk1,j+1×dpik,j×Cipik

pCipik预处理下就可以做到O(N3)

AGC041F ✩✬

第一眼会想到要容斥,钦定S集合内的点一定不被覆盖

直接这样考虑没前途,发现对于S中的点,其所处的列一定不能放棋子,且注意到列都是连续的,所以转为枚举列的集合S,表示S内的每个列中都会有一个被钦定不能覆盖的点

考虑每一个连续行,长度为len,和S的交集大小为a,则贡献如下:

  • a中的全都没被钦定,2lena
  • a中有被钦定的,i=1aCai(1)i=[a>0]

但是注意到只是这样是可能会存在S中某一列中没有被钦定不被覆盖的点,所以再套一层容斥

枚举TS,表示T中的被钦定为 没有被钦定不被覆盖的点,T会带一个(1)|T|的系数

还是考虑每一个连续行,长度为len,和S的交集大小为a,与T的交集大小为b,则贡献如下:

  • a中的全都没被钦定,2lena
  • a中有被钦定的,i=1abCabi(1)i=[ab>0]=[a>b]

发现答案只与a,以及[a=b]有关,那么考虑从(a,[a=b])这个二元组入手,得到代价,再乘上可能的(S,T)的系数和

trick,反过来算,原本是(S,T)(a,[a=b]),现在变成(a,[a=b])(S,T)

把棋盘划分成类似树形的样子(即每个连续行为一块,相同的连续行自然可以合并起来),发现点ua是儿子的a之和再加上u独有的列在S中的部分,[a=b]是儿子的[a=b]的并再并上u独有的列是否有[a=b]

复杂度就是树形背包再加上代价的power,复杂度O(N2logN),可以预处理power使得复杂度为O(N2)

ARC093F

直接计算很不好做啊,考虑容斥,钦定1的祖先中,S内的点都能打败1

朴素的dp就是设dp[s][t]tm中钦定用的点的集合,然后发现根本不用这样,直接设dp[s][i]表示当前m中钦定用的最小的点为i即可

复杂度O(2NNM)

ARC100F ✩✯

首先容斥,用所有的序列的权值-不合法的序列的权值,前者就是(nm+1)knm

对于后者,分为两个大类来处理:

  • A中的元素互不相同

    • |A|k,准确来说,是A中存在k的连续段使得区间内元素不相同,直接不用管了
    • |A|<k,注意到无论A的具体形态如何,答案都是一样的,那么直接算出所有不合法的序列中包含了多少m长度的连续段满足段内所有点的颜色都不同,这个直接f[i][j]g[i][j],分别表示当前长度为i,最长满足元素两两不同的后缀的长度为j的方案数和权值和
  • A中存在相同的元素

    此时,枚举A所处的位置,因为被A划分后空白的两段互不影响,所以直接先预处理dp的值,最后弄一下就好

复杂度O(NK)

这题主要就是要想到按A内是否有重复的元素来算

qoj5367

发现操作可以表示为,每次先操作root的子树,直到除了它的某一棵子树外,其余都空了,再递归进那棵子树进行同样的操作,且要保证,对于当前root,不能让相邻的俩是同一棵子树里的

那么可以dpu,i表示当前递归到u,且u子树内剩余i个点没被操作,转移考虑设fk,i,j,表示操作了前k个子树,当前层共操作了i个点,钦定有j组相邻的是同一子树内的,转移的系数都是组合数

复杂度O(N5),实际大大滴跑不满

[ROI 2017] 学习轨迹 ✯✩

首先答案的下界是两个序列的和的max

这说明,我们在两个序列中选的这两个子区间,至少有其中一个要满足它的区间和大于原序列和的一半,假设是a中的

那么找到a中第一个p满足p的前缀和大于a的总和的一半,则在a中选择的区间必定包含了p

这里很牛啊

现在对b扫描线右端点r,维护左端点l,显然ra中对应的位置会让ap所处的极大区间产生变化的,只有一个后缀,维护一下即可

复杂度O(NlogN)

ARC053D ✩✯

首先显然会想到,设f[i][j]表示a目前头是ib的头是j时,后续的c的方案数

转移有f[i][j]=f[i+1][j]+f[i][j+1]

发现当ai=bj时可能会重,考虑计算重复的情况

发现我们的操作可以弄到图上,即一个网格图,左上角是(1,1),右下角是(n,n),第i横行的边的值都是ai,第j竖列的值都是bj,操作就是每次往右或往下走,从(1,1)走到(n,n),两条路径不同当且仅当它们某一步经过的边的权值不同,求方案数

那么我们现在就在点(i,j),可以发现,所有f[i+1][j]f[i][j+1]重复的路径,提出其中某两条,他们一定一个包含(i+p,j+q),另一个就包含(i+q,j+p),那么都一定会在某处(i+k,j+k)重合,其中ai+k=bj+k,且路径中所有相同权值的行和列,都一定相交在(i,j)(i+k,j+k)的线段上

那么枚举k,中途要求不能相交,用卡特兰数即可

复杂度O(N2).

[USACO24JAN] Merging Cells P

直接dp[l][r]表示[l,r]的标号能留存到最终的答案,以dp[i][r]为例,转移有dp[i][r]×1ridp[l][r]sumil1sumlr),显然前缀和/后缀和优化一下就好

复杂度O(N2)

P9318 [EGOI 2022] Lego Wall / 乐高墙

根号分治啊

考虑以下两种做法:

容斥,钦定某些相邻的列不连通,这个复杂度O(W2)

直接dp[i][j],表示现在前i列连通,且第ii+1列间有j个长度为2的积木横穿着,复杂度O(H2W)

平衡一下,总复杂度O(N43)

P10432 [JOISC 2024] 滑雪 2 (Day1)

分析一手可以得到,会增加hi当且仅当jhj=hi&&cjcihi+1后可能继续升高,就用新的hi为标准去看

一个点只要hi++过,那么它就不可能会增加接口

那么说明有用的h(有特殊操作,如加入一些点,或增加接口)就只有O(2N)hihi+1)个,考虑dp[i][j][k],表示当前考虑离散化后的高度i,有j个点要上升到高度i+1,留了k个接口

当然这里可能有的实现把加入接口直接就立刻加入的话,可能可以做到只需要把hi压入状态中即可

同高度的点显然只会取c最大的j个往后放

复杂度O(N3)

P10197 [USACO24FEB] Minimum Sum of Maximums P

考虑这样一个情况,若只钦定了a1an,此时最优该怎么办

钦定a1an,权值i=1n1max(ai,ai+1)=i=1n1ai+max(0,ai+1ai),显然最优情况就是区间和(除去an)+最大值-最小值,只需要将a2n1从小到大排即可

对于a1an的情况倒过来即可

再考虑到这样一个性质,所有相邻关键点的区间包含的点的值域(除了关键点),要么包含,要么不交

那么直接dp[l][r][s],表示区间[l,r]能填满S中的区间的最优答案,转移是简单的

复杂度O(N23K)

【NOIP Round #5】青鱼和区间 ✯

题目的要求等价于,对每个点i记录一个si,表示覆盖了i的区间的集合,那么就要求所有的si互不相同

对于不合法的,即存在si相同的,我们考虑两对点(i,j)(a,b),满足si=sjsa=sb,那么(i,j)(a,b)满足,要么包含,要么不交

这里我一开始一直在想区间dp啊,但是是从二项式反演那方面入手,容斥的很怪,反正就是得不到二项式反演的形式(

发现其实做麻烦了,原本的想法是,对于所有si相同的都要在区间dp的转移中作为端点存在,这样很麻烦,考虑只把si相等的那些点的最小和最大的,记做lr点作为dp转移中的端点存在,然后[l+1,r1]内部的点的边随便连

这样我们的序列[1,n]就分成了很多块,设有k块,显然要求是k=n,假设已经求出k<n时的答案ans[k],那么只需要用ans[k]乘上我们的划分方案,发现这是一个不合法的方案数,且所有k对应的方案数不重

复杂度O(N3)

其实正解就相当于只保留了我原本想的那种dp的最外层啊,还是要多想一下转移有没有弄复杂

【NOIP Round #5】青鱼和怪兽/[ARC016D] 軍艦ゲーム ✩

思路差不多,就用前面这个举例

转移设dp[i][j]为玩家i点,怪兽j点时的期望时间

转移dp[i][j]=min(dp[n][m],p×dp[i][j1]+(1p)×dp[i1][j]),其中dp[0][i]=dp[n][m]dp[i][0]=0

发现转移会在dp[n][m]处成环,这里有个经典trick,就是直接二分dp[n][m]的值为x,根据这个x得到的dp[n][m]称为f(x),显然f(x)1,那么[f(x)x]0,也即可以二分得到x

复杂度O(NMlogV)

D2 - Club of Young Aircraft Builders (hard version)

对于easy版本的,是ai都是0的情况,直接dp[i][j]表示in填了j个即可

现在有些位置上的ai有具体的限制了,就不能直接这样,考虑转换一下题目的限制

发现设cnti表示i的数放了i个,那么只需要所有i都在[1,c+j<icntj]即可

那么dp[i][j]表示kicntk=j即可

NCM同阶,复杂度O(N3)

CF865D Buy Low Sell High ✩

反悔贪心经典题,比较简单吧,看到谁在发就看了一眼

考虑这样一个贪心,要求当前点x作为卖出的时刻,那么就会选前面剩下的点中最小的作为买入的,即一个堆维护

那么每次遍历到x就往堆里塞入ax,如果x可以作为卖的,再塞入一个ax作为反悔用,选了这个就代表用当前的x代替x作为这一组的卖出方

复杂度O(NlogN)

AT_wtf22_day2_c Jewel Pairs ✩✬

感觉太牛了,感谢来自假Op的推荐喵

首先vi+vjL的现在,经典的trick就是把{vi}分成两类,一类是L2的,另一类是>L2的,称前者为小点,后者为大点

显然小点内部非同色点可以任意匹配,大点只能和部分非同色小点匹配

有一个显然的性质,我们肯定是优先把小点和大点之间匹配了再去考虑匹配剩下的小点与小点

那么现在来考虑匹配小点和大点,设大点的ui=Lvi,那么可以匹配的j要满足vjui

把所有的点按ui/vi的大小,从小到大排序,然后发现,若当前加入的大点i能和已加入且没被匹配的小点匹配,那么i就会在最终能匹配的大点集合S中,否则不在,因为ui越小,也就意味这vi越大,所以这样是正确的

直接判断i能否加入S是困难的,考虑hall定理,设N(S)表示S的邻域(即S中的大点能匹配的小点),那么最大匹配数就是|S|maxTS(|T||N(T)|)

直接这样不好做,主要是因为还有颜色的限制,但是注意到,如果我们反着来,即维护T集合不能匹配到的点是简单的多的

所以有个很牛的转换,设F(T)=U/N(T),其中U是目前加入的所有小点的集合,那么最大匹配数也可以表示为|S|maxTS(|T|(|U||F(T)|))|S|+|U|maxTS(|T|+|F(T)|),只需要计算maxTS(|T|+|F(T)|)即可

显然iT,找到Tu最大且cci不同的点p,显然这个值就等同于:所有p及之前的大点+所有p之后c是c_i的所有点的数量

可以线性维护

再考虑小点怎么选,考虑求出f[c]表示颜色c的最少的不能被匹配的小点数量,发现这样一个性质,不管其他颜色的小点,直接把颜色为c的小点和S尽量的匹配,这个匹配数就是f[c],同样运用hall定理,解的出来要求的东西可以在把S中的大点和所有小点再进行一次上面的过程来求

对于这个性质的证明:

考虑反证,也就是说,要使得S中的大点都能匹配上的所有匹配方案中,都有c小点在最大匹配中能匹配上但在这里匹配不上的点

如果该点后面还有匹配向非c小点的非c大点,显然能直接让该大点和该c小点匹配,显然总是能找到的(先不考虑答案优不优的情况)

x为小点和大点匹配完后剩余的小点数

  • maxcf[c]x2

    x%2=1,就扔一个点,现在就只考虑x%2=0的情况

    此时小点大点匹配完后,若某一颜色的数量>x2,显然能一步步调整成恰好x2,然后就可以恰好全部匹配上了

  • maxcf[c]>x2

    y=maxcf[c],那么最多的匹配对是xy,即有y(xy)个数无法匹配上

现在只用考虑怎么舍弃数最优,用舍弃大点类似的方式即可

复杂度O(NlogN)

ARC186A ◈✩

t1还是太先进

首先如果一个点Ai,j可以变成其他的值,其实就是找到所有的回路,满足回路的所有拐点0/1交替,然后拐点上的点就是可变化的

考虑涉及到行、列的性质,如果是网络流/二分图之类的题,就可以上二分图了

参考这个做法,如果Ai,j=0,连边行ij,否则行ij

上述的回路在二分图里也是以环的形式存在的,那么非环边的数量就是k

考虑dp[i][j][k],表示左边有i个点,右边有j个点,共有k个环边,因为显然经过某个点的所有环可以合并成一个大环,直接枚举pq表示新的环用了p个左部点q个右部点

复杂度O(N6w)

ARC186B

显然考虑连边ij表示pi<pj,对DAG计数,显然想要把它变成树形的DAG

对于j(Ai,i),要有AjAi,也即包含关系

那么现在就形成了一块一块的,考虑当前新加入的i,一直删除末尾的块直到当前块j满足aj=ai,然后连边aiiij,删除边ajj

最后是一个树形的,直接组合数即可

我用了set,复杂度O(NlogN)

ARC186C

先把PiVi的箱子甩了,纯fvv

显然Alice每次会放当前有空位的盒子中没出现过的那个颜色的球,如果每次,每次Alice都会选容量最小的那个然后填满

箱子数量不够的情况可以单独考虑

考虑最后肯定是剩了m1个只放了一个球的箱子,其他的放满了或不放,显然剩的是v最大的那几个,直接贪心即可

复杂度O(NlogN),瓶颈是排序

ARC186D

考虑合法的序列,就是满足:

  • ai=n1
  • ijiaji1

后面这个可以转换成网格图走,然后不能碰到某一条线,简单的

枚举前缀和a相同的部分,再枚举下一位填什么,因为要满足序列和为n1,所以其实复杂度是O(N)

总复杂度O(N)


字符串

CF1827C

对于偶回文串,若它有一个偶的回文后缀,那么这个偶回文串一定能拆成若干个偶回文串

那么对于一个好的串的划分,采取能划分就划分的方式,则是唯一的

所以对于每个后缀找到最小的回文后缀即可

PAM即可O(N)解决问题

CF1913F

考虑改变si的字符,消失的回文串是不以i为中心,且包含了i的回文串,这个好算的

考虑改变后的,增加的也是不以i为中心且包含i的回文串

可以最开始先处理一下,枚举回文中心p,可以很轻松的找到以p为o中心的最长回文串的长度,此时不能再长,要么是碰到边界了,要么当前两端的点的字符不相同,此时只需要改变其中一个变成另一个即可,我们假设它们已经相同,然后再继续延伸向两侧

复杂度O(NlogN)

P10716

对于k的限制,就是限制了|A|的最大长度,再加上A必须是border,后面可以kmp+st表跳

前面这个是check是否串AS中贪心的匹配后,第k个匹配到的串全都包含在i内,因为一共匹配到的位置只有ni=O(NlogN),所以可以暴力的找到所有匹配的位置

具体的过程类似链表维护,维护当前点的后一个点,显然可以并查集辅助

复杂度O(NlogNα(N))

P11150 ✩✯

要求S[1,i]+T+S[i+1,n]最小,暴力的想法就是枚举所有的i然后挨个判断大小,但这样复杂度高达O(TN),似了

考虑去掉无用的i,对于点对(i,j),若满足i+j最小且S[1,i]+T[1,j]<S[1,i+j],则显然这里的i可能成为答案的i,否则当且仅当,前面得到的可能成为答案的i满足S[im+1,i]=T[1,j],即可置换一下S[im+1,i]T[1,j]的位置

因此可以在S后面塞个INF

可以SAM然后枚举j找最小的i即可,此时候选的i的数量级就是O(M)的了,可接受直接比较了

对于(i1,j1)(i2,j2)i1<i2),有S[1,i1]+T[1,j11]=S[1,i2]+T[1,j21],只需要考虑T[j1,m]+S[i1+1,n]T[j2,m]+S[i2+1,n]的大小即可,且可以发现,如果T[j1,m]T[j2,m]的前缀,那么其实T[j1,m]+S[i1+1,n]就和T[j2,m]+S[i2+1,n]相同了

求出可能是答案的i后,再往前跳T的循环即可

NQ同阶,复杂度O(NlogN)


[NOI2021] 轻重边

做法1 ✩

比较巧妙的做法,给每个点赋值,然后一条边是重边当且仅当其相连的两点的权值相同

做法2

称题目的重边为标记边

先轻重链剖分,我们维护重链上的信息,轻链的把信息挂到父亲上,即记录一个点的孩子的轻边中,哪些是被标记的边,显然至多俩

那么跳ab时,因为与路径上的点相连且不在路进上的边中,只有O(logN)条重链,所以直接去修改这些重链

做法3 ✡

用毛毛虫,然后0/1表示xfax是否是重边

复杂度都是O(Nlog2N)

《简单树剖练习题》

路径上的点的权值的变化就是2k|auav|m,对于与路径相邻的那些重边,O(logN)条,直接暴力的改,轻边查询的时候暴力的查即可

复杂度O(Nlog2N)

[QOJ9638] 线段树与区间加

做法1

其实va没用,因为ai等价于jtreeitagj×lenj,那么给vbi加上 所有祖先的va之和乘leni 即可

发现操作就形如两条链,一个整体向左,一个整体向右,然后这两条链上的点除了最后一个,都要下传标记,且与链上的点(除了底部那个)相邻的点和链的底部的点都要打上ktag

树剖一下

这个打标记,对于重链头,就可以标记给它的父亲,后面遍历到它的时候再传下来即可,注意帮左/右儿子打的标记要分别记录

考虑怎么维护下传标记,实际上可以直接找到所有标记点然后传下去即可,因为你注意到每次实际上真正打到点上的标记是O(1)

复杂度O(Nlog2N)

做法2

同样还是只保留vb

考虑每次pushdown(x)后答案的变化为lazyx×(vbx+vblsx+vbrsx),把vbx赋值为vbx+vblsx+vbrsx,记lazyx到根的lazy之和,那么Δ=iSlazyi×vbiS表示要下传标记的集合

那么给一个点的lazyx加上k的贡献就是k×vbx,在每次操作中,只要找到所有打标记的点的vbx之和即可,这个是好记录的,就像做法1一样,记录点u到其所属链底的所有点的非链上的左/右儿子的vbx之和即可

对于每次操作,就是把完全被包含于[l,r]的区间的lazy都加上k,与[l,r]有交的区间的lazy都清空且加入S,后面这个是两个链,树剖很好维护

对于前面这个,注意到这样的点就是后面那俩链上的点的,不在链上的右/左儿子子树,考虑这样标号,对于一条重链,先把它链上的点都遍历了,再依次遍历其所有的左子树,再一次遍历其所有的右子树,这样就可以表示为一个区间了

复杂度O(Nlog2N)

「GLR-R3」谷雨

用毛毛虫,但是端点处的点要特殊处理一下

复杂度O(Nlog2N)

[集训队互测] 数据结构

毛毛虫升级版,也许可以叫猫猫虫

先标号一条重链,再依次标号距离该链长度为123的点即可

复杂度O(Nlog2N)

[CF1930H]Interactive Mex Tree ✯✡

p1是入栈顺序,p2是出栈顺序,而mex(S)=min(US),则只需要得到所有不在路径xy上的点的值的min即可,设lca(x,y)=zxy分别表示xy处于z的哪个子树中,则US可以表示为:

  • p1,1in[z]1
  • p1,in[y]+1n
  • p2,1out[x]1
  • p1,in[x]+1in[y]1
  • p2,out[x]+1out[y]1
posted @   LuoyuSitfitw  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示