2026.8 种田精灵

洛谷P14301 [JOI2023 预选赛 R2] 日本沉没 2 / Japan Sinks 2
\(b_i\) 为最初的 \(a_i\)\(p_i=\max_{j=1}^{i}a_j\)\(s_i=\max_{j=i}^{n}a_j\)\(c_i=\min(p_i,s_i)\),那么答案就是 \(\min(b_i,c_i)\)
为啥呢?若 \(c_i\ge b_i\),那么 \(p_i\ge b_i,s_i\ge b_i\),所以目前的修改操作都会被挡住,答案就是 \(b_i\)
\(c_i<b_i\),那么 \(p_i<b_i\)\(s_i<b_i\),也就是说它一定被修改了至少一次,被修改后就有 \(c_i=a_i\)
你发现这个 \(c_i\) 是一个先不减后不增的序列,不减部分的 \(c_i=p_i\),不增部分的 \(c_i=s_i\)
设不减部分和不增部分的交为 \([l,r]\),当前有一个强度为 \(p\) 的西风。
\(p\ge r\),那么 \([1,r]\)\(p_i\) 会减 \(1\),也就是对 \(c_i\) 做前缀减 \(1\)
\(p<r\),设 \(x\)\((p,n]\) 中第一个满足 \(c_i\le b_i\) 的位置,那么 \([1,x)\)\(p_i\) 会减 \(1\),就是对 \(c_i\) 前缀减 \(1\)
为啥呢?因为 \(c_r\le b_r\),所以 \(x\le r\),也就是说可以把 \(c_i\) 当作 \(p_i\)
\(p_i\le b_i\) 是说 \(i\) 是一个前缀最大值,故 \(x\) 是一个前缀最大值,而这次操作只会对 \([1,x)\) 中的前缀最大值减一,也就是 \(p_i\)\(1\)
东风同理。
线段树简单维护一下就做完了。
洛谷P8330 [ZJOI2022] 众数
若区间固定,那么答案就是区间内的众数出现次数加上区间外的众数出现次数。
根号分治,把全局出现次数大于根号的称为好数,其它的是坏数。
考虑区间外的众数是好数的情况,设它为 \(x\)
枚举 \(x\),然后枚举区间内的众数 \(y\)
可以发现,一个区间的答案为 \(x\) 的出现次数加上 \(y\) 在区间内的出现次数减去 \(x\) 在区间内的出现次数。
\(x\) 看成 \(-1\)\(y\) 看成 \(1\),就是要求最大子段和。
枚举 \(y\) 的所有出现位置,要求一个区间内的 \(x\) 出现次数,可以预处理前缀和。
考虑区间内的众数的好数的情况,你发现这和上面部分差不多,我就不写了。
现在只用考虑两个众数都是坏数的情况。
枚举区间外的众数 \(x\),设它的出现次数为 \(c\)
显然有用的区间至少满足 \(l=1,r=n,a_{l-1}=x,a_{r+1}=x\) 中的一个,而个数是 \(O(c^2)\) 级别。
考虑总区间个数,有 \(\sum c_i\le n,\max c_i\le\sqrt{n}\),那么 \(O(\sum c_i^2)\le O(\max c_i\sum c_i)\le O(n\max c_i)\le O(n\sqrt{n})\)
但肯定不能查询 \(n\sqrt{n}\) 次区间众数啊。那咋办。
有一个性质就是,区间内的众数出现次数最多(?)为 \(\sqrt{n}\),如果大于根号的话就看成根号。
\(p_{i,j}\) 为最小的 \(r\) 使得 \([i,r]\) 的众数出现次数为 \(j\)\(j\le \sqrt{n}\)。有 \(p_{i,j}\ge p_{i-1,j}\),可以对每个 \(j\) 做双指针。
把所有询问都插到左端点上。设当前左端点为 \(l\),把 \(l\) 对应的所有右端点排序,然后和所有 \(p_{l,j}\) 归并就行。
至于怎么把右端点排序,先把所有询问插到右端点上,再枚举右端点,把询问插到左端点上即可。
发现还要求所有可能的众数,显然这些都只会是区间外的众数,求答案的时候记录下 \(ans_x\) 表示区间外的众数为 \(x\) 时的答案即可。
洛谷P17140 [NOI 2026] 线段
对于一堆线段显然它合法的充要条件是能分成两个集合,集合内线段两两不交,且整个图联通。
??地,把所有线段按左端点排序,维护两个集合的右端点 \(r_1,r_2 \ (r_1<r_2)\),加入线段 \([l,r]\) 需要满足 \(l\in(r_1,r_2]\),然后令 \(r_1=r\),若 \(r_1>r_2\) 就交换。
排序然后 dp。设 \(f_{i,j,k}\) 表示加到线段 \(i\),某一个集合的右端点为 \(r_i\),另一个集合的右端点为 \(j\),目前加入 \(k\) 条线段的方案数。
转移是简单的,枚举下一条线段后更新 \(j\) 就行。注意到下一条线段的左端点是一个区间,故编号也是一个区间,差分优化转移即可。
核桃 126 S 模拟赛 C 「RSOI-3C」树上操作
先考虑菊花怎么做。
\(X\) 的最高位是 \(1\),那么 \(ans_1\) 最多为 \(2\)
把最高位为 \(0\) 的分到集合 \(S\),为 \(1\) 的分到集合 \(T\),那么答案为 \(2\),当且仅当 \(\exists x\in S,y\in T,x\oplus y\ge X\)
维护 \(x\oplus y\) 的最大值即可。
考虑 \(X\) 的一般情况。设 \(X\) 最高位 \(0\) 连续段长为 \(l\),把这些数按最高 \(l\) 位分类后就是上面的情况。
考虑树的一般情况,直接套一层 dsu on tree 就做完了。
洛谷P3642 [APIO2016] 烟花表演
有一个显然的 dp,设 \(f(x)\) 表示爆炸时间为 \(x\) 的最小代价,\(g(x)\) 表示在上面加一条 \(w\) 的边后爆炸时间为 \(x\) 的最小代价,你发现这个是下凸的。
考虑转移。设 \(f(x)\) 的最小值区间为 \([l,r]\)
\(x<l\),把 \(w\) 改成 \(0\) 最优,\(g(x)=f(x)+w\)
\(l\le x<l+w\),把 \(x-w\) 改成 \(l\) 最优,\(g(x)=f(l)+l-x+w\)
\(l+w\le x\le r+w\),不动最优,\(g(x)=f(l)\)
\(r+w<x\),把 \(x-w\) 改成 \(r\) 最优,\(g(x)=f(l)+x-w-r\)
slope trick 随便做啊。
CF1770F Koxia and Sequence
!?强强?!
你发现回文序列可以抵消,所以 \(n\) 为偶数时答案就是 \(0\),奇数时答案是所有 \(a_{1}\) 的异或和。下面不考虑 \(n\) 偶的情况。
你发现或和恰好为 \(y\) 也太难绷了,容斥成或和为 \(y\) 的子集。
拆位,设当前是第 \(k\) 位,要计数 \(a_1\)\(k\) 为是 \(1\) 的情况,也就是:

\[\sum_{\sum a_i=x-2^k}[a_1\subseteq y-2^k][a_2\subseteq y]...[a_n\subseteq y]\bmod 2 \]

注意到 \([x\subseteq y]\equiv\binom{y}{x}\pmod 2\),就是:

\[\sum_{\sum a_i=x-2^k}\binom{y-2^k}{a_1}\binom{y}{a_2}...\binom{y}{a_n}\bmod 2 \]

范德蒙德卷积变成 \(\binom{ny-2^k}{x-2^k}\bmod 2=[x-2^k\subseteq ny-2^k]\),直接做就行。
CF2107F2 Cycling (Hard Version)
有一个贪心就是,把最小值换到最后,然后每次往前就换一次最小值。
这是错的,样例第四组就是反例。修改一下,把序列分成若干段,段内单独做贪心就对了。
dp。设 \(f_i\),表示 \([1,i]\) 的答案,有转移:

\[f_i=\min\limits_{1\le j\le p\le i}\{f_{j-1}+a_p\times(i-j+1)+(i-p)+(i-j)\} \]

显然 \(p\) 一定是 \([j,i]\) 中最后一个最小值的位置。
你发现这个转移太过诡异,直接枚举 \(i\) 做很困难,考虑枚举 \(p\) 转移。
把上面那一坨拆成 \(2\times i+a_p\times i+a_p\times(1-j)-p-j+f_{j-1}\),发现最优的 \(j\) 只和 \(p\) 有关,李超树求出来 \(j\) 后直接李超树转移 \(f_i\)

posted @ 2026-08-04 17:49  天域_awa  阅读(17)  评论(0)    收藏  举报