做题记录

再不写要退役了,写一下做题记录。

P10350 [PA 2024] Modernizacja Bajtocji

怎么这么难,原来是题读错了,这个题的 + 操作如果两个人手上都有电脑那么这个电脑就不会再送了(相当于每个居民手上最多有 \(1\) 台电脑)。

考虑什么情况下一个居民必定有一台电脑,我们先考虑连边,发现如果连的边构成了一个环那么这个环中的所有点都一定有电脑,那么没有删除操作就好做了,在讯问时判断 \(x\) 是否属于一个环,如果属于则答案是 1 否则看是否有操作覆盖到这个点如果有则答案为 ? 否则为 0,最后我们加上删点操作我们发现相当于加入了一个新点而对于与它属于同一个连通块内的点的代价就是会吞掉这个连通块内的一次操作,所以对于每次删除直接建一个新点并把原连通块内的操作数减一即可,查询直接查询连通块内的操作数是否大于等于 \(1\) 即可。

P5283 [十二省联考 2019] 异或粽子

感觉很板子,首先考虑把区间异或和转成前缀异或和的异或值,那么我们发现 \(k\leq 2\times 10^5\) 考虑一个时间复杂度带 \(k\) 的做法,首先我们对于每一个 \(r\) 求出其作为右端点能组成的最大的异或值,并塞入大根堆,每次从大根堆中拿出最大的并塞入这个 \(r\) 作为右端点的第 \(k+1\) 大的值即可,时间复杂度 \(O(k\times (\log{n}+\log{V}))\)

加强一下(主要是我先写了一个非常勾史的 \(\log{V}^2\) 做法),假设 \(k\leq \frac{n\times(n-1)}{2}\) 的话怎么做,我们发现可以二分第 \(k\) 大的值,然后在可持久化 Trie 树上查询区间异或值大于等于 \(mid\) 的个数,然后我们统计出区间异或值大于 \(kth\) 的和与个数然后剩下的选第 \(k\) 大的值即可,这个做法比上面的难打 \(100\) 倍而且还要被卡常。
紫题 \(520\)

P7840 「C.E.L.U-03」重构

贪心还是太难了,我们发现一个点的度数从 \(d_i\to d_i+1\) 那么增量为 \((2\times d_i+1)\times v_i\)\(d_i\to d_i-1\) 的增量为 \(-(2\times d_i-1)\times v_i\) 那么考虑贪心,我们每次拿出 \((2\times d_i+1)\times v_i\) 最小的和 \((2\times d_i-1)\times v_i\) 最大的然后看是否换了之后更优就行了,时间复杂度我也不会证明,注意这里要判断这个点的度数是否可以加或减,一开始让所有点都连上一个点就行了(即是一棵菊花)。

P8162 [JOI 2022 Final] 让我们赢得选举 / Let's Win the Election

太难了,首先考虑一个错的贪心,我们按 \(b_i\) 排序然后枚举多选多少个人,直接拿前 \(k\) 小的 \(b_i\) 然后在从小往大拿 \(a_i\) 即可,但是我们发现这样是错的因为可能有一个 \(a_i\) 非常小而 \(b_i\) 也不算大但是这个拿 \(a_i\) 更优,但是这个贪心中有一部分是对的,第一个是一定先增加人在拿票,第二个是增加人的顺序一定按照 \(b_i\) 从小往大,所以我们考虑 dp,我们定义 \(f_{i,j}\) 表示 \(b_i\)\(i\) 小的有选了 \(j\) 人的最小代价,那么剩的直接按照 \(a_i\) 从小往大排序选择即可。

P6815 [PA 2009] Cakes

套路题啊,看这个,应该可以得到一个 Trick 就是一个边数为 \(m\) 的无向图中三元环的个数最多有 \(m\sqrt{m}\) 个。

P6820 [PA 2012 Finals] Two Cakes

感觉不好自己想到啊,首先我们可以很轻松的想出一个 \(n^2\) 的 dp,我们定义 \(f_{i,j}\) 表示第一个写到 \(i\) 第二个写到 \(j\) 的最小时间,那么转移就是若 \(a_i=b_j,f_{i,j}=\min(f_{i-1,j},f_{i,j-1})+1\) 否则 \(f_{i,j}=f_{i-1,j-1}+1\),我们乍一看这个东西好像无法优化,但是我们又发现这个题目保证了 \(a,b\) 均为排列,所以我们发现对于第一种情况最多只会出现 \(n\) 次,而对于第二种我们所有的转移都是规律的即 \(f_{i,j}=f_{i-k,j-k}+k\) 所以考虑记忆化搜索,我们对于每次的 \(i,j\) 分讨,如果 \(a_i=b_j\) 则递归 \((i-1,j),(i,j-1)\) 即可,否则我们找到最大的 \(k\) 使得 \(a_{i-k+1}=b_{j-k+1}\) 这个我们直接把下标塞入一个位置差的桶中二分即可。

P5992 [PA 2015] Rozstaw szyn

so hard,考虑一个贪心,对于一个点 \(x\) 我们不考虑 \(x\) 于其祖先的贡献,那么 \(x\) 取所有儿子的值的中位数即可,但是我们发现如果儿子个数为偶数我们无法知道取哪一个,不妨我们把一个点的取值变成一个区间 \(l_x\sim r_x\) 那么我们发现对于一个点 \(x\) 直接把所有儿子的区间左右端点都放入序列中排序之后取中位数又组成一个区间,那么我们进行一次 dfs 之后每一个点都有一个取值范围 \(l_x\sim r_x\) 然后我们分讨一下这个点取谁能更优即可,我也不会证明放区间左右端点的东西,可以感性理解一下。

P5997 [PA 2014] Pakowanie

不是很难,首先我们可以发现 \(c_i\) 一定从大到小排序一个一个放,然后我们定义 \(f_{i,j}\) 表示用了前 \(i\) 个包放了状态为 \(j\) 的物品第 \(i\) 个包能剩的最大的容量,转移就是 \(f_{i,j}-a_k\to f_{i,s}\) 以及 \(c_{i+1}-a_k\to f_{i+1,s}\) 然后我们发现这样的时间复杂度是 \(2^n\times n\times m\) 完全不可过,通过观察我们可以发现背包个数最多用 \(n\) 个就行了,那么只保留前 \(\min(n,m)\) 大的背包即可,时间复杂度 \(2^n\times n^2\) 卡卡常能过。

P10357 [PA 2024] Żelki

不是很难,首先我们考虑如何满足每种种类的糖豆个数都要一致,我们假设每种取了 \(k\) 个,那么我们对于最后的方案一定能拆成每种只选 \(1\) 个的 \(k\) 组合并起来,于是我们考虑定义 \(f_{i,j}\) 表示选了前 \(i\) 中每种一个重量之和模 \(m\)\(j\) 的最小代价,然后我们考虑跑一个同于最短路即可。

P9097 [PA 2020] Elektrownie i fabryki

简单题,首先我们考虑一段合法的区间长什么样子,我们发现对于区间 \(l\sim r\) 如果可以划分出来一定有 \(\sum_{i=l}^{r}a_i\geq0\) 然后我们再将其转成前缀和就是 \(s_r-s_{l-1}\geq 0\) 然后定义 \(f_i\) 表示前 \(i\) 个都分配好了的最小成本,所以 \(f_i=\min(f_j+(j-i-1)),s_i-s_j\geq 0\) 那么这个直接树状数组优化即可。

P11915 [PA 2025] 瞬间传送 / Teleport

有点牛,不会贪心所以写了个 \(\frac{n^4\times \log{n}}{w}\) 的东西,但是跑得很快,首先我们考虑二分答案 \(ans\) 然后我们先枚举加入的边的端点 \(u,v\),不难发现对于一对 \(i,j\) 不合法当且仅当 \(dis_{i,j}>ans,dis_{i,u}+dis_{j,v}>ans,dis_{i,v}+dis_{j,u}>ans\) 那么我们考虑枚举 \(i,j,u,v\) 其中的三个,不妨就枚举 \(u,v,i\) 然后我们只需要判断是否存在 \(j\) 即可,我们将上面的后两个柿子移项可以得到 \(dis_{v,j}>ans-dis_{i,u},dis_{u,j}>ans-dis_{i,u}\) 所以可以得出对于这个 \(j\) 需要满足 \(dis_{i,j}>ans,dis_{v,j}>ans-dis_{i,u},dis_{u,j}>ans-dis_{i,v}\) 所以我们对于每个点处理出来一个 bitset,\(f_{i,j}\) 表示 \(dis_{i,x}>j\) 的所有 \(x\) 在查询时只需要将 \(f_{i,ans},f_{u,\max(0,ans-dis_{i,v})},f_{v,\max(0,ans-dis_{i,u}}\) 并起来看是否有位置是 \(1\) 即可。

P6223 [CHCI 2009 Final Exam #1] PODJELA

不难,首先不难想到树形 dp,然后可以得出一棵大小为 \(x\) 的子树的操作数不会超过 \(x-1\) 次,然后我们转化题意为把每个点的点权设为 \(x-a_i\) 然后求最小的次数使得每个点的点权 \(\geq 0\) 的最小次数,考虑 dp,定义 \(f_{i,j}\) 表示使得 \(i\) 子树中除了 \(i\) 的点都满足条件用了 \(j\) 次操作第 \(i\) 个点的最大权值,那么转移为 \(f_{u,j}+f_{v,k}\to f_{u,j+k+1}\) 就是将 \(v\) 这个点的点权也给 \(u\) 然后还有不把 \(v\)\(u\) 但是需要保证 \(v\) 的点权合法即 \(f_{v,k}\geq 0,f_{u,j}\to f_{u,j+k}\),最后只需要输出满足 \(f_{1,i}\geq 0\) 的最小的 \(i\) 即可。

P4810 [COCI 2014/2015 #3] STOGOVI

不难,首先我们考虑如何维护加入栈顶和踢出栈顶的操作,我们发现我们可以把一个栈维护成一条链,那么每次就是在一条链末尾加一个点或者是跳到一个点的父亲,那么对于前两个操作就很好维护了,对于查询操作有一个想法就是你维护一条从根节点开始的链的 bitset 即哪些权值出现过然后并一下就行了,但是我们发现 \(n\leq 3\times 10^5\) 时间复杂度炸了,通过观察我们发现每次加入的数都一定是不同的,所以直接查询树上两个点的 lca 的深度即可。

P4422 [COCI 2017/2018 #1] Deda

没脑子题,三位偏序板子题,难点在于读懂题。

P4616 [COCI 2017/2018 #5] Pictionary

不难,首先我们可以枚举在第 \(i\) 天会合并的那些点然后我们就可以用一个并查集维护是否合并过了,我们发现最后一定会建出来一棵树,那么对于 \(x,y\) 的答案就是 \(x\sim y\) 路径上的最大值了,在并查集合并的时候把 \(x,y\) 这条边的边权设成 \(i\) 即可。

P5052 [COCI 2017/2018 #7] Go

考虑区间 dp,我们定义 \(f_{i,j,k,0/1}\) 表示我们走过 \(i\sim j\) 现在在左端点还是右端点以及当前时间是 \(k\) 的最多能收集的糖果数,我们发现如果其走过一个点则一定不会走回去,所以区间 \(i\sim j\) 一定只会往大扩展,但是我们发现这个时间复杂度是 \(n^3\) 的无法通过,通过观察可以发现 \(i,j\) 中只用存有糖果的就行了,所以我们 \(i,j\) 表示为走过区间 \(a_i\sim a_j\) 的答案,这样就把之间复杂度降到了 \(m^2n\) 可以通过,好像还可以通过换维可以降到 \(m^3\) 但是这题前一个就能过了就没优化了,在做题时还不小心 hack 了三篇题解,/tx。
蓝题 \(666\)

P4957 [COCI 2017/2018 #6] Alkemija

这题有点厉害,不知道如何想到,首先我们对于每一个操作都新建一个点 \(x_i\) 然后将 \(l\) 个原材料都连向 \(x_i\) 又让 \(x_i\) 连向 \(r\) 个成果,那么我们发现这样假设我们遍历到的点都是能得到的,如果一个 \(x_i\)\(l\) 给点都被遍历到了则可以加入 \(r_i\) 个成果,考虑一个类似拓扑排序的东西对于每个 \(x_i\) 记录入度我们发现如果一个点的 \(dg_i=0\) 了就可以把他的成果全部标记为可以然后减掉所有出边的虚点的入读即可,这样每个材料只能遍历一遍而且对于每一个虚点也只会遍历一遍,时间复杂度是 \(n+\sum (l_i+r_i)\) 的,感觉还是不好想到在图上搞。

P6319 [COCI 2006/2007 #3] LISTA

StayAlone好强,/bx。
大胆猜结论题,首先可以用队列得到最终序列长什么样子,然后大胆猜测答案的最小次数为 \(n\) 减去最长上升子序列长度,通过样例可以证明,然后我们思考如何构造可以发现最长上升子序列上的点把权值切成了一块一块的,那么对于每一块只需要看是往后移还是往前移即可,时间复杂度 \(n\log{n}\),结论不会证明但是过了就不管了。

P11535 [NOISG 2023 Finals] Airplane

性质题,首先发现直接做不好做,考虑观察性质,我们发现对于一个最优解一定可以刻画成一个前缀在不停上升,一个后缀在不停下降,中间的一段高度不变,又通过观察可以发现中间一段的长度一定小于等一 \(1\) 因为如果大于 \(1\) 那么一定可以调整成前面的先上升后面一部分下降,那么我们直接从 \(1,n\) 跑一遍到每个点的最短路即可,最短路的更新为 \(f_{to}=\min(\max(f_{u}+1,a_{to}))\)

P7962 [NOIP2021] 方差

妙妙题,通过观察可以发现一次操作之后,等同于交换相邻的两个差分值,有一个结论是使得方差最小的时候差分数组一定是先递减后递增的(相当于一个单谷),又有一个结论是对于值域在 \(v\) 的单调数组其差分数组中出现的值的数量在 \(\sqrt{v}\) 左右,那么我们发现 \(a_i\leq 600\) 所以差分数组的权值个数只有 \(20\) 左右那么直接 \(2^k\) 爆搜是放左边还是右边以及放多少个即可,虽然不是正解但是过了,/tx。

P7114 [NOIP2020] 字符串匹配

不难,首先我们发现可以枚举 \(AB\) 的长度和 \(i\) 那么通过枚举这两个就可以得到 \(C\) 了,我们可以通过预处理来算出 \(C\) 的 F 值,然后我们就变成了统计一个前缀中有多少个数的 F 值 \(\leq k\) 直接在扫前缀的时候开桶记录即可,判断 \({AB}^{i}\) 是否和一个前缀相等直接用哈希判断即可,时间复杂度 \(n\times \ln_{n}+n\times 26\)

P6418 [COCI 2014/2015 #1] ZABAVA

不难也好写,但是我为啥写了这么久啊。
首先我们发现两栋楼之间是互不影响的,那么考虑定义 \(f_{i,j}\) 为第 \(i\) 栋用了 \(j\) 次清空能得到的和的最小值,考虑如何处理这个东西我们发现用了 \(j\) 次能分成 \(j+1\) 组那么每一组先给 \(cnt_i\div (j+1)\) 个人然后在给剩下的 \(cnt_i\bmod (j+1)\) 组每组一个就行了,然后在定义 \(g_{i,j}\) 为前 \(i\) 栋用了 \(j\) 次的最小值,直接 dp 即可。

P5184 [COCI 2009/2010 #2] PASIJANS

简单题,有一个一眼的贪心是每次选取字典序最小的把第一个拿出来即可,而如何做到那字典序最小的呢,可以后缀数组,但是我不会所以直接二分加哈希就行了,二分第一个不同的位置,但是有一种特殊情况就是如果两个字符串一个是另一个的前缀要优先取剩余字符串多的那个。

AT_cf16_exhibition_final_e Water Distribution

妙妙题,首先我们发现 \(n\leq 15\),考虑一种做法是对于两个点之间如果要相互给就连一条边我们发现对于一个连通块中每个点能拿到的最大值是 \(s\) 减去边权的最小值之和的平均数,那么对于边权最小值就是最小生成树了,那么直接定义 \(f_i\) 为联通了 \(i\) 中的点的最小值,在合并若干个 \(f_i\) 即可,直接枚举子集转移即可。

P7868 [COCI 2015/2016 #2] VUDU

简单题,首先我们发现对于一个合法区间 \(l\sim r\) 可以写出柿子为 \(s_{r}-s_{l-1}\div(r-l+1)\geq p\),那么又把 \(l-1\) 变成 \(l\)\(\frac{s_r-s_l}{r-l}\geq p\) 然后打开变成 \(s_r-s_l\geq p\times (r-l)\to s_r-r\times p\geq s_l-l\times p\) 直接树状数组即可。

P3486 [POI 2009] KON-Ticket Inspector

简单题,题面好像有点问题,要强制选 \(k\) 个。首先不难想到是个 dp,直接定义 \(f_{i,j,k}\) 表示到 \(i\) 站上一次检票在 \(j\) 一共用了 \(k\) 次的最大值,转移直接分讨这一站是否检票即可,我们发现只用求出这一战能检到多少个上次没有的人,我们列成偏序关系就是 \(lst<l<i,r>i\)\(a_{l,r}\) 之和,这个直接前缀和处理即可,很简单,时间复杂度 \(n^2\times k\)

AT_arc207_c [ARC207C] Combine to Make Non-decreasing

感觉这个 trick 已经烂大街了,对于固定右端点的区间或只有 \(\log{V}\) 个,那么这个题就考虑定义 \(f_{i,j}\) 表示对于 \(1\sim i\) 最后一个值是 \(j\) 的最大能保留的长度,然后我们发现固定了右端点 \(i\) 所以 \(j\) 只有 \(30\) 个位置有值,考虑转移直接枚举一个 \(lst\) 然后在枚举一个 \(k\) 即可,这样时间复杂度肯定炸了,考虑优化。

我们发现对于每一个段 \(l\sim r\) 假设这个段中所有点到 \(i\) 的或都是一样的,那么我们就需要求出 \(l\sim r\) 中每一个 \(i\)\(\max(f_{lst,k}),k\leq (a_{r+1} \mid \dots \mid a_i)\),我们发现这样的段数不会超过 \(30\) 个所以考虑对于每一个段都维护一棵 \(g_j\) 的线段树其中 \(g_j=\max(f_{i,j})\),然后每次我们拓展右端点时涉及到合并段直接线段树合并即可,注意这个题要垃圾回收不然空间炸了。

P8321 『JROI-4』沈阳大街 2

这 trick 有点强,考虑把两个序列合并为一个 \(c\) 其中属于 \(a\) 的标记为红色,属于 \(b\) 的为蓝色,那么考虑将 \(c\) 序列从大到小排序,那么对于每一个匹配对我们只关心后一个的值,所以考虑定义 \(f_{i,j}\) 表示 \(1\sim i\) 匹配了 \(j\) 对的权值和,那么转移也很简单了直接分讨这个是和前面的匹配还是后面的即可,\(f_{i,j}=f_{i-1,j-1}\times c_i\times (cnt-j+1)+f_{i-1,j}\) 其中 \(cnt\) 表示前 \(i\) 个中与 \(i\) 颜色不同的个数。

AT_arc207_a [ARC207A] Affinity for Artifacts

有点厉害这题,如何想到的。我们考虑先将所有数的值都减去,那么 \(w\) 就减成了另一个数那么如果此时的 \(w\geq 0\) 答案为 \(n!\),否则考虑我们要让所有数减的值的和大于等于 \(-w\) 则可以使最后的值满足条件,考虑转化我们定义另一个序列 \(b_i=i-1\) 然后我们发现此题等同于让我们求有多少种配对方法使得 \(\sum \min(b_i,a_j)\geq \sum a_i-W\),不难发现和上面的题一样了再加一维表示和即可。

P12624 [ICPC 2025 NAC] Humans vs AI

看到求有多少个连续子序列果断分治,我们发现对于一个段子段 \(l\sim r\) 我们先求出人的和 \(H\) 和人机的和 \(A\) 然后有一个很 tang 的贪心就是一定会交换 \(h_i-a_i\) 最大的那个所以直接分治 \(h_i-a_i\) 最大的在哪边即可,然后推一个柿子就是 \((s_r-s_{l-1}-mx)\geq (s1_{r}-s1_{l-1}+mx)\times k,s_r-s1_r\geq s_{l-1}-s1_{l-1}+mx\times (k+1)\) 然后分讨 \(mx\) 在哪里之后直接主席树即可。

P3634 [APIO2012] 守卫

有点难想。有个错误的思路是将所有 \(0\) 区间先标记了,然后看 \(1\) 区间中未被标记的数是不是只有一个,如果有则那个一定是 \(1\),但是由于这个题还有 \(k\) 这一维的限制所以考虑贪心,我们可以先求出一个最少的用人数量,我们发现一定只会放在 \(r_i\) 上(一开始把包含的区间只留下最小的),然后我们考虑如何判断一个 \(r_i\) 是否必选,很典的一个结论就是假设这个点不选如果要大于 \(k\) 次则它必选,所以直接维护一个后缀需要的人数即可,定义为 \(g_i\) 同理前缀的为 \(f_i\) 如果 \(f_i+g_{nxt}>k\)\(r_i\) 必选,其中 \(nxt\) 为选 \(l_x>r_i-1\) 的最小的 \(x\)(按左端点排序),注意这里如果一个区间的右边一段被标记了要把区间缩一下。

P3566 [POI 2014] KLO-Bricks

不难,首先不考虑最后一个数的限制我们一定会按照出现次数从大到小第一个与上一个数不同的数,所以考虑开一个大根堆每次拿出大根堆的前两个如果第一个相同则放第二个否则放第一个,然后最后判断是否有相同的即可,这里有最后一个的限制所以我们考虑再加一维 \(f\) 表示是否与 \(q\) 相同,首先放与 \(q\) 相同的就行了,这题注意要特判 \(n=1\) 的情况。

CF1059E Split the Tree

糖糖题,首先因为我们每一个点只能选择一次,所以有一个很易得的贪心就是每次选择让能往上走最多的点往上走即可,这里我们只需要求对于一个点 \(x\) 现在的和为 \(s\)\(l\) 个能往上跳到最上面的点,这个直接二分即可,然后每次拿出这个最大值继承即可,然后没啦,这能 \(2400\)

CF623D Birthday

我是真不会概率,我们假设第 \(i\) 个人猜了 \(k\) 次能猜中至少一次的概率是 \(1-(1-p_i)^k\) 所以总的概率就是所有的这个值乘起来,因为要保证猜中所有人所以操作次数一定大于等于 \(n\),然后在之后的每一次我们一定都会拿出 \(\frac{1-(1-p_i)^{k+1}}{1-(1-p_i)^k}\) 最大的出来,所以直接把这个塞入大根堆里面然后拿最大的即可,这里因为答案允许误差所以跑到 \(300000\) 次左右即可。

P4647 [IOI 2007] sails 船帆

不难,首先我们考虑把 \(h_i\) 从小往大排序,然后我们可以发现对于每次放帆的操作一定会先放一段后缀然后把一段相同的值都加一,考虑如何找出这段后缀的位置,我们二分值 \(x\) 考虑求 \(>x\) 的最后一个位置到 \(h_i\) 是否足够,这里我们找到使得个数 \(\leq k_i\) 的最大值,然后把 \(g(res)\sim h_i\) 都加一然后再把 \(res+1\) 大的前 \(cnt\) 个都加一即可,这里我们发现在进行在进行操作之后每个位置的个数一定组成单调不升的序列,所以二分单调性显然。

P6189 [NOI Online #1 入门组] 跑步

想不到,如何想到根号分治,首先有一个 \(n^2\) 的背包,然后我们考虑根号分治我们找多重背包的方式做一个 \(val<B\) 的背包,时间复杂度 \(nB\) 然后对于大的我们发现最多选 \(\frac{n}{B}\) 个,然后考虑定义 \(g_{i,j}\) 表示选了 \(i\) 个大于 \(B\) 的和为 \(j\) 的方案数,考虑如何转移我们把求不下降子序列的方案数转化为往最后加入 \(B\) 和前缀加一,那么转移为 \(g_{i,j}=g_{i-1,j-B}+g_{i,j-i}\),这样是 \(\frac{n^2}{B}\) 的,\(B\)\(\sqrt{n}\) 最优。

P10656 [ROI 2017] 学习轨迹 (Day 2)

很难,考虑一个暴力做法我们对 \(b\) 中枚举 \(l\) 然后去拓展 \(r\) 发现每次我们能从 \(a\) 中拿的就是最大连续子段和,容易做到 \(n^2\log{n}\) 考虑一下如何优化,我们发现这个最大自子段和很难搞,然后如果我们 \(a\) 序列中有一个必选那么就很好维护了,因为 \(x\) 往右或者往左都是能选则必选,所以考虑有没有这样的数,经过观察我们可以发现两个序列的带权中位数一定有一个必选,如果都不选那不如和大的那个序列直接拿完,然后考虑一下如何做。我们假设 \(a_{mid}\) 必选另一种情况就是交换 \(a,b\) 然后我们定义 \(l_i,r_i\) 表示当前右端点已定左端点取 \(i\) 时(这个左右端点都是 \(b\) 中的)从 \(mid\) 往左和往右做多能拿多少个,然后对于扫描线我们新加入一个数 \(b_i\) 如果在 \(a\) 中出现在 \(k\) 那么对其分讨,如果 \(k>mid\)\(r_i\to \min(r_i,k)\) 否则 \(l_i\to \max(l_i,k)\) 但是我们还需要维护 \(\sum_{x=l_i}^{r_i} a_x\) 的值,这里我们通过观察发现 \(l_i\) 一定从右往左是不递减的,\(r_i\) 从右往左是不递增的那么我们每次就相当于一个区间推平同时再把和改一下就行了,这里可以用单调队列做到 \(n\log{n}\) 由于我不会单调队列所以我写的 \(n\log^2{n}\) 当然过不去,所以套了下数据/tx。

P5327 [ZJOI2019] 语言

这就是段大神吗,没见过这种 trick,我们首先将题目转化为求经过一个点的所有链的并集大小,考虑树上差分,我们对于一条路径 \(x\to y\)\(x,y\) 这将 \(x\to y\) 加一在 \(lca(x,y)\) 这将 \(x\to y\) 减一在 \(fa_{lca(x,y)}\) 位置也减一,然后考虑线段树合并,我们合并到一个点那么这个点的线段树中权值依旧为 \(0\) 的点则是没有的,所以考虑维护区间最小值和区间最小值的个数,然后对于 \(x\to y\) 这条路径的加直接树剖即可,时间复杂度 \(O(n\log^2{n})\),这里我写的标记永久化(据段大神说常数小)。

CF1610E AmShZ and G.O.A.T.

不难,首先平均数一定小于最大值且大于最小值,那么设这三个值分别为 \(a1<a2<a3\) 那么一定要满足 \(a1<\frac{a1+a2+a3}{3}<a2<a3\) 才不满足条件,然后我们对于一个序列判断它是否满足条件也只需要将这个序列的最小值设为 \(a1\) 然后 \(a2,a3\) 相邻的拿来判断即可,然后我们可以化一下柿子 \(a1+a2+a3<3\times a3\to a1+a3<2\times a_2\) 那么我们考虑一个 \(a1,a2\) 那么要找到的第一个满足的 \(a3\geq 2\times a_2-a_1\) 然后我们就又可以把 \(a2\) 更新为当前的 \(a3\) 继续进行此操作即可,每次值域会翻倍所以做多进行 \(\log{v}\) 次,所以我们对于每个 \(a1\) 暴力找即可。

P8147 [JRKSJ R4] Salieri

不算很难的黑题,看这里吧

posted @ 2025-09-15 21:39  highkj  阅读(9)  评论(0)    收藏  举报