深谈优化技巧

CF1442D sum

有一个结论:一定不存在两个数组都选了一部分,即只有一个数组只选了一部分,调整法可证

于是我们考虑枚举哪个数组只选了一部分,但现在有个瓶颈,即我们需要将前缀和后缀的背包合并,复杂度再次退化到nk^2

分治背包

由于在背包中插入一个数的复杂度为O(k)的,于是我们可以直接分治,将每个点的背包求出来,复杂度nklogn

P4027 [NOI2007] 货币兑换

不要被操作给迷惑了

考虑不直接兑换票,由于最优的一定是要不全换票要不全换钱,于是f[i]代表i天的最大钱数,转移枚举j,将j的钱转票再转钱,取max
将方程转换成i=i*j+j的模式,于是可以斜率优化

不过单调性全都没有保证,可用cdq分治来做
看成操作序列1:加点2:查询斜率k的切点

将操作序列二分,先求出左边的操作序列的答案,再求左边操作序列得到的凸壳对右边操作序列中询问操作的影响,最后求右边操作序列的答案。

整体二分

在修改操作对答案的影响相互独立,且具有可加性,答案具有可二分性时,可以对所有询问同时二分答案。

一个长度为n的操作序列,有两种操作
1.向集合中添加一个数
2.查询集合中的第k大数。

从整体二分的角度考虑,先假设一个答案C,然后按顺序执行操作序列,对于1操作,
如果添加的数小于等于C,计数器+1,否则不管它。对于2操作,如果计数器中的数
大于等于k,则说明答案小于C,否则说明答案大于C。然后再把操作序列根据C的
值分成两个部分S1和S2。重新二分答案,先计算[1,C]和它对应的操作序列,再保留
[1,C]中的影响,计算[C+1,MAX]和它对应的操作序列。

P3332 [ZJOI2013]K大数查询

整体二分板子

P1527 [国家集训队]矩阵乘法

整体二分,途中二维树状数组或者扫描线都可解决

~
线段树其实可以套任何东西,即对于一段区间的询问可以拆分成若干区间,再进行区间合并

CF1100F

给定一个长度为n的序列,每次查询[l,r]的最大异或和(选出若干个区间)

考虑线段树上的每个节点都建一个线性基,这样每次合并区间线性基(log^2)
复杂度nlog^3

发现合并两个线性基的复杂度为log^2,但插入一个线性基的复杂度为log

于是我们可以回滚莫队(?),好吧那个分治的思路我没听懂

upd on 2022.2.11 会了

我们可以分治,对一个分治区间[l,r]我们只考虑越过分治中点的答案,可以预处理出一个前缀和一个后缀的线性基,再暴力合并,复杂度(n log^2+q log^2),未曾设想的复杂度道路

P5024 保卫王国

动态dp,gugugu~

(什么都不会啊真的好菜,有人愿意来教我吗

P5290 春节十二响

有一个贪心策略,即每次把每两个子树的最优解的集合合并,用堆来实现,每次取出堆顶元素,两两合并

证明:如果一个子树中两个数在一个集合中但合并完之后不在,我们一定将小的那一个移动到大的那一个

我们类似启发式合并,将小的堆往大的堆合并,每次相当于删除了min(szx,szy),于是加上堆复杂度nlogn

对于贪心,完全可以假设一种状态,然后不断调整,也可以已知最优状态,大力拆开调整,证明所有后继状态一定不优

P3350 [ZJOI2016]旅行者

充分利用网格图跑最短路

考虑分治

每次将网格的长边一分为二,此时对于在分治中心两侧的询问,一定跨过中线,且不用分治下去,其他的可能跨过也可能没跨过,但是需要分治下去

于是考虑求出分界线上每个点到其他任何一个点的最短路

(甚至有些题还可以用线段树维护连通性)

复杂度玄学(?) , 证明是O(SSlog)

P4155 [SCOI2015]国旗计划

先左端点排序,由于题目特殊性质,则右端点升序
破环成链,即倍长,考虑强制一段区间后,我们需要沿着这个区间一直覆盖到倍长的一个前缀,于是我们可以倍增,我们预处理一个倍增数组,代表一个线段2^i后的线段覆盖到哪,然后倍增答案即可

P3309 [SDOI2014]向量集

P1712 [NOI2016] 区间

考虑将区间长度排序,则我们枚举一个区间,钦定他为区间最长,我们于是再枚举个区间最小,对这段区间的所有区间做一遍区间覆盖即可

由于这个具有单调性,还可以双指针来扫

类似于交集,环,连通,等东西都具有单调性

posted @   hs_wfz_orz  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示