7月记录

还是写做题记录吧,板刷的题也在。

近期计划:

104.NOI2024集训(第七场)A 划分可爱捏(div)

容易抽象成二分图左右部点数 min 的和。

k=1 就是会修改一条边,容易发现当这条边不是孤立的边时,加边操作总能做到不变(加边时可能变大的),于是考虑删边即可,需要删割边,找出来,然后一一判断。

k=2 时不仅要维护删边,还有加边,删边可以删掉割边和非割边,一一判断,然后加边就是和左右差最大的联通块(两个极端)连边判断。

code 很shi

105.ABC258H

容易发现系数为斐波那契数列。

于是 dp 的时候容斥一下,和可以一起矩阵。

106.ABC280G

经过证明,题目给出的坐标系中点 (x,y)(0,0) 的距离为 max(|x|,|y|,|xy|)

枚举 x,y 的最小值,即钦定前两维的范围,考虑双指针扫 xy

(x,y)(x+1,y)(x,y+1)+(x+1,y+1) 容斥即可。

107.最大值可爱捏(max)

我们希望对于每个 1mk 计算最大值 m 的方案数,依此可以容易计算答案。

只需要求 [xk]Smn(x) 其中 Sm(x)=imxii!

如果使用 fft 等方式计算,可以得到 O(k2logk) 的复杂度,预计得分 3060​。

Sm(x)ex 展开式的截断,考虑 (Sm(x))=Sm(x)xmm!,则 (Smn)=nSmn1(Smxmm!)=nSmnnSmn1xmm!,则固定 m,可以在 O(nk) 的时间内递推出所有 Smi,0in,总复杂度 O(nk2),预计得分 15

发现 Smn 需要求到第 k 项,而 Smn1 只需要求到第 km1 项,并且 mnk 的情况无贡献,则对于每个 m,时间复杂度变为 k2m,总复杂度 k2(logklog(kn))=O(k2logn),预计得分 60

若知道了各个 Smi,那么 [xk]Sm+1n 也是容易计算的。考虑定期重构,设阈值 B,先预处理出所有 Bm,1inSmi,这里的复杂度为 O(nk2B)

对于任意 m=Bl+r,展开 Smn=(SBl+(SmSBl))n=i(ni)SBlni(SmSBl)i,后者有 ir 项,并且可以类似上文做法递推出所有值,而前者均已经算过,这部分复杂度为 O(kn2B),平衡得到 O(n1.5k1.5)

进一步的,同上文分析,对于 SBlni,只需计算 k(Bl+1)i 项,而由于 SmSBl 最低项也为 Bl+1,这样的数量足够支持后面的计算,则计算单个 m 的复杂度为 O(d(km)2),其中 d 是与上一次重构的距离,在 m 处重构的复杂度为 O(k2m)

设在 m 处重构的概率为 p,可以认为 d=1p,则可以认为在单个 m 的复杂度为 O(p1(km)2+pk2m),取 p=m0.5 得到 O(k2m1.5),对 mknk 求和可得 O(k2(kn)0.5)=O(k1.5n0.5),可以通过本题。

实现上,在范围内的每一个完全平方数的位置重构即可得到相同的复杂度。

108.word(word)

考虑计算出每个点为开头可以往后删空的最长段 fi,计算过程类似单调栈。

再计算后缀的最小字典序串,每次相当于在 [i,fi] 里取最小值在前面加上一个字符作为当前的串,可以类比不断加儿子,再来个单调栈模拟比较过程,比较时用树上哈希就好了。

109.partition(partition)

容易有 dpfi,x,y

x>y 时,用后缀最长上升下降子序列很好计算。

x<y 时,每次状态只有 O(n2) 个,每次只会进行 O(1) 次单点修改,当一个状态变成 x>y 时更新答案。

一个 x>y 的状态在交叉点处处理最优,故后面无需考虑这个状态。

image

倒序处理即可。

110-125 周航锐 hehezhou、罗恺、叶李溪、黄洛天、许庭强题目选讲

126. 序列(sequence)

有解条件是区间和为 k 的倍数,将前缀和去摸 k 的等价类划分出来,两两合法。

发现 f(l,r)=i=lrmin((sisl1)modk,k(sisl1)modk),因为考虑第一个数,不管他往上还是往下,第二个数取模后的值固定。

发现等价类中划分较长的区间可以由中间的区间答案加和求得,于是只需要求 O(n) 个区间的答案。

扫描线,讨论一下 min 即可。

127. 笔(交互题)(pen)

可以采取某些代价删除所有 i 的笔,让代价最小。

每次记录每个笔已被操作次数,从最大的开始(尽量用达阈值,保证最小的两个已操作数尽量小即可),找到当前最小的数就停止。

用最小的两个数计算概率,超过阈值就停止。

128. 炉石(game)

考虑将已存活的限制删除,任意操作点,当血量不为零时记为有效。

枚举最后一个有效的操作。

记生成函数 F(x,y) 为操作 x 次,有效次数为 y 的概率。

t=1n+mx,则没成函数是 i=0ai1tiyii!,死了的生成函数是 yai(eti=0ai1tii!)

求出 [yd1]F 的多项式 G,求出 i[xi]i!G,即 G 转成普通生成函数的系数和。

怎么转呢?

xaa!ebx=ibixi+ai!a!ibixi+a(i+ai)=xa(1bx)a+1

(11x)n+1=ixi(i+ni)

乘完之后每次跑除法可加速。

129.match(match)

考虑 hall 定理的扩展。

判断是否左部点可以全部匹配:image

但是最大匹配为 nmax(|S||n(S)|),此时要选若干不相交的 n(S)Sn(S) 的最大值。

考虑记 fi 表示考虑了 [1,i] 时的答案,则 fifj1+w(j,i)w(j,i) 表示被 [j,i] 完全包含的区间的权值的和,扫描线容易维护。

考虑所有区间都可修改,则 w(i,j) 可以更新 ansiansj,直接做要用前缀加历史前缀 maxmax 线段树(我不会)。

考虑分治,先扫左端点 i[l,mid],维护出所有 w(i,j),j[mid+1,r],求出最大值,更新 ansiansmid,右端点同理。

存在区间不可修改,就维护前缀后缀的 f,在分治的时候考虑一下即可。

时间复杂度 O(nlog2n)

130-147.周航锐 hehezhou、罗恺、叶李溪、黄洛天、许庭强题目选讲

148.CF1983

D

这个复杂的操作可以转化为任意次交换相邻项。

每次交换相邻项逆序对数奇偶变化,逆序对数同奇同偶时合法。

F

二分答案,每次滑动窗口即可。

G

枚举位数,等价于问长为 2k 的区间的 1 个数,再加长为 2k 的区间的 0 个数,如此类推,可以倍增维护。

E

很奇妙。

考虑普通球的排列,A 选 t=n2 个,选出的普通球的和的期望值为:

ai(n1t1)t!(nt)!n!=tnai

将特殊球看成板子,插入普通球的空之中,因为首尾都可以放板子,所以一共有 nk+1 个空,然后每个空放的板子属于 A 或者 B 是确定的,算出 A 的空所占比例,再乘上特殊球权值之和即可算出特殊球贡献期望,与上面是类似的,相当于每个点有 ab 的概率贡献给 A,则 E(A)=abai

149.灯塔(lighthouse)

考虑最大值,发现要在左右提升一个成为最大值。

考虑笛卡尔树,维护要提升一个成为最大值后,发现要维护提升两个的答案。

继续归纳,发现最优解提升数量不超过两个,因为只需满足最大值的限制即可。

于是记录左右提升 0/1/2 个的答案,dp 即可。

150.安德鲁(交互题)(andrew)

image

hot!

找到 x,y,z 后,花费 3n 判断。

随机一个数,找出邻域 S,S,一个能到,一个不能到,分别表示 xy,z 的可能。

uS,vS,若 u,v 有边,则删 v,否则删 u

image

不管选没选到 x,y,z,最后都会剩下 xz

151.汉堡王(burger)

原神!

非常抽象的题。

对每个汉堡,维护数组 ai 表示第 i 次攻击能打掉多少层。

则答案就是将 a 归并,使得前缀和的和最大。

在坐标轴上考虑点集 {(i,jiaj)}i=0m={(i,dihp)}i=0m,找到上凸壳,按照分界点分组。

则最优解中一组中的数一定连续,因为最优解中的斜率一定单减,将相同斜率的点放在一起更优,于是也进一步可以得出最优解一定是这些上凸壳的边按照斜率排序。

一个关键结论是:上凸壳的段数是 log 级别的。

点集相当于 y=dhpx,y=0,x=m 的半平面交中的格点的上凸壳,上凸壳上第零个点事 (0,0),那么第一个点就是 yx 最大且 x 最大的 (x,y),则 2x>m 一定满足,因为若不满足,则 (2x,2y) 的斜率也最大,且在平面内,所以更优,然后找第二个点,相当于一个将原点设为第一个点的子问题,所以结论成立。

涉及到找分母不超过 m 且分数值不超过 dhp 的最大分数,考虑有理数二分 SBT,是 log 的,倍增跳再二分跳,参考文献

最后计算相邻两个分界点的答案,可以类欧(不会),也可以用皮克定理。

152.GUILIN23C Master of Both IV

【需要复习、学习线性基】

153.LGV引理

行列式求值:

  • 交换行/列,值取反;

  • 交换一行与一列,不变;

  • 将一整行/列乘 k,则答案乘 k

  • image

  • 将一整行(列)的元素乘 k 加到另一行(列)上,答案不变。

  • 某两行(列)对应成比例,答案为 0

高斯消元消成上三角形式,求对角线的乘积即可。

LGV 引理小记

image

即要求当 p(1,2,3,,n) 时,路径一定存在交。

image

154.P7736 [NOI2021] 路径交点

image

路径不交的情况在网格图上不是很能体现,可以理解为排列逆序对奇偶性等于交点奇偶性。

LGV 引理能处理网格图不交路径,只是当且仅当存在逆序对时有交,做容斥后得到的式子相同。

对于此题,求出行列式即可。

155.P9041 [PA2021] Fiolki 2

又是线性基。

考虑对每一条边随机赋一个边权,有解的可以近似等价于行列式的值不为零。

156.晨昏线(bal)

http://192.168.102.138/JudgeOnline/upload/attachment/file/20240709/20240709045455_32331.pdf

根本不会写。

k20 比较容易,考虑 k>20,每 k 个分成一段。

有结论:image

即序满足 i[k,n]sisik<k2

image

枚举第一列的所有元素。

考虑轮廓线 dpfi,j,S 表示当前在第 i 行第 j 列,(i1,j),(i2,j),,(1,j),(i,j1),(i+1,j1),,(n,j1) 的值放在 S 中的方案数。

O(n(k2)2nk),50pts。

考虑建立网格图,要么不变要么加一。

将第 25 行的图像向左平移到第一行的区间中。

然后第 i 行的图像向下平移 ik/2,则第 i+1 行在第 i 行下。

要求是 5 条路径,求不相交路径数量,考虑 LGV 引理。

有一些 p(1,2,,n) 的情况也会相交,将一些点删掉即可。

O((nk)3(k2)nk)

157.自同构(iso)

题目的条件等价于交换一些编号后与原图是否同构。

考虑到原图的连边情况等于补图的连边情况。

则求无自同构的边数最小值。

显然要求为每一个联通块满足条件且两两不同构。

一个发现是,对于 n6 总有大小为 n 的树满足条件,构造如下:

image

一个非树的联通块对答案贡献大于 1,将他替换成贡献为 1 的树更优。

显然最优解是一个森林,在联通块数量大小最大时最优。

如果我们可以求出大小为 n 的不同构树的方案数 fn,则从小到大添加进方案里,然后最后多出来的点放在最大的树里即可。

在判断树同构的时候,我们可以以重心为根做一遍树哈希(如果有两个就都做一遍),然后比较哈希值判断两棵树是否同构。

无根数判断同构,考虑重心。

image

跑出 n250 时的答案就够用了。

image

其实就是无标号无根树的方案数,要学习 https://www.luogu.com.cn/problem/P5900 的多项式。

158.套路 Exchange Argument

[AGC023F] 01 on Tree

先选 0 一定更优,于是对于 au=0,当其父亲被选后,立即选他,于是将他与父亲合并,计算贡献。

维护一个优先队列,每次取出权值最小的块,对答案显然更优,将他与父亲块合并。

考虑如何比较设 01 个数为 a0,a1,b0,b1,则当 a1b0<a0b1 时先选前者,移项之后很好得出。

P4437 [HNOI/AHOI2018] 排列

发现就是一个树,就做完了。

合并书籍(A)

对于链的情况,我们要维护出前缀后缀段的情况。

发现对于前缀平均值要递减,我们可以拿个栈维护,加入最后一个数,若平均值大于前面就合并,变化数 O(n)

平衡树或者离线线段树可以处理。

159.UOJ Round #27 A. 景点观光

我们只需在虚树上,找到能满足的最大的 k 即可。

相当于我们要确定段的划分,使得长度为奇数的段最少。

fu,0/1,0/1 表示 u 子树内一个关键点的排列,开始的深度奇偶性和结尾的深度奇偶性,对于关键点,开头结尾都是 ax 就好了。

做一个类似树上背包即可。

还有一种方法是设 fu,0/1,0/1 表示在 u/u 的儿子,结尾在 u / u 的儿子,不过讨论很麻烦。

160.CF1987

打成了shi。

C

发现后第 i 个点被操作成 0 的次数 后第 i+1 个点的次数。

gi 表示后缀操作次数,则:

  • hihi+1gigi+1+1

  • 否则若 hi>hi+1hi>gi+1+1 说明 hi 在过程中一直下降不会出现相等的情况,则 gihi

  • 否则 gigi+1+1

D

A 的操作是从小到大取,每种数只取一个,B 可以选择一些数(种类),将他取完,要求他取的过程中 A 不能取到。

考虑 dp B 取的种类,分别为 1i1<i2<<ikn,要求满足 p[1,k],j=1pcij+p1<ip,画画图就行了,于是有 p[1,k],j=1pcij<ipp+1

fi,j 表示考虑了前 i 种数,已取的数和为 j,满足条件时 k 的最大值。


另外一种方法是考虑贡献延迟计算。

对于每种数,B 可以放弃他获得一个空闲回合,或者拿下他使用 ci 个空闲回合。

fi,j 表示考虑前 i 种数,已累计 j 个空闲回合,已取的数的最大数量。

————————————————————————————

好像有个反悔贪心做法。

每次拿个堆维护已经取了的数的数量集合,并记录当前空闲回合。

对于当前种类,贪心,若空闲回合能取就取。

若不能取,答案就是加一,但是我们可以将之前取了的最大数量扔掉,取当前的,那么答案不变,但是空闲回合增大,更优。

时间复杂度 O(nlogn)

E

贪心,每次相当于找子树内最近的可以操作的点,代价为两点距离。

记题目转化为:

每个点有权值 bi,每次可以选择一条边 (fau,u)bfaubfau+1bubu1,使得所有 bi0 的最小操作数。

直接跑费用流可以做到 O(n2)

考虑贪心,从下往上考虑,每次选择子树内最浅的 bu>0 的点,这样一定更优,(你可能会说这样上面的点就得跑更远的点了)。

感性理解,考虑最优解中对 1 的儿子的操作分配,对儿子 v,相当于一个子问题,即 1 要取的数,相当于 v 再多取一些数,则仍然取最浅的点更优。

应该可以线段树合并和二分做到更快。

————————————

还有一种 nb 方法。

考虑原题,记 fu,k 表示将点 u 操作 k 次后,子树合法的最小次数,则合并相当于 (min,+)

做一遍闵可夫斯基和即可。

可能应该可以做到 O(nlog2n) 或者平衡树 O(nlogn)

F

很妙!!!!

操作序列形如括号序列,可以考虑区间 dp

我们在对 ai 操作时,需满足左侧操作数恰好为 iai2

fl,r,x 表示 [1,l1] 进行了 x 次,[l,r] 最多可以进行几次。

转移枚举划分点,或者在操作区间最左最右就能做到 O(n4)

考虑优化,设 fl,r 表示将区间 [l,r] 删空至少需要左边多少次数。

如果我们求出了 f,设 gi 表示前缀最多操作次数,则 gi 单增,转移枚举最后删空的一段 [l,r],找到最大的 gi 满足 gifl,r,i<l 即可,哈哈,发现是 gl1

考虑怎么求 f,之所以这么设状态是因为我们考虑 [l,m],[m+1,r] 这两个相邻的区间,右边的对左边没有任何影响;而右边的区间可以视左边操作的情况适时进行操作,因为我们只要知道操作次数的下界即可。

转移考虑枚举与 l 匹配的点 i,则可以得出 l 左侧操作次数的下界,加上 fl+1,i1,就可得出删空 [i+1,r] 需要左侧的下界,判断是否可以删即可。

时间复杂度 O(n3)

G1

考虑笛卡尔树上的一个问题,设当前区间为 [l,r],最大值位置为 p,若区间内的点不向外连边。

那么一定构成一棵以 p 为根节点的树,设 [l,p1] 不向外连边的最长链的长度为 x,右区间为 y

那么左区间和右区间都向 p 连边,有一条 x+y+1 的链更新,这样就处理了不同子树的情况。

当区间往外连边时,有:

  • 只向左或右连边,[l,p1] 连向 l1[p+1,r] 连向 p 再连向 l1,长度为 x+y+2
  • [l,p1]l1 连边,[p+1,r]p 连边再向 r+1 连边,那么长度为 x+y+f(l1,r+1),其中 f(l,r) 表示 i,j 最终连在一起的最大点数。

考虑求 f(i,j),则 ai,ajmaxk=i+1j1ak

i,j 一定满足 Ri=jLj=i,则:

  • ai<ajLi0,则 iLi 连边,答案为 1+f(Li,j)
  • ai>ajRj0,则 jRj 连边,答案为 1+f(i,Rj)
  • i,j 连边,答案为 2

记忆化 O(n) 求解。

值得好好思考的问题!!

还有G2。。

161.loj6243. 关灯问题

对只需要第一行的变量,可以得出第二行的变量,于是拿一行进行高斯消元即可,O(n3w)

162.CF671C

hot!!!

考虑所有因子,找出他的倍数位置,共 O(nlnn) 个。

找出前两个和后两个位置,可以得出 O(1) 个关于 l,r 的矩阵,满足 (l,r) 在矩阵内则这个因数有贡献,取最大值即可。

最后询问一个上三角的和。

这个东西不是很好维护,再找找性质。

答案 i 从大往小考虑,就是一个覆盖,对于 f(l,),答案是单减的,我们可以维护一个 tl 表示以 l 为左端点时,f<i 的最小编号,那么 tl 随着 i 下降而单增。

并且对于每个 i,我知道 tl,我就能知道答案。

于是考虑 i+1i,找到倍数下表 x1,x2,xk,那么:

  • k=1 不会更新;
  • l(x1,xk),r[l,xk),则取 x1,xk 最优,令 tlxk
  • l(x2,xk],r[l,n],则取 x1,x2 最优,令 tln+1
  • l[1,xk1),r[l,xk1),则取 xk1,xk 最优,令 tlxk1

每次区间取 max,查询全局和,机司机线段树即可。

也可以观察到 ifl,rfl+1,r,那么 tltl+1,更新的是一段前缀,二分即可。

163.bishojo

!!!!!!!!

哈哈,打表观察到先交替取 A,然后有一个人取了 B,然后交替取完 A,最后交替取完 B,然后一直调搜索调不出来。

妈的。

因为 c+d 的值是固定的,所以 cd 尽量大就是 c 尽量大,否则是 d 尽量大。则二者的目标变成让自己的数尽量大。

于是有一个显然的 O(n×m) 的 dp,定义 fi,j 表示序列 A 取到 i,序列 B 取到 j 的最大值。转移是平凡的,枚举操作者取哪个即可。

考虑优化。注意到 nmod2=0mmod2=0 时先手会取两个序列所有奇数位置上的数。令这样取出来 cw,证明是容易的:

  • 证明 answ:后手只需要每次取先手上一步取的那个序列即可做到 answ
  • 证明 answ:先手先取序列 A 再取 B,在先手取 A 时若后手取序列 B 则先手可以跟着取 B。因为 B 递增,所以此时 answ

对于 nmod2=1mmod2=0 时,同样可以得出先手只会取序列 A。此时会变成上一种情况。所以仅需证明先手取 Bans 不会变大:根据数学归纳法,当 m=0 时显然成立。当 m>0 先手取 B 时,此时后手继续取序列 B,而 B 递增,先手取到了比原本应当取到的位置更劣的位置,此时又变成了一个 nmod2=1,mmod2=0 的子问题,于是 ans 不会变大。

所以最终做法是简单的,直接对于 mmod2 判断一下即可。若为 0,则可以直接计算,若不为 0,则枚举在什么时候 m1(即有人取到了第一个 B),m1 后的答案显然可以直接计算,记录后缀和优化一下即可,注意这是博弈论,要在决策树上逆拓扑序考虑。

即使想不到这个结论,打表也能够有机会发现并做出来。

时间复杂度 O(n+m)

164.P10220 [省选联考 2024] 迷宫守卫

真是神泵。

可以考虑设 fu,j 表示子树 u 的第一位为 j 的最小代价。

求出来,找到最大的 j,然后找到 1j 的链,剖分为几个子问题,从下往上处理。

设左右儿子为 lc,rc,设 gu,j 表示子树 u 的第一位 j 的最小代价。

如果当前 j 在当前点 u 的右子树,那么 u 无需点亮,扣掉左子树将要花费的钱,递归右子树即可。

如果 j 在左子树,如果 frs,j<wu 同上面一样处理。

否则,wu<frs,j,我们可以点亮 u,处理左子树,但是这样右子树的钱可能不是很多(尽量多可以取到更优的值)。

所以先拿 wu 往下跑,得到花费钱数 g,这个时候对于右子树,你可以有 Kgwu 的钱数,如果你不用 wu,转而用 frs,j,那么就是看作将 wu 的钱扔到右子树,如果这样左子树也能取到最优的话(即有 g 的钱花),答案更优,那么条件是 frs,j+gk

165.CF1648D Serious Business

dpi 表示走到 (2,i) 的最小花费。

对于一个包含 x 的区间 [l,r],分类讨论是从 [l,x] 下来,还是在 l 之前下来。

dpxdpl1+S2(l,x)costdpxmaxj=lxS1(1,j)+S2(j,x)cost

前者扫描线线段树维护,后者分治维护。

时间复杂度 O(nlog2n)

166.P10538 [APIO2024] 星际列车

hot!!

fi 表示最后使用了第 i 个航线的最小答案,则有:

fiminbjai,yj=xifj+g(bj+1,ai1)txi+ci

其中 g(l,r) 表示区间 [l,r] 完全包含的区间个数,可以主席树维护。

观察到对于 yj=xi 的转移,g(bj+1,ai1) 满足四边形不等式,具有决策单调性,如果维护 j 的集合(按照 bj 排序)以及 i 的集合(按照 ai 排序)。

那么 i1<i2i1 的决策点小于等于 i2 的决策点,我们可以在 j 的集合维护一个单调队列 (j,l,r) 表示 j 对应的被决策点是区间 [l,r]

加入一个决策点 nj 时,取出队尾 (j,l,r),若 njl 点的答案优于 jl 点的答案,那么删掉队尾,并将 [l,r] 给到 ng

当无法删除时,在队尾二分,将队尾切开。

查询时,在队头判断,一直弹出直到找到队头对应的区间。

具体实现时,按照 ai 从小到大转移,但是一个 fi 已经转移完时,如果我们直接将他插入 j 的集合,不好做,因为集合需按照 bj 排序,二分插入也不好做,我们先将他存下来,当我们当前转移的点可能需要他时再加入,即 bjai,这样可以保证插入 bj 时一定是单调队列中最大的。

167.P4654 [CEOI2017] Mousetrap

老鼠一开始可能会往下钻,但是钻进去后无法再出来,也可以往上走,然后钻到其他支路里,(因为我们不能堵上他到根的路径)。

fu 表示在 u 点钻到 u 的子节点,再被我们送回来,我们需要操作几次。

则每次老鼠的最优策略是走入 fv 最大的 v,于是我们的策略就是堵上这个 v,那么老鼠只能走次大值,于是 fufv2+du(u)2

可以处理处当老鼠决定时的操作数,设老鼠从 x 往下走,走到儿子 y,那么 cost=fy+sumxsum 为到跟需要堵上的支路数量。

但是老鼠的决策取决于我们在他向上走时,我们的操作,不好处理。

考虑二分答案 k,这下我们就有个虚拟的操作数,模拟老鼠往上跳的过程,每次堵上 cost 大于当前剩下操作数的边,模拟即可。

168.P10674 【MX-S1-T3】电动力学

考虑固定 T,计算 S

ST 的虚树上。

在圆方树上跑一个虚树 dp 即可。

fu 表示以 u 为根的答案,gu 表示以 u 子树节点为根,算上那个点到根的权值的方案数和,辅助转移。

还有一种做法。

按照子树内有多少个儿子子树选了 T,需不需要封顶分类,挺难写的。

同理也要维护一个儿子集合数组辅助转移。

169.P10717 【MX-X1-T5】「KDOI-05」简单的树上问题

咕咕。

考虑 k=1,同理设 fu,0/1/2 表示 u 子树没有节点激活、u 子树有节点激活且无需外面激活、u 子树有节点激活且需要外面激活。

同理设辅助转移 gu,0/1/2/3,表示考虑除了 u 点的子树,无节点激活、有一个子树激活且无需外面激活、有一个子树激活且需要外面激活、至少两个子树有激活点。

(a,b)c,表示 tafv,btc,则有:

  • (0,0)0
  • (0,1),(1,0)1
  • (0,2),(2,0)2
  • (3,0),(1,2),(2,1),(1,1),(2,2),(3,1),(3,2)3

再考虑 u 初始激活状态,(u,v)c 表示 u 初始 b 状态,在当前 a 状态下转移到 c 状态。

  • (0,0)0
  • (1,0)1
  • (2,0)2
  • (3,0)3
  • (0,1)3
  • (2,1)3

后面依托,合并转移。

不会了。

170.自然选择号(warship)

不会贪心。

相当于完全二分图最大流,转化为最小割,左边选 S1,右边选 S2,则中间割 (n|S1|)(m|S2|),则关于序列 b 的前某小有限制,dp 即可。

171.社交恐惧症(socialphobia)

找规律。

172.P10767 「CROI · R2」在相思树下 II

https://www.luogu.com/article/bssdxf70s

怎么这么显然,没有细想呜呜。

image

为什么可以呢,以 min 为例:

image

对于任意情况中,如果满足 a1,a2,a3,a4a5,a6,a7,a8 之间的相对顺序,左节点就可作为 min,那么我将 a 排序得到 b,将 b1b4,b5b8 换成原来的相对顺序,这样右子树没有比左节点小的数了。

173.UOJ NOI Round #8 Day1 最酷的排列

对于这种奇怪题,一定要往必要和充分条件去想,比如上界和下界。

排序之后较小的值一定往前移动,于是从后往前维护一个堆,每次加入点,当碰到关键点时取出最小值,这个显然是上界,也可以证明是下界。

??真的思维啊!!!

174.姬路市仙人掌(trans)

考虑从小到大反向做个覆盖,假设当前拿 x 去覆盖,找到 xk 步能到的邻域,覆盖,然后删除这些点,然后找到邻域往外连的传送门,再跑到外面覆盖。

每个点只会被覆盖一次,考虑优化,我们只要能快速找到邻域即可。

涉及到邻域,考虑点分治,从 x 往上跳祖先 zu,找到点对 (x,v) 满足 dis(x,v)kLCA(x,v)=zu,预处理就是一个后缀了,有重复没关系,相当于覆盖祖先的一个后缀,然后删除祖先的这段后缀,然后递归进入这段后缀连向外面的传送门。

时间复杂度均摊分析是两个 log 的。

175.集合(set)

image

176.排列(perm)

先假设有解,那么将 y1 置换为 (1,2,,m),则 y 的逆序对单增(有不同但相等的显然无解),因为前缀是顺序对,后缀是逆序对。

这样相当于从 y1 开始只交换顺序对,一直到 yn,那么如果找到序列 y,容易判断有解,i[2,n],val(1,i1)+val(i1,i)=val(1,i)

发现如果有解,对于 yi 找到离他逆序对最大的数,一定是 y1,yn 其中之一。

找出来判断是否合法即可。

177~187.模拟费用流小记

188.CF1975

D

容易发现可以谈心 2(n1)mxl+Dis(a,b),而两个往中间走一步,mxl 至多增加一,但是 Dis(a,b) 减少了二,更优,所以在中点判断即可。

E

简单题了。

每个点记录有多少了黑点儿子,同时维护所有黑点的这个信息。

样例中有一种特例,再维护二度黑点的最小深度即可。

F

如果 s 的第 i 位选了一,那么对于第 i 位为 1TST 的交一定多一,我们只需将 VfT 右移一位(因为最后一位一定满足)。

这个时候可以将 T0 还是选一的两个限制集合合并。

每次集合数量减半。

容易维护。

F 类似题 P6740 [BalticOI 2014 Day1] Sequence

枚举末位后,每 10 个的前缀相同,可以把每 10 个的限制合并。

image

G

考虑带通配符的 NTT 字符串匹配:

fi=j=0m1(ti+jsj)2ti+jsj

拆开式子,计算卷积即可。

考虑若两个串都带 *,很好计算。

如果只有一个式子带 *,记形式为 s1s2s3sk

则贪心在 T 中找 s1 第一个匹配的位置,删除这个前缀,往下继续,如果找不到就无解。

考虑对于 si,先找开头在 [1,si] 是否可以,时间复杂度 O(|si|log|si),如果可以就删去前缀,如果不行就删去 |si,则至少删去 si 个字符。

时间复杂度 O(nlogn)

189.CF1511G Chips on a Boar

倍增/分块/莫队trie

暴力的多项式全家桶

190~210 dp专题加训

211.CF1988

挂飞了。

D

注意到最大独立集是有问题的。

反例:

1
4
50 5 10 90
1 2
2 3
3 4

可能会花费多轮。

注意到题目等价于每个点赋值一个颜色 ai,边上的两个端点颜色不相等,求 minaivali

可能有一个观察,次数 20,跑树上 dp 即可。

还有一个观察,每个点的颜色数最多为度数加一,可以做到线性。

E

有弥补缺漏性的。

单调栈容易求出整个的答案。

每个点的差值,找到他左右第一个比他小的数,则以他为结尾的单调栈和以他为开头的单调栈可以互相匹配。

发现,对于 y,满足 Ly=x,则 y 在以 x 为开头的单调栈上,且 Ry 为单调栈上下一个点,另一边同理。

这下匹配点数是 O(n) 的了,二分确定哪边取 min 的方案数即可。

212.The 1st Universal Cup. Stage 1: Shenyang

咕咕。

I. Quartz Collection

F. Half Mixed

A. Absolute Difference

E. Graph Completing

H. P-P-Palindrome

G. Meet in the Middle

J. Referee Without Red

213.CF1994

D

发现若 ax=ay,则可以删掉一个点一条边的机会。

若剩下 t 个两两不同的点,则还有 t1 个边的机会。

则考虑剩余系,一定有两个数时可以被选的,选完后就变成了子问题,所以一定有解。

E

这个树的形态是没有用的。

因为若大小为 sz,则 [1,sz] 都能创造出来。

从高位到低位考虑,若当前位有至少两个数,那么选一个,另一个将后面全部填充 1 即可,若只有一个数就选它的这一位,将它的后面那些位继续考虑。

F

注意到有 NPC 的边都联通,且只能必须有一次,考虑加入 0 边(至多走一次),钦定他必须走 1 次,那就相当于求解欧拉回路了。

无向图欧拉回路的充要条件是全都是偶数度数点,考虑在 0 边的 dfs 树上贪心从下往上删除奇数度数点即可。

214.ARC180

A

考虑相邻相同的,划分为几个子问题,每个子问题是 ABABAB... 的形式,很好处理

B

合理猜测最大操作数就是类逆序对个数。

考虑有一个数 a,他当前能与后面的 b1,,bk 交换,pa<pb1<<pbk

则将 b 从大到小排序,可以提供 k 次交换,且最后的形态固定。

所以我们可以贪心从小到大考虑,这样这个数交换完最后一定不能交换,可以证明这样操作的方案数不变,能取到最大值。

C

fi,j 表示考虑了前 i 个数,子序列和 j 的方案数。

发现如果前缀子序列和为 0,那么当前再选下一个数的无影响的(得按照数的值来去重)。

0 1 1 2(1,2,4),(1,3,4) 是同一种方案。

再设 gj 表示考虑到 i,子序列除了最后一个之外和为 0,且最后一个值为 j 的方案数,就能去重了。

D

咕咕。

215.UNR #8 兵棋

image

image

216.UNR #8 里外一致

https://www.cnblogs.com/peiwenjun/p/18306875

217.树上路径(tree)

可以证明一定是子树重心分成两个集合,|s1|(n|s1|) 最大。

可以 bitset 维护。

二进制分组,因为是重心,可以分析出 O(nnw)

218.字符串(string)

找出一个子串的所有出现位置,可以通过 endpos 集合信息得出答案。

线段树合并预处理后缀树前缀答案即可。

219.染色(color)

kruskal 重构树上前缀祖先连边。

上下界网络流处理。

220.数学题(math)

可以用矩阵乘法维护。

考虑求前缀逆元。

我们现在有 O(n2) 右乘算法,那么根据矩阵转置原理,转置和求逆都是 O(n2) 的。

image

221.字符串(string)

https://www.luogu.com/article/d4y3zqqv

https://www.luogu.com/article/ds5cz0sg

找到所有 runs,维护斜线加,矩形求和,将斜线差分成射线,将矩阵差分成与源点有交,讨论射线交在矩形的哪条边上即可。

222.A(A)

有偶数就操作偶数,直到只剩奇数,可以一直只剩奇数。

在值域上维护值为 i 的数消失需要多少次,主席树上二分即可。

223.B(B)

k=0 是好做的,将点按照坐标和奇偶分类,每部分是独立的。

平移一下就是个简单 dp

k=1 时,有:

  • 取一列后面的点无交(后缀 max);
  • j+2
  • 删去前缀的一段区间;
  • 取左右边界上的非法点。

分类讨论一下即可。

224.CF1995

D

最后一个字母一定是在的。

发现题目给定限制,等价于对于所有长度为 k 的子区间,要求这些子区间中至少有一个字符为结尾字符。

fs 表示不存在结尾字符 s 集合是是否合法,当长为 k 的区间所有字符都没出现时非法。

最后一个字符没出现时非法。

求高维前缀和就好了。

E

偶数的情况是好做的,等价于在 (a+b,c+d),(a+c,b+d) 中选择一个,发现和一定,这两个区间是互相包含的,去里面的区间即可。

考虑奇数,一组内的两个点连边,可交换的两个点连边,可以形成一个环,将环上的链取出,这样交换和求和都发生在相邻两个数,且是 1010101 这样的。

101 取出,可以考虑 0 是否和左右交换,有 4 个状态,和右边的 101 拼接,要求右边状态等于左边状态,类似于矩阵乘法 (min,max

image

满足上述的运算可以用矩阵乘法。

考虑枚举最小值,在线段树上维护全局矩阵乘积,最小值递增,每次相当于 ban 掉一种取值。

225.CF1990

D

染区域操作在一行不会染两次。

当一行出现至少 5 个数时,一定染行。

否则染区域。

划分出几个子问题,贪心染即可。

E

image

F

考虑线段树上维护区间最长合法子区间。

计算后缀拼上前缀的答案,维护前缀和后缀,例如 al1i=lmidai 的合法的 l,后缀同理。

只有 logV 个,可以暴力拼接,也可以双指针维护。

226.P9530 [JOISC2022] 鱼 2

像上面那题一样,区间不会相交,只会包含。

考虑线段树维护极长区间长度和,log2V 拼起来即可,可以双指针优化。

227.[YDRG#006] 西星当亮 · 云斗七月 Golden Round

C

可以构造出一组与答案差不超过3的解。

考虑判断一个数是否可行,记 w=abc,则需要 a2b2c2n

O(VlnV) 分解质因数,搜索分配即可。

D

227.CF1991

D

妈的。

n6 时,答案 4

n>6 时,构造 ai=imod4+1,这样颜色相同的数异或后一定是 4 的倍数,不会是质数,所以答案最大是 4

E

如果是非二分图,Alice 必胜,每次输出 1 2 即可。

否则,二分图染色后得出两个集合 s1,s2,如果对方给出的数是我需要的,就取。

否则,就是一个集合染完,对方给我 3 和那个集合的数,那我就取 3 染就行了。

F

考虑最长的不合法区间的长度。

如果长度 3,且存在两个相等的数,就合法了。

否则最长一定是形如斐波那契数列的形式,在 45 次后就超了,所以 45 的区间一定能取出一个三角形,如果长度 48 一定能取出两个三角形。

然后怎么做,如果合法方案一个三角形对应的数的位置之间有没取的数,那么一定可以取。

所以排序后选取的形态,要么并集是连续 6 个数,要么是不交的两个连续的 3 个数。

判断一下即可。

228.区间(interval)

固定左端点,按照 gcd 划分不超过 log 段。

转化为 nlogV 次直线加矩形求和。

229.爆炸(boom)

将炸弹的行列连边,引爆相当于选择一条边遍历其一边,贡献的话,有联通块内部的,也有连向外部的。

如果一个联通块有环,全都能取。

如果没环,显然选叶子更优,记录一下叶子连出去的权值即可。

230.网络(network)

对点对 (u,v) 求贡献,u 操作时,对 v 有贡献,等价于 u 是路径上最后被操作的点。

若在环的不同子树内,容斥一下。

对于相同子树内的点,边分治卷积即可。

对于环的不同子树的点。

1722512140293

231.炸弹(bomb)

对于一种排列,容易求答案,即 max(ri,ri+1)+1,再将多余的空格插入。

按照 ri 从小到大插入 dp,记录连续段即可。

232.色彩(color)

点分树的空间优化,对每一层开一个 O(n) 的数组即可。

考虑点分治,维护到根的最长答案以及最长前缀,可以 O(loglogn) 找到 LCA

也可以做到 O(1)

233.咒语(spell)

弱智题。

234.街道划分(street)

set 维护前缀所有 lst

找到后 kdp 即可。

235.货物运输(transfer)

复习了糖果传递!!!

对于树的情况,有最优解,对于一条边,找到其中一边多出的值,一定要流过这条边,这是必要的,也是充分的。

对于一个环的情况,一条边不会即从左往右流又从右往左流,所以记录 x 表示 (1,2) 流过多少,可以推出后面所有值 xi,还有方程 xi=xai,则环上边的总贡献为 wi|xix|

如果 wi=1,那么就是中位数,如果有很多 w,可以等价于 wi 个相同的数,二分找到中位数即可。

对于多个环的情况,其实是不会嵌套的,只需对每个环,记录环下面那个联通块多了多少,少了多少,这些流量一定是要流过这个环的,所以每个环的问题是独立的,太启发了!。

求出圆方树就随便做了,树的情况可以在树边上看作两个点的环。

236.CF1997F

这个相当于在模拟斐波那契的过程。

先将所有数推到 1

然后倒着推,最后 1 的个数就是最少的了。

每个位置有一个固定贡献,dp 即可。

posted @   蒟蒻orz  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示