Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

7月记录

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

近期计划:

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

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

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

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

code 很shi

105.ABC258H

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

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

106.ABC280G

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

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

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

107.最大值可爱捏(max)

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

只需要求 [x^k]S_m^n(x) 其中 S_m(x)=\sum\limits_{i\le m}\dfrac{x^i}{i!}

如果使用 fft 等方式计算,可以得到 O(k^2\log k) 的复杂度,预计得分 30-60​。

S_m(x)e^x 展开式的截断,考虑 (S_m(x))'=S_m(x)-\dfrac{x^m}{m!},则 (S_m^n)'=nS_m^{n-1}(S_m-\dfrac{x^m}{m!})=nS_m^n-nS_m^{n-1}\dfrac{x^m}{m!},则固定 m,可以在 O(nk) 的时间内递推出所有 S_m^i,0\le i\le n,总复杂度 O(nk^2),预计得分 15

发现 S_m^n 需要求到第 k 项,而 S_m^{n-1} 只需要求到第 k-m-1 项,并且 mn\le k 的情况无贡献,则对于每个 m,时间复杂度变为 \frac{k^2}{m},总复杂度 k^2(\log k-\log (\frac{k}{n}))=O(k^2\log n),预计得分 60

若知道了各个 S_m^i,那么 [x^k]S_{m+1}^n 也是容易计算的。考虑定期重构,设阈值 B,先预处理出所有 B\mid m,1\le i\le nS_m^i,这里的复杂度为 O(\dfrac{nk^2}{B})

对于任意 m=Bl+r,展开 S_m^n=(S_{Bl}+(S_m-S_{Bl}))^n=\sum\limits_{i}\binom{n}{i}S_{Bl}^{n-i}(S_m-S_{Bl})^i,后者有 ir 项,并且可以类似上文做法递推出所有值,而前者均已经算过,这部分复杂度为 O(kn^2B),平衡得到 O(n^{1.5}k^{1.5})

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

设在 m 处重构的概率为 p,可以认为 d=\frac{1}{p},则可以认为在单个 m 的复杂度为 O(p^{-1}(\frac{k}{m})^2+p\frac{k^2}{m}),取 p=m^{-0.5} 得到 O(k^2m^{-1.5}),对 m\frac{k}{n}k 求和可得 O(k^2(\frac{k}{n})^{-0.5})=O(k^{1.5}n^{0.5}),可以通过本题。

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

108.word(word)

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

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

109.partition(partition)

容易有 dpf_{i,x,y}

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

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

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

image

倒序处理即可。

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

126. 序列(sequence)

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

发现 f(l,r)=\sum_{i=l}^{r} min((s_i-s_{l-1})\bmod k, k - (s_i-s_{l-1})\bmod k),因为考虑第一个数,不管他往上还是往下,第二个数取模后的值固定。

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

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

127. 笔(交互题)(pen)

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

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

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

128. 炉石(game)

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

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

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

t=\frac{1}{n+m}x,则没成函数是 \sum_{i=0}^{a_i-1}\frac{t^iy^i}{i!},死了的生成函数是 y^{a_i}(e^t -\sum_{i=0}^{a_i-1}\frac{t^i}{i!})

求出 [y^{d-1}]F 的多项式 G,求出 \sum_i [x^i]i! G,即 G 转成普通生成函数的系数和。

怎么转呢?

\frac{x^a}{a!}e^{bx}=\sum_{i}\frac{b^ix^{i+a}}{i!a!} \to \sum_{i}b^ix^{i+a}\binom{i+a}{i}=\frac{x^a}{(1-bx)^{a+1}}

(\frac{1}{1-x})^{n+1}=\sum_{i}x^i\binom{i+n}{i}

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

129.match(match)

考虑 hall 定理的扩展。

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

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

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

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

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

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

时间复杂度 \mathcal O(n\log^2 n)

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

148.CF1983

D

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

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

F

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

G

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

E

很奇妙。

考虑普通球的排列,A 选 t=\lceil \frac{n}{2}\rceil 个,选出的普通球的和的期望值为:

\frac{\sum a_i \cdot \binom{n-1}{t-1}\cdot t! \cdot (n-t)!}{n!}=\frac{t}{n}\cdot \sum a_i

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

149.灯塔(lighthouse)

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

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

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

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

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

image

hot!

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

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

u\in S, v\in S',若 u,v 有边,则删 v,否则删 u

image

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

151.汉堡王(burger)

原神!

非常抽象的题。

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

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

在坐标轴上考虑点集 \bigg\{\left(i,\sum_{j\leq i} a_j\right)\bigg\}_{i=0}^m=\left\{\left(i,\left\lfloor\frac{d\cdot i}{hp}\right\rfloor\right)\right\}_{i=0}^m,找到上凸壳,按照分界点分组。

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

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

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

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

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

152.GUILIN23C Master of Both IV

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

153.LGV引理

行列式求值:

  • 交换行/列,值取反;

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

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

  • image

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

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

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

LGV 引理小记

image

即要求当 p\ne (1,2,3,\cdots,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

根本不会写。

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

有结论:image

即序满足 \forall i\in[k, n] s_i-s_{i-k} < \frac{k}{2}

image

枚举第一列的所有元素。

考虑轮廓线 dpf_{i,j,S} 表示当前在第 i 行第 j 列,(i-1,j),(i-2,j),\cdots ,(1,j),(i,j - 1),(i+1,j-1),\cdots ,(n,j-1) 的值放在 S 中的方案数。

\mathcal O(n(\frac{k}{2})^{\frac{2n}{k}}),50pts。

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

将第 2\sim 5 行的图像向左平移到第一行的区间中。

然后第 i 行的图像向下平移 \frac{i}{k/2},则第 i+1 行在第 i 行下。

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

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

\mathcal O((\frac{n}{k})^{3} (\frac{k}{2})^{\frac{n}{k}})

157.自同构(iso)

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

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

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

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

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

image

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

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

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

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

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

image

跑出 n\le 250 时的答案就够用了。

image

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

158.套路 Exchange Argument

[AGC023F] 01 on Tree

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

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

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

P4437 [HNOI/AHOI2018] 排列

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

合并书籍(A)

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

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

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

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

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

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

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

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

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

160.CF1987

打成了shi。

C

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

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

  • h_i\le h_{i+1}g_i\leftarrow g_{i+1}+1

  • 否则若 h_i>h_{i+1}h_i>g_{i+1}+1 说明 h_i 在过程中一直下降不会出现相等的情况,则 g_i\leftarrow h_i

  • 否则 g_i\leftarrow g_{i+1}+1

D

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

考虑 dp B 取的种类,分别为 1\le i_1<i_2<\cdots <i_k\le n,要求满足 \forall p\in[1,k],\sum_{j=1}^{p}c_{i_j}+p-1<i_p,画画图就行了,于是有 \forall p\in[1,k],\sum_{j=1}^{p}c_{i_{j}}<i_p-p+1

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


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

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

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

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

好像有个反悔贪心做法。

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

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

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

时间复杂度 \mathcal O(n\log n)

E

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

记题目转化为:

每个点有权值 b_i,每次可以选择一条边 (fa_u,u)b_{fa_u}\leftarrow b_{fa_u}+1b_u\leftarrow b_u-1,使得所有 b_i\ge 0 的最小操作数。

直接跑费用流可以做到 \mathcal O(n^2)

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

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

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

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

还有一种 nb 方法。

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

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

可能应该可以做到 \mathcal O(n\log^2n) 或者平衡树 \mathcal O(n\log n)

F

很妙!!!!

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

我们在对 a_i 操作时,需满足左侧操作数恰好为 \frac{i-a_i}{2}

f_{l,r,x} 表示 [1,l-1] 进行了 x 次,[l,r] 最多可以进行几次。

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

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

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

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

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

时间复杂度 \mathcal O(n^3)

G1

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

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

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

当区间往外连边时,有:

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

考虑求 f(i,j),则 a_i,a_j\ge \max_{k=i+1}^{j-1}a_k

i,j 一定满足 R_i=jL_j=i,则:

  • a_i<a_jL_i\ne 0,则 iL_i 连边,答案为 1+f(L_i,j)
  • a_i>a_jR_j\ne 0,则 jR_j 连边,答案为 1+f(i,R_j)
  • i,j 连边,答案为 2

记忆化 \mathcal O(n) 求解。

值得好好思考的问题!!

还有G2。。

161.loj6243. 关灯问题

对只需要第一行的变量,可以得出第二行的变量,于是拿一行进行高斯消元即可,\mathcal O(\frac{n^3}{w})

162.CF671C

hot!!!

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

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

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

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

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

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

于是考虑 i+1\to i,找到倍数下表 x_1,x_2,\cdots x_k,那么:

  • k=1 不会更新;
  • l\in (x1,x_k),r \in [l,x_k),则取 x_1,x_k 最优,令 t_l\leftarrow x_k
  • l\in (x_2,x_k],r\in [l,n],则取 x_1,x_2 最优,令 t_l\leftarrow n+1
  • l\in[1,x_{k-1}),r\in [l,x_{k-1}),则取 x_{k-1},x_k 最优,令 t_l\leftarrow x_{k-1}

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

也可以观察到 i\le f_{l,r}\le f_{l+1,r},那么 t_l\le t_{l+1},更新的是一段前缀,二分即可。

163.bishojo

!!!!!!!!

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

妈的。

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

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

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

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

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

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

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

时间复杂度 O(n+m)

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

真是神泵。

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

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

设左右儿子为 lc,rc,设 g_{u,j} 表示子树 u 的第一位 \ge j 的最小代价。

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

如果 j 在左子树,如果 f_{rs,j}<w_u 同上面一样处理。

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

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

165.CF1648D Serious Business

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

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

dp_x\leftarrow dp_{l-1}+S2(l,x)-cost\\ dp_x\leftarrow \max_{j=l}^{x} S1(1,j)+S2(j,x)-cost

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

时间复杂度 \mathcal O(n\log^2 n)

166.P10538 [APIO2024] 星际列车

hot!!

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

f_i\leftarrow \min_{b_j\le a_i, y_j=x_i} f_{j}+g(b_j + 1, a_i - 1) \cdot t_{x_i} + c_i

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

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

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

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

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

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

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

167.P4654 [CEOI2017] Mousetrap

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

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

则每次老鼠的最优策略是走入 f_v 最大的 v,于是我们的策略就是堵上这个 v,那么老鼠只能走次大值,于是 f_u \leftarrow f_{v2}+du(u)-2

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

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

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

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

考虑固定 T,计算 S

ST 的虚树上。

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

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

还有一种做法。

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

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

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

咕咕。

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

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

(a,b)\to c,表示 t_{a}\cdot f_{v,b}\to t'_c,则有:

  • (0,0)\to 0
  • (0,1),(1,0)\to 1​
  • (0,2),(2,0)\to 2
  • (3,0),(1,2),(2,1),(1,1),(2,2),(3,1),(3,2)\to 3

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

  • (0,0)\to 0
  • (1,0)\to 1
  • (2,0)\to 2
  • (3,0)\to 3
  • (0,1)\to 3
  • (2,1)\to 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,将 b1\sim b4,b5\sim b8 换成原来的相对顺序,这样右子树没有比左节点小的数了。

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

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

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

??真的思维啊!!!

174.姬路市仙人掌(trans)

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

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

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

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

175.集合(set)

image

176.排列(perm)

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

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

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

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

177~187.模拟费用流小记

188.CF1975

D

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

E

简单题了。

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

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

F

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

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

每次集合数量减半。

容易维护。

F 类似题 P6740 [BalticOI 2014 Day1] Sequence

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

image

G

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

f_{i}=\sum_{j=0}^{m-1}(t_{i+j}-s_j)^2\cdot t_{i+j}\cdot s_j

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

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

如果只有一个式子带 *,记形式为 *s_1*s_2*s_3*\cdots s_k*

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

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

时间复杂度 \mathcal O(n\log n)

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

可能会花费多轮。

注意到题目等价于每个点赋值一个颜色 a_i,边上的两个端点颜色不相等,求 \min \sum a_i\cdot val_i

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

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

E

有弥补缺漏性的。

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

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

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

这下匹配点数是 \mathcal 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

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

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

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

E

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

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

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

F

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

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

214.ARC180

A

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

B

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

考虑有一个数 a,他当前能与后面的 b_1,\cdots, b_k 交换,p_a<p_{b_1}<\cdots<p_{b_k}

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

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

C

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

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

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

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

D

咕咕。

215.UNR #8 兵棋

image

image

216.UNR #8 里外一致

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

217.树上路径(tree)

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

可以 bitset 维护。

二进制分组,因为是重心,可以分析出 \mathcal O(\frac{n\sqrt n}{w})

218.字符串(string)

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

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

219.染色(color)

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

上下界网络流处理。

220.数学题(math)

可以用矩阵乘法维护。

考虑求前缀逆元。

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

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 的子区间,要求这些子区间中至少有一个字符为结尾字符。

f_s 表示不存在结尾字符 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

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

计算后缀拼上前缀的答案,维护前缀和后缀,例如 a_{l-1}\ge \sum_{i=l}^{mid}a_i 的合法的 l,后缀同理。

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

226.P9530 [JOISC2022] 鱼 2

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

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

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

C

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

考虑判断一个数是否可行,记 w=abc,则需要 \lfloor\frac{a}{2}\rfloor\lfloor\frac{b}{2}\rfloor\lfloor\frac{c}{2}\rfloor\ge n

\mathcal O(\frac{\sqrt V}{\ln V}) 分解质因数,搜索分配即可。

D

227.CF1991

D

妈的。

n\le 6 时,答案 \le 4

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

E

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

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

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

F

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

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

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

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

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

判断一下即可。

228.区间(interval)

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

转化为 n\log V 次直线加矩形求和。

229.爆炸(boom)

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

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

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

230.网络(network)

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

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

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

对于环的不同子树的点。

1722512140293

231.炸弹(bomb)

对于一种排列,容易求答案,即 \sum \max(r_i,r_{i+1})+1,再将多余的空格插入。

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

232.色彩(color)

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

考虑点分治,维护到根的最长答案以及最长前缀,可以 \mathcal O(\log \log n) 找到 \operatorname{LCA}

也可以做到 \mathcal O(1)

233.咒语(spell)

弱智题。

234.街道划分(street)

set 维护前缀所有 lst

找到后 kdp 即可。

235.货物运输(transfer)

复习了糖果传递!!!

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

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

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

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

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

236.CF1997F

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

先将所有数推到 1

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

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

posted @   蒟蒻orz  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示