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 n\)\(S_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)

容易有 dp\(f_{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'\),一个能到,一个不能到,分别表示 \(x\)\(y,z\) 的可能。

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

image

不管选没选到 \(x,y,z\),最后都会剩下 \(x\)\(z\)

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

枚举第一列的所有元素。

考虑轮廓线 dp\(f_{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}+1\)\(b_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=j\)\(L_j=i\),则:

  • \(a_i<a_j\)\(L_i\ne 0\),则 \(i\)\(L_i\) 连边,答案为 \(1+f(L_i,j)\)
  • \(a_i>a_j\)\(R_j\ne 0\),则 \(j\)\(R_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=0\)\(m\bmod 2=0\) 时先手会取两个序列所有奇数位置上的数。令这样取出来 \(c\)\(w\),证明是容易的:

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

对于 \(n\bmod 2=1\)\(m\bmod 2=0\) 时,同样可以得出先手只会取序列 \(A\)。此时会变成上一种情况。所以仅需证明先手取 \(B\)\(ans\) 不会变大:根据数学归纳法,当 \(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<i2\)\(i1\) 的决策点小于等于 \(i2\) 的决策点,我们可以在 \(j\) 的集合维护一个单调队列 \((j,l,r)\) 表示 \(j\) 对应的被决策点是区间 \([l,r]\)

加入一个决策点 \(nj\) 时,取出队尾 \((j,l,r)\),若 \(nj\)\(l\) 点的答案优于 \(j\)\(l\) 点的答案,那么删掉队尾,并将 \([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_x\)\(sum\) 为到跟需要堵上的支路数量。

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

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

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

考虑固定 \(T\),计算 \(S\)

\(S\)\(T\) 的虚树上。

在圆方树上跑一个虚树 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,a4\)\(a5,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\) 位为 \(1\)\(T\)\(S\)\(T\) 的交一定多一,我们只需将 \(V_{f_T}\) 右移一位(因为最后一位一定满足)。

这个时候可以将 \(T\)\(0\) 还是选一的两个限制集合合并。

每次集合数量减半。

容易维护。

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\)

找到后 \(k\)dp 即可。

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 @ 2024-07-04 07:16  蒟蒻orz  阅读(37)  评论(0编辑  收藏  举报