平邑一中集训作业
反悔贪心
扫描线
第一题
https://www.luogu.com.cn/problem/P6940
首先发现,从上往下扫行,然后对于每个右下角匹配一个列最近的左上角是最优秀的.所以拿set维护上述过程.
第二题
https://www.luogu.com.cn/problem/P3268
这题比较厉害,直接扫,然后维护每个圆当前与这条线的两个交点,注意到这些交点的顺序是固定的,于是可以拿set维护.
二分图HALL定理
第一题
https://www.luogu.com.cn/problem/AT_arc076_d
根据Hall定理,我们只要找到一个子集的人,使得人数与它们的区间的并所包含的椅子数量之差最大,这个最大值就是答案.而它们区间的并显然是同样类型的区间,也就是中间扣去一段.考虑枚举中间扣去的那一段是啥,就可以快速算答案.这玩意可以扫描线维护.
第二题
https://www.luogu.com.cn/problem/CF981F
一眼丁真,鉴定为二分+Hall定理.
这题真正的难点在于如何check.考虑我们现在有了若干个区间
第三题
https://www.luogu.com.cn/problem/P3488
比较简单,考虑如果最后找的若干个区间是分开的,那它们必然其中有一个区间自己就不合法.因此找到这个区间就行,然后每个位置减去
第四题
https://www.luogu.com.cn/problem/CF103E
这题比较厉害啊.首先猜到要用网络流.
然后注意到选的集合
然后集合连权值加上一个极大值
第五题
https://www.luogu.com.cn/problem/AT_arc106_e
首先答案显然不会超过
第六题
https://www.luogu.com.cn/problem/AT_agc037_d
考虑最后
再考虑
于是,
那么,如何证明一定有解呢?这是一张正则二分图,根据Hall定理推论,一定存在完美匹配.
第七题
https://www.luogu.com.cn/problem/AT_agc029_f
这题好牛啊.发现如果几个集合的并的点数过少,那么一定无解.因为怎么连都会连出环来.这直接将整个题的思路引向Hall定理.
考虑直接做二分图匹配.左边是点右边是集合,然后连边.
那么根据Hall定理一定存在
第八题
https://www.luogu.com.cn/problem/CF1519F
首先注意到,只要任意一个宝箱集合需要的钥匙集合的权值大于等于自己,那Bob就输了.这类似Hall定理.我们把钥匙和宝箱都拆点,然后判断拆点后的图是否存在完美匹配.求完美匹配可以使用状压.
轮廓线dp
这个板块好像没啥说的,因为思维难度远低于代码难度.而且思路都比较直接.
放一下我做的题.
第一题
https://www.luogu.com.cn/problem/P5056
第二题
https://www.luogu.com.cn/problem/P2289
第五题
https://www.luogu.com.cn/problem/P3886
第六题
https://www.luogu.com.cn/problem/P1933
广义串并联图
第一题
https://www.luogu.com.cn/problem/P6790
比较简单,首先这个图这么简单,那它大概率是个广义串并联图.感性理解一下,
然后简单做做.
第二题
https://www.luogu.com.cn/problem/P8426
ps:本题选入笔记:图论-广义串并联图/三度化-Example2.
广义串并联图的一个很重要的思想是:我们通过一些手段改变这个图的形态为一个好做的形态,但是答案又和原图相同.
在这个思想的指导下,我们考虑这个题能否进行三度化.不过注意起点和终点简单特判一下,别把他们给删了.这样我们最后如果得到了一个只有起点和终点的图,那就一定是no.
然后如果没有只得到起点和终点呢?对最短路图建DAG,考虑如果
如何保证
第三题
这题没啥好说的,小E的集训队论文讲的很清楚.简单来说就是用三度化求出一棵决策树,然后做动态dp.
动态规划第一期
第一题
https://www.luogu.com.cn/problem/CF1810G
ps:本题选入笔记:动态规划-动态规划的优化-反向操作-Example1.
其实这题有一个很自然的容斥做法,但我们先略过.
一般而言先考虑对于每个
最后在
但是这样是
考虑把这个dp反过来!我们设
我认真考虑过这个
原因是这类型dp比较特殊,我们要算的其实是一个类似DAG路径上的信息,因此边权无需改变.
回来简单提下容斥做法,其实是有一个自然的想法是只要这个序列中出现过前缀和为
第二题
https://www.luogu.com.cn/problem/AT_agc061_c
这题纯容斥,首先考虑找到一种统计答案序列而非操作序列的方式:一般而言会选择建立某种双射.考虑一个答案序列可以怎么被操作到:或者说,对于一个答案序列,判断它能否操作到.
注意到序列中第一个元素,肯定是选择左端点比较合理.因为这样它对后面的限制要少一些.那么其实双射方式就呼之欲出了:就是从左往右扫,能取左端点就取左端点.我们就可以对这个操作序列进行计数.
这个操作序列怎么计数呢?考虑这个序列满足啥条件:其实就是能选左边的就不会选右边的,那也就是不可能出现一个空的区间,这个区间没有任何数字.对着这个条件容斥即可.
第三题
https://www.luogu.com.cn/problem/AT_arc134_e
这题见过两次了.大概是按部就班一点一点去找条件.
至于考试怎么办,考试打表啊!
下面抄一下演算纸上的结论,注意这些判定条件的优先级从前往后:
-
如果序列全
,显然后手获胜. -
如果序列不是全
并且存在奇数,选择 ,先手获胜. -
如果序列全
,显然后手获胜. -
如果序列全是偶数并且不全是
的倍数,取 转化为(3),先手获胜. -
如果序列全是
的倍数,考虑取 ,如果序列中只有 或者只有 的数字,显然先手获胜.不然,如果同时存在,考虑先手取 ,序列中就会只剩下 .此时如果后手取一个奇数,显然会剩下奇数,根据(2)先手获胜;如果后手取一个偶数,讨论一下全部的偶数,都是先手获胜.
综上,除非所有的数字都是
如果所有的数字都是
第四题
https://www.luogu.com.cn/problem/AT_abc290_h
显然对于猫来说,它的
这个怎么优化呢?我们仔细思考,如果要放,是不是最好放的平均一点.因此引出一个结论:那就是一定存在一个分界点,使得左右猫的数量相同,狗的数量也相同.你可能会好奇
这个是怎么证明的呢?我们考虑对于猫来说,先找到能平分猫的分界点.然后考虑这个点左右两侧的狗的数量是否相同(这里先假设狗的数量是偶数,奇数是同理的,只是要多说几步).我们选择狗多的那一边,把这边最靠近分界线的那只狗恰好移过分界线.注意到这样一定更优秀.
那么上面的结论证明了啥呢?证明了整个序列一定可以分成两部分(左右两部分).这有什么用?这去掉了前两维.具体来讲,对于一部分,如果可以填某只猫或某只狗二者之一,一定选择权值较小的先填,这样的话这一对的贡献就会少一些.其实就是把权值转化为每个序列中每一对的贡献.于是这个结论就是对的,我们可以把猫狗放在一起排序来处理第一维.复杂度
测完样例发现一个问题啊,上面那个结论还真不能简单地拓展到奇数.因为会出现权值相等的情况.对于偶数来讲,权值相等是无所谓的.但是奇数不行.因此我们选择如果
但是,这题被爆标了.存在
注意到,
第五题
https://www.luogu.com.cn/problem/P9338
首先能划分就一定需要是一个合法括号序列.同时这意味着一定可以划分出
也就是说,我们其实只在乎这个序列最少能划分出多少,并且判断这个数字是否小于等于
考虑第一个
然后题解开始变魔术了.设
那么我们的交换操作实际上是啥呢?首先不可能交换两个相同的,那实际上就是给一个
但是这样会出现一个问题是,我们其实并不能选择任意一个
于是就有了一个
仔细观察上面的过程,不难发现答案关于
不妨设
其中
显然可以斜率优化,于是复杂度
第六题
考虑Hall定理,设最后的盒子是
-
. -
.
为啥是这个方向的Hall定理呢?因为我们肯定要对
然后就直接dp.把
但是实际上,考虑到
实现可以使用滚动数组.然后压位的话要压掉最后一维.
dp的话是下面这样的:
算的时候记得删掉过大的
看到这种dp可能第一反应是考虑能不能交换dp状态和dp值,但是这个哪一维状态也不是和状态是单调的.
至于构造方案,暴力用堆一个一个做.
组合数学
第一题
https://www.luogu.com.cn/problem/AT_jsc2019_qual_f
比较牛.首先千万要看清楚不是每个点的值在
然后考虑后者怎么做.注意到如果是第
因此接下来的关键在于把前后分开,假设
首先较大的那几个可以隔板法做,较小的那几个是个经典容斥:枚举有几个大于等于
写式子之前考虑上面那个
于是我们只考虑限制是
这个时候我还在想要把左右两边分开求答案然后卷起来,但是这样还是避免不了枚举一边的和.事实上,我们可以把二者放在一起做容斥.下面式子会给出一个显式的表达.另外就是,有一个很大的问题在于我们如何钦定
接下来写一下
乍一看不太能算,实际上注意到
第二题/第三题
https://www.luogu.com.cn/problem/CF1264D2
直接做的hard version.
首先我们发现,不妨我们最后取出来的串一定是个
于是我们考虑枚举分界点,对于每个分界点枚举答案.不妨设左侧有
不过这里有个问题啊,那就是
第四题
https://www.luogu.com.cn/problem/AT_arc146_e
由于相同值域相互间有限制,不妨考虑值域那一维扫一下.
进一步地,我们考虑维护若干个上升的直线,然后每次可以选择把两条直线并起来成为一个峰,或者凭空分裂出两条直线作为一个谷.维护直线数量并且从下往上扫就可以了.
但是你注意一个问题,我们是不能先分裂出两条直线,再把它俩合并起来的.考虑能不能设计一点自适应的东西.当前的直线数量一定是偶数,然后我们每隔一个判断是否要合并,或者直接在一半的空位置上判断是否要分裂就行.更具体地,我们设
但是我们仔细想一想,我们要维护若干条折线.这些折线是有左右端点的,我们需要做的就是要么加入一条折线,要么合并两条折线,这两个操作都会带来一个空位置.而一条不操作的折线会带来两个空位置.其实相当于每个操作减少了一个空位置.不过有一个问题啊,我们只能通过
但是但是但是,我们写一个
用范德蒙德卷积的时候一定要注意,这个东西是扩域后的二项式,因此一定要在意一下枚举量是否取遍整数,这里是发现如果
原本其实很怕这个转移,因为觉得很麻烦,但其实写出来就不麻烦了.甚至加两维也是好做的,我们不妨设后两维的和为
其中
没完没完,差点就寄了.如果左右端点没有确认,那么我们是可以在左边或者右边split的.令
这一步步是怎么加上去的呢?实际上是按照先merge,再slipt,再stop来做的.因为split一定要放在最后,防止split了一个stop的点或者split在了一个merge好了的区间中.
但是这个转移是
再有一个细节就是组合数怎么办,哦,
第五题
https://www.luogu.com.cn/problem/P6276
首先显然不会破坏环的形态.也就是说,你把所有置换环的长度求出来然后求lcm就是一个排列的阶.这直接启发我们对于每个质数分开求贡献.
更进一步地,我们发现只要排列中有
另外由于模数不确定,我们还要对着每个
第六题
https://www.luogu.com.cn/problem/AT_agc060_d
ps:本题选入笔记:常见套路-组合意义-Example3.
这题听了三遍,直接抄笔记.
不妨设
用一下组合意义,注意到答案等于:
中间那个地方看上去是经典的计数容斥,我们对着它做容斥:
这个咋做呢?我们考虑用组合意义展开:
注意到
考虑
但我们很快发现了难点:
我们考虑一下这个东西的意义:其实也就是在
其中
写到这里应该就能发现,接下来必然要对
这里已经很显然了,我们大概要做一个不断加段的做法,那此时
令
考虑下面这个东西怎么求:
注意到,如果我们把每一段(
这题还有一个做法:tyy的变魔术做法.
还是容斥,考虑将
第七题
https://www.luogu.com.cn/problem/CF1188E
首先发现肯定不可能所有颜色都点过,那么至少有一个颜色没点过.
然后呢?考虑操作序列和答案序列是否一一对应,事实上确实是这样,因为至少有一个颜色没点过,因此可以找到下降最多的那个颜色,这样就知道了总共操作过程.然后由每个颜色减少的次数,就可以知道每种颜色操作的次数.接下来就只需要对于每种操作次数判断是否能在全程非负的前提下做完.
一个显然的必要条件是,不妨设
注意到只需要满足第一个条件就行,因为后面的条件只需要把当前所有需要做的人排个序,挨个做.显然就一定会满足条件.根据Hall定理,从前往后判断每一时刻是不是能填满前面的每个人,并将它和
事实上啊,只要我们得知了前一个要求条件然后枚举
二项式反演
第一题
https://www.luogu.com.cn/problem/P1595
弱智题.
第二题
https://darkbzoj.cc/problem/4665
直接容斥,用dp出前
第三题
https://www.luogu.com.cn/problem/P4859
ps:本题选入笔记:容斥与反演-容斥-Example3.
首先可以用dp+双指针得到
我们接下来仍然考虑容斥,首先,我们需要找出全集
等一下,这个好像不好刻画?
我们先回归一下容斥的本质:考虑每个元素的贡献.注意到恰好
等一下,这也太麻烦了,就不能从集合的角度分析嘛?
冷静一下,如果我们要做容斥,我们必须考虑每个元素单独的贡献,但是在这个题中,每个元素并没有单独的贡献,而是整个集合需要满足性质才能贡献.也就是说,我们无法分析每个
换句话说,这个定义在集合上的函数并不满足可加性.
换句话说,我们要用容斥,就一定要刻画
再换句话说,大部分的所谓的容斥其实都和集合没啥关系,我们做容斥就是需要逐个考虑贡献,把它们贡献全都杀成
第四题
https://darkbzoj.cc/problem/2839
简单二项式反演.(埋下伏笔)
第五题
https://codeforces.com/gym/101933/problem/K
考虑如果用小于等于
一开始想直接拿
第六题
https://www.luogu.com.cn/problem/P6478
这个题面真你妈逆天.
发现我们要求恰好
至于
第七题
https://www.luogu.com.cn/problem/CF1228E
ps:本题选入笔记:容斥与反演-反演-二项式反演-Example3.
不妨设至多有
令
写到这里发现一个问题(其实是我发现问题后把上面原本写错的给改了),为啥
做子集反演:
把集合改成集合大小就可以发现问题所在:
换句话说,
啥?这和我平常接触的二项式反演不一样啊?不说别的,第四题(BZOJ2839)的式子是这样的:
冷静一下,二项式反演的公式肯定没错,那也就一定是下面这几句出现了问题:
这个问题其实非常显然,我们的
这样才是在不确定的那些行列中选择组合数,而不是在确定的那些行列中选.
但这样又有一个问题,就是这个题的特殊性,这个题要求
当然不一样,二项式反演讲究统一性,所有的定义必须遵循一个统一的原则,不然如果什么样子的函数都能反演,那一般的反演就不是一个需要解方程才能完成的东西了.
回到第四题,再看一遍这个式子:
这个定义式就非常良性,
回到这个题上,为什么我们最后把
再看看这个式子:
这个式子的右边在干这样一件事:那就是在已知
所以,实际上的
好麻烦啊,能不能避免这种需要进一步思考集合意义的问题呢?
考虑二项式反演的第二个形式:
不难发现这个式子无论怎么写,前后都一定是从已知集合中选东西.绝对不会出现上面的问题.
因此,我们重新写一下这个题的相关式子,考虑直接正难则反,设
最后答案就是
第八题
https://www.luogu.com.cn/problem/CF997C
和上一题差不多,不妨设
可以求出
我们求一下
注意到
看后面那一块:
再看后面那一块:
这样就做完了.
第九题
https://www.luogu.com.cn/problem/P4491
直接二项式反演:
令
注意到枚举量即
再设
ntt即可.
第十题/第十一题
https://www.luogu.com.cn/problem/P4931
ps:本题选入笔记:多项式与生成函数-生成函数-求微分方程
二项式反演:
注意到后者只与
加强版咋做?我们继续看看式子:
注意到
考虑
再看
这下简单了,答案是:
现在看
两边求导:
得到了一个线性递推形式,更进一步地:
技术总结一下:其实就是你想要得到一个递推式,然后注意到这玩意要写成微分方程的形式,所以开始往那边凑.
第十二题
https://www.luogu.com.cn/problem/P5339
简单题,不妨设当前这个序列中不同颜色的分别有
然后对最后那个东西做背包就行.
第十三题
https://www.luogu.com.cn/problem/P5400
字符串算法
第一题
https://www.luogu.com.cn/problem/P7114
调和级数加哈希,简单题,场切了.
第二题
https://www.luogu.com.cn/problem/P3526
注意到一个事实:如果这个字符串存在长度为
考虑从小周期开始向大周期确定,首先可以用KMP求出所有前缀的最大border,然后就可以得到整个字符串的所有border.换句话说,我们实际上是在一步一步确定整个字符串的若干前缀的最大border.
考虑border理论,设
如果
为什么这样一定是对的呢?我们考虑什么时候全
-
新增一个长度
的border, :考虑 的最后一段是一段全 ,也就必然意味着 的最后一段是全 ,这么不断推下去就可以说明整个序列都是全 ,此时放上 必定合法. -
新增一个长度
的border, :不妨设当前的 是最大的那个(最小的无意义,因为需要保证 ),此时最短周期必然是 .由于 也是周期并且二者之和 ,因此必然有 .把 按照 长度划分.如果 必有该串是全 串,不然考虑此时 , 是 的一段后缀.考虑此时的周期必然 ,首先不可能等于,如果大于的话可以平移一格.不妨假设周期比 少了 ,那么此时必定有 的前 个字符是 ,但是由于 后面第一个 也往前平移了 格,因此它的第 个字符必定是 ,这就保证了 必定合法.
第三题
https://www.luogu.com.cn/problem/P6623
考虑怎么维护所有点权值
考虑这个权值的变化其实比较有规律,因为是树上的距离的差.我们考虑把距离这个东西做树上差分,设
也就是说我们每次对这个桶中要找的元素很固定,用一下colorful tree的trick可以做到
然后然后,这题还有一个无脑做法是,我们倒着建01trie,这样
第四题
https://www.luogu.com.cn/problem/CF1535F
我一开始第一反应是对
我们来看我当时想的根号分治部分:首先枚举两个字符串然后判断是好做的.我们来看
冷静看一下上面的过程,你需要判断中间那一段
第五题
https://www.luogu.com.cn/problem/P3311
简单题,ACAM上做数位dp.
第六题
https://www.luogu.com.cn/problem/CF1437G
首先肯定可以fail树上树剖,这个做法一眼秒.
然后我看题解发现这个题也可以colorful tree.大概就是你先离线,然后维护时间维的答案,那么所有的修改操作就可以改成将时间在
但是,我们按照colorful tree的思路去搞,每次dfs到一个点的时候,把答案加入线段树,在返回的时候撤销.注意colorful tree其实不用撤销,因为它的信息满足可减性,这题不行.然后就实现了单
总结一下上面的这个东西是啥啊,就是说,你发现我们查询的内容是到根的一条链的最大值,这个还挺难做的,因为这条链不满足什么区间的性质,但是子树满足,因此想到了我们可以把操作改成对子树取
如果不满足可删除性,我们一般要想想它是不是满足可撤销性,显然是满足的.因此自然想到了colorful tree.
第七题
https://www.luogu.com.cn/problem/CF1483F
这题可能比较像lxl当时讲的那个支配对问题.我们考虑合法的
我本来以为这样就做完了,实际上没有,上面的过程出了什么问题呢?我们确实能删掉所有的
这个问题怎么解决呢?考虑这种事情会发生当且仅当
第八题
https://www.luogu.com.cn/problem/CF1110H
考虑一个暴力的想法是,这个
其中
考虑如何优化,注意到dp部分看上去挺优秀的,难搞的是ACAM的建树.我们不能把所有数字全扔进去.这种区间信息看上去就是如果走到当前,后面全填
如果说的再形象一点的话就是,我们插入的过程其实很废,对于一些特定的前缀
但是,如果你顺着这个思路想,你开始逐渐剥掉满十叉树,然后一点一点搞,你会做的巨他妈复杂.
我们完全没有必要只在满十叉树的时候才跳跃.换句话说,如果后面填
我们考虑既然这里填
这样整个题就是简单的了.
第九题
https://www.luogu.com.cn/problem/P4218
首先有一个
树上路径,想到点分治,我们考虑对于一个分治中心
以及为了不让
冷静一下,我们把
考虑将它的第
它的第
平衡一下复杂度,设
动态规划第二期
第一题
https://www.luogu.com.cn/problem/P9318
不合法的情况如此方便,因为两边直接独立了,因此直接考虑二项式反演,设
考虑设一个高为
这个生成函数形式其实没啥用,因为模数是
冷静一下不要魔怔,我们考虑别二项式反演,直接补集转化,这样就只需要知道最靠前的裂缝.换句话说,我们设
冷静一下,注意到
这个dp的复杂度为
第一个dp的复杂度是
第二题
https://www.luogu.com.cn/problem/CF1250D
最重要的观察在于,这题等价于保留最多的区间,使得若其中某两个区间有交,那么它们必定颜色相同,但是同时需要满足一些形如某个区间只能染某种颜色的限制条件.原因很简单,首先原题的意思自然是找到染色方式,使得满足与其有交的区间颜色必定和它相同.那么对于一个满足条件的区间,如果与它有交的区间不满足条件,我们把那个区间删了这个区间也不会不满足条件.于是合法的不会变成不合法,接下来需要说明不合法的不会变成合法.首先是原本已经确定了颜色的区间,这个限制好做.然后是如果一个区间没有确定颜色,那它不能被包括在多个确定了的区间.这等价于,我们对于与右端点相交的所有无色区间全部作为新的右端点来更新.这样后面选的时候就不会错误更新右端点了.
或者我们换一个更清晰的描述,我们现在想要得到一些极长的段,使得这些段两两不交,并且与这些段相交的区间都是一个颜色.那么被完全包含在这个段内的区间显然就是答案,我们要最大化这个.
然后上面形成若干限制条件,但是这个在下面的dp中是好处理的.不过有个细节是,如果有两个相邻的连续段(不一定紧邻)的颜色相同,那么我们上一个区间的后面拖着的无色区间是不必对此产生影响的.这怎么办呢?特判一下同色.
这样的dp就很好设计了,更具体地,设
设
对于
第三题
https://www.luogu.com.cn/problem/CF1158F
考虑如何判断一个串的密度,不妨设它密度为
由上面,我们可以发现一个状压dp,也就是设
质数感觉不太行啊,考虑考虑dp,上面的形式看上去就很好dp,设
不过吧这么转移有一个小问题,那就是我们的
但是还有一个方式,那就是从后往前dp,然后每次放这么一段,对dp取一个后缀和来转移.
总之,这个dp的复杂度是
第四题
https://www.luogu.com.cn/problem/CF1175G
显然设
第一反应是决策单调性,可惜没有.
不过后面那个形式很简单,我们暴力一点维护这个东西.用单调栈维护出当前哪些后缀的最大值相等,不妨记这个最大值为
对于每层
第五题
https://www.luogu.com.cn/problem/P9312
首先观察到我们可以限制手上的灯笼能照亮的海拔是一段区间,因为我们可以先选择不断扩张,而不是提前买,等到了需要用的时候再买就行.
一个自然的想法是
考虑如何优化,不妨假设当前新买的灯笼是第
-
.这种情况需要保证 能买的地方在 的控制区域里,并且需要满足 的区间和 的区间是相交的.这种情况上也就是需要 的下界小于等于 的上界.这个比较好处理,我们从大到小枚举 ,等 不合法的时候把它删了就是了. -
.和上面是类似的.
也就是说,我们现在唯一最需要搞定的就是怎么让
事实上有一种更简单的写法,不妨设
-
. -
. -
.
按照
注意到第三种转移没有意义,我们可以直接改写成:
-
. -
.
原因在于,我们其实只想要让
此刻对于(1)我们想知道的就是固定
第六题
https://www.luogu.com.cn/problem/P8294
毛估估的话就是设
来细细写一写转移:
首先,如果
如果
若
反之,那么要先把
注意到上述复杂度均为
这个式子已经给了我们启发了,剩下的类似.有时间再补这个题吧,太精神污染了.
数据结构
第一题
https://www.luogu.com.cn/problem/CF1648D
不妨设
不妨设
这个东西即使我们枚举
那么怎么处理这个东西呢?考虑如果当前选的这个区间不是最后一个区间,那我从后面的
于是吧,我们就有了下面这个转移:
然后怎么贡献答案呢?首先你不能往左走太多,至少不能超过最后选的那个区间.事实上我们发现最后一定只有一个区间的右端点超过了拐点.因为选择的所有区间一定没有包含关系,而右端点可以对拐点取
要统计所有
第二题
https://www.luogu.com.cn/problem/P9371
考虑如何判断
我们先扫值域,这样修改每个点的取值的总复杂度均摊.对于每一个权值
接下来在每个点记录以这个点的为结尾的所有后缀和(要求左端点小于等于
有个细节是我们需要保证这些后缀和的左端点小于等于
至于最大后缀和的合并是简单的.
写起来发现上面那个东西其实不太好搞啊,我们考虑改改描述,上面等价于将每个区间改成最小后缀和
冷静一下,注意到相邻两个位置的最大后缀和相差不超过
-
对于每个
以及它的一对后缀和,在线段树上找到最靠右的一个叶子使得这个区间在加上这对后缀和更改后包含 . -
在更改当前处理的值
的时候,将所有点的值恢复为前缀和. -
在更改当前处理的值
的时候,将某些点的值置为 ,将某些点的值置为 .
显然都好做.
第三题
https://www.luogu.com.cn/problem/P7220
ps:本题选入笔记:常见套路-二进制分组-Example1
先考虑没有插入怎么做,注意到所有的线会扫出一个空白区域:这个空白区域由一条折线围成,而所有的点都在折线外或在折线上,更进一步地,在折线外的点没有动,就是初始位置.
这启发我们分开维护,每次扫线的时候更新折线,把该扔进来的扔进来,由于折线上的点
问题在于如何维护插入点.考虑求出所有能影响到一个询问的区间,把它们扔到线段树上,然后就可以用线段树分治维护这个东西.具体来说,我们在线段树上dfs,每次遇到一个区间,把该搞得全部搞完,然后这个点的位置就留在这里了,在后面dfs到其它的区间后再改.
第四题
https://www.luogu.com.cn/problem/P9168
场上写了
接下来看怎么优化,首先第一反应肯定是线段树分治,这样我们只需要做加入和撤销,就不需要做删除了.撤销总是好做的.
那么只有加入怎么做呢?这个点能造成的影响无非是以下几种:
-
它被加入,没有别的点被删除.
-
它被加入,另一个点被删除.
-
它没有被加入.
注意到(1)发生当且仅当这个点到根的路径上没有节点是满节点,这个判一下就行.
然后考虑(2),(3),淘汰必然会发生,并且必定是在离插入点最近的那个满的祖先.
这样的话我们需要实现的就是两件事:
-
对于一个点,找到离他最近的满的祖先.
-
查询子树内部点的最小值.
-
支持在点上插入和删除.
这三个操作显然都可以用树剖维护.算上线段树分治,这样就是
不过吧,我们需要说明一件事情:那就是为啥选择子树内最小的那个点一定是优秀的.我们可以简单举个例子来反对这个直觉:如果有两个点权值相同,一个点是另一个点的祖先,那显然选择祖先会优秀一点,因为这个祖先对下面子树的限制要小一些.
我们可以这么干:我们在一开始那个暴力中这么规定:每次满员了之后,删掉权值最小的,权值相同的则按照编号删.对于一个子树
-
如果我们之前想删的那个点已经死了,那就完事了.
-
如果我们之前想删的那个点没死,注意到我们接下来插入的点一定排序比当时想删它的时候只大不小,那此时必然还要删掉它.
第五题
https://www.luogu.com.cn/problem/CF464E
之前做过,就是最短路.但是我们要实现高精度加法和高精度比较大小,注意到加上一个
第六题
https://www.luogu.com.cn/problem/CF1801E
简单题,考虑暴力显然是直接大力并查集,而并查集的操作其实是不多的:一次有用的并查集操作必定是会让连通块个数减少
不过发现这个过程只有区间加法和单点查询,可以使用树状数组.
然后就卡了一晚上常数.事实上这题存在二进制分组做法:我们发现我们要做的无非是将两段直上直下的序列,然后定义它们对应数字相等.我们可以将一个点到它的
第七题
https://www.luogu.com.cn/problem/CF702F
典典典.考虑维护人的平衡树,然后每次check一个衬衫.注意到它会把大于等于它的人给减去这个值.我们考虑将这个splay分裂开来,然后对大于等于它的那些点打个减法tag,再与小于它的那个分裂出去的树合并起来.但是splay无法支持快速合并两棵无大小关系的树(ye不能启发式合并,因为以后还要裂开),我们考虑当前衬衫的价格是
第八题
https://www.luogu.com.cn/problem/P6072
考虑对于每一条边,求出以这条边为界限,两边的最大值然后加起来,显然就是答案.
还有一点是,一条路径
现在相当于求出
对于
做到这里我们冷静一下看看
图论
第一题
https://www.luogu.com.cn/problem/P4768
典中典,求kruskal重构树,以及
第二题
https://www.luogu.com.cn/problem/CF1408G
首先你需要发现,一个点集内部的边全部小于它与外界相连的边,那么如果我们从小到大加边,那么必然有一个时刻是这个点集成为了一个和外界分离的团.因此,考虑从小到大加边,并考虑kruskal重构树的结构,我们就可以将这个过程展现在树上.并且这个过程等价于区间合并.因此我们的问题转化为了有若干区间,选取若干不交的区间覆盖全集的方案数,简单的.
第三题
https://www.luogu.com.cn/problem/P9167
我们设题面中的
那么一个点能作为关键点,当且仅当它在dfs树上的某些子树所组成的城市都被控制,这个可以通过
第四题
https://www.luogu.com.cn/problem/P9170
先看Bob,先把
不过其实没必要删
对于Alice,考虑以下几种情况:
-
,显然Alice选啥都没用. -
,此时Alice必然选那个和Bob有交的. -
,此时Alice可以选择其中一个.
这样的话,Alice就已经确定了一些东西,而不确定另一些东西.Alice必然是要让Bob能选的最小情况最大,我们考虑再讨论一下:
-
,此时连通块是一个基环树.那么除了环以外的点一定都选好了.如果是自环那么怎么选都行.反之,环上有两种选择方式(就是一个点会在哪条边上被选).考虑对于两种方式,Alice已经确定必选的数量分别是 ,而Alice现在还可以选的个数是 ,我们也就是要选取 ,最大化 ,显然取 ,注意如果 要对 取 ,对 取 . -
,此时连通块是一棵树,并且有一个点不会被选择.不妨设 表示 这个点不会被选的方案数,那Alice对于一条边的定向,会让这条边其中一侧的子树的 整体 .这个看上去极其熟悉.典中典套路是,考虑两条边选择使得 分别加了 ,如果 ,同时取反这两条边的选择,一定不劣.于是选择的边会让加 的点集两两有交.枚举交集中的一个点 ,则所有边的选择全部确定:每条边都选择深度较低的那个点.仔细考虑此时,Bob的最优选择是啥.如果Bob选择了一个点 ,那么 显然是 减去 到 的路径上Alice能选的数量加上Alice只有一种选择,并且在这里为反向选择的数量.我们要最大化这个东西,也就是最小化 到 的路径上Alice能选的数量,其实也就是最小化一棵树的深度,这个是方便dp的.
第五题
https://www.luogu.com.cn/problem/CF235D
这个形式看上去极其复杂,考虑简单化一下:我们考虑对当前图选一个分治中心,对答案的贡献是
如果原图是树,这等价于对于
考虑基环树怎么做:如果两个点
第六题
https://www.luogu.com.cn/problem/P4429
如果图不连通可以对于每个块分开考虑,下面只考虑图连通的情况:
显然,如果图不是二分图一定无解.
其次,我们注意到孤立点和一度点一定都可以删去,前者显然,后者是因为与它相邻的那个点的颜色如果确定,那它一定有一种和它选不一样的方法.这样当前所有点的度数
接下来,青鱼说得好,我们把很多比较能看出来有解的情况判掉,剩下的就是无解.
- 偶环一定有解.
如果偶环上的颜色全都一样,那直接二分图染色.不然,一定存在相邻的两个点
妈的,剩下的不会了,先咕着.
第七题
https://www.luogu.com.cn/problem/CF1672G
发现个事情:如果当前所有行和所有列的异或值都是
而由于最后的状态是全空,因此在变化过程中总有一个时刻使得每行每列异或值为
考虑异或的过程,如果
现在我们来讨论一下
-
均为偶数.只考虑第一行,从第二列开始,如果当前这一列和第一列不一样就把它操作掉.这样最后所有列的异或值都相同.如果最后是全 ,我们把第一行轮着点一遍,这样每一列都被点了 次,而行的奇偶性不变.也就是说,此时无论怎么填都是有解的.行再一样做 -
是奇数, 是偶数.此时必须要求所有列的异或值相同.每一行如何做可以(1)一样使得每一行异或值都是 .枚举所有列是 还是是 ,留一个?来调整,剩下的?随便选. -
都是奇数,此时要求所有行和所有列的奇偶性分别相同.枚举这四种奇偶性情况,然后将
看成连在横坐标和纵坐标之间的边.那也就相当于确定了每个点的度数,然后问有多少种选边方式.典中典.对于每个连通块,求出一棵生成树,然后剩下的边随便选,用生成树一路调整上去.注意这要求所有点的度数之和是偶数,也就是至少得是一张合法的图.
第八题
https://www.luogu.com.cn/problem/AT_arc117_f
考虑求出前缀和,此时要满足条件,不妨设全局和为
注意上面的限制条件限制住了
贪心地构造,考虑每次要求
但是你发现个事情,我们前面一直在保证
-
满足前一个条件的
满足单调性. -
越小,越有可能满足第二个条件.
先来说(2),这个比较显然.因为如果
再来看(1),如果一个
冷静总结一下这个题,其实就是我们首先要发现很多可二分的性质:
可二分.
这个是显然的,放更多显然不会更劣.但是我们要在这个基础上找到一种方法,使得如果当前二分的值合法,一定能构造出一组答案.我们发现如果没有
可二分.
这个是怎么发现的呢?因为我们发现我们勒令
线性代数
第一题
https://www.luogu.com.cn/problem/P1224
首先显然的一点是,我们把它搞成一个矩阵
想起来之前那个经典判断
先考虑
再考虑
考虑
那我们现在面临的问题就是如何去求出来
第二题
https://www.luogu.com.cn/problem/P6772
典中典,首先如果是边权的话有个经典dp:设
这是一个经典的
这个题不是边权,但是点权可以改成入边的边权,只不过起点需要特判.
还有一个问题是边权不是
至于美食节,一个想法是直接矩阵加速到那一天,然后把对应的点加上美食节的权值,继续做完每个美食节即可.但这样复杂度是
冷静一下,预处理出矩阵的二的次幂,这样就是
第三题
https://www.luogu.com.cn/problem/P6125
简单题,建ACAM,然后对于每个人求答案.枚举每个人,对于每个点,设
第四题
https://www.luogu.com.cn/problem/P3706
ps:本题选入笔记:概率与期望-概率生成函数-Example3.
把上面的东西给形式化一下,不妨设
-
. -
.
第一个式子的用处在于带入
把(2)化简一下,有:
带入
不难发现对于不同的
第五题
https://www.luogu.com.cn/problem/P3292
首先第一反应是树剖+线段树上合并线性基,轻松做到
但是过不太去!注意到
不过如果你做过CF1100F,那这题就是上个树.
第六题
https://www.luogu.com.cn/problem/P4151
典中典,注意到一个值异或两遍就会没掉.我们考虑随便求一条
至于这个东西的正确性,首先考虑
接下来的问题在于找简单环.我们直接dfs,就可以找到一部分环.但是其实是没有找到全部的环的.但是没关系,在dfs的过程中,dfs树不可能有横插边,也就是所有找到的的环不在树上的边一定是反走边.而没有找到的环可能是若干个反走边拼起来的.这必然意味着它可以由那些反走边所代表的环拼起来:原因比较简单,考虑从上往下遍历这个没找到的环,那么每条边一定被经过了两次:下去一次,上来一次.
第七题
https://www.luogu.com.cn/problem/P6178
板子题
第八题
https://www.luogu.com.cn/problem/P4455
板子题
第九题
https://www.luogu.com.cn/problem/P4336
简单题,无脑矩阵树定理+容斥.复杂度
第十题
https://www.luogu.com.cn/problem/P5807
板子题
第十一题
https://www.luogu.com.cn/problem/CF917D
一眼二项式反演.不妨设
对于
看了看题解发现可以做到
计算几何
第一题
https://www.luogu.com.cn/problem/P2742
板子题.
第二题
https://www.luogu.com.cn/problem/P3829
简单题,注意到圆弧之和一定是一个圆,因此把角上的四个点拿出来做凸包即可.
第三题
https://www.luogu.com.cn/problem/P4196
板子题.
第四题
https://www.luogu.com.cn/problem/P3256
板子题.甚至
第五题/第六题/第七题
https://www.luogu.com.cn/problem/P1742
https://www.luogu.com.cn/problem/P2533
https://www.luogu.com.cn/problem/P4288
三个题全是一样的.
大概是这么做的啊,就是说我们增量构造,每次对于前
这个写法导致了复杂度正确.具体来说,考虑一个点成为卡着圆边界的点的概率是
显然
第九题
https://www.luogu.com.cn/problem/P2287
枚举三个点,然后判断这三个点所在平面是否是三维凸包的一个面.注意四点共面就完蛋了,因此每个点加上一个随机扰动量.这个量首先得在eps范围内显著体现出来,其次还不能对答案影响太大.这个题是直接给了一个小于
第十题
https://www.luogu.com.cn/problem/P1452
板子题.
第十一题
https://www.luogu.com.cn/problem/P6247
板子题.
第十二题
https://www.luogu.com.cn/problem/P3187
旋转卡壳的时候维护三个边界就行.
网络流建图
第一题
https://www.luogu.com.cn/problem/CF103E
Hall引理的时候做过.
第二题
https://www.luogu.com.cn/problem/CF311E
发现变
接下来考虑把若干个
第三题
https://www.luogu.com.cn/problem/CF884F
直接费用流,考虑左边每个点是字母,然后连到右边的点上,拆一下点保证对应的位置不会有相同字母.
第四题
https://www.luogu.com.cn/problem/CF802C
牛逼题,考虑我们不好搞这个丢弃的东西,因为你也不知道你留下来的是谁.因此我们考虑如果一本书不在当天丢弃,那就一定会对下本书产生贡献,我们把它当成将书卖出.
也就是说,考虑将每一天建点,上面这个过程保证了我们每一天的书都会买,这就保证了最大流量.
将每一天建点并以流量为
但是这样需要保证,我们卖书的时候必定在前面没有丢弃这本书,拆点维护,用一个点同时维护当天丢弃和卖书两种操作即可.
点数是
第五题
https://www.luogu.com.cn/problem/CF786E
一眼最小割,然后线段树+树剖优化建图.注意这样是
考虑点数,原图有
考虑边数,注意到一个点会连
第六题
https://www.luogu.com.cn/problem/CF1139E
第一反应是二分答案,然后拿网络流二分图匹配check,这样复杂度是
事实上注意删人后答案只减不增,因此复杂度
但是这样过不去,考虑把删除改成增加,这样就可以在残留网络上跑,然后就能过了.
第七题
https://www.luogu.com.cn/problem/CF1061E
考虑每个问题,其实是形如要保证子树内有一定数量的点不能选.也就是这个限制要和修建港口抢城市.
但是不同的限制可能限制了同一城市,我们发现深度更浅的那个限制数量可以减去深度较深的限制数量,毕竟较深的满足较浅的也就满足了.
但是这个思路建图好像有点不太对.因为两个树的港口是通用的,那考虑让一个限制是入,另一个限制是出.换句话说,让一个限制被源点流,另一个限制流向汇点,中间是树节点,源点连出去的边有一个权值,跑费用流.
注意到每个点只会被连一次,因此边数大概是
总之这种网络流题,主要还是要考虑谁连着源点,谁连着汇点.这个题我一开始以为是限制连源点,然后城市连汇点,发现做不了,那就两种限制分别连源点和汇点.
交互题练习
第一题
https://www.luogu.com.cn/problem/P5875
这是广义串并联图嘛?好像显然不是.
但是仍然有性质,如果没有点权的话,注意到(1)一定会选新加入的点,(3)也一定会选新加入的点,(2)则一定要么两者都选要么都不选.
现在有点权,考虑把新加入的点删了,不妨设新加入的点为
-
. -
. -
.
不难发现每一步操作做完后,答案都不会改变.
第二题
https://www.luogu.com.cn/problem/P3641
牛逼题.
考虑答案最小是什么,根据鸽笼原理,显然是
所以我们按照值域每
第三题
https://www.luogu.com.cn/problem/P3777
Sub1
minValue是好求的,我们考虑选取
Sub2
一个显然的想法是,如果我们一开始全选
然后呢?我们接下来考虑继续在
Sub3
考虑结合sub1和sub2,我们不妨询问
事实上也确实.考虑前两个数字中较小的那一个,设为
二分这个
然后有个牛逼做法是,考虑每个
Sub4
这个简单,不难发现只需要在
Sub5
一种想法是sub4+sub3,但过不去.
冷静思考,注意到sub2,我们其实是知道了某些位置在哪个权值区间的.对着这个分治下去,这样实现了划分区间的功能,按理说应该是会有
冷静一下,
现在唯一的问题是,我们怎么找到一个
实际的写法选择了直接枚举
第四题
https://www.luogu.com.cn/problem/P4373
这怎么做!考虑分块.(这谁想得到啊)
不妨设
然后考虑剩下的
第五题
https://www.luogu.com.cn/problem/P5473
考虑异或能实现的是判断奇偶性,具体来说,我们很容易判断一个点到一个集合内部点的奇偶性.考虑这样其实已经能
这个过程能不能二分呢?好像不能,那我们随机化.
换句话说,我们random_shuffle一下序列,然后分治,每次把左侧的点全部点亮,然后看右侧的点有没有发生变化.如果发生了,则说明左侧的点到右侧的点的边的数量是奇数,递归下去处理,就可以至少连一条边,把这条边删了继续做.
然后发现这么写有个
第六题
https://www.luogu.com.cn/problem/P6541
考虑动态点分树.每次找到一对点
反之,考虑得到了
至于动态点分树怎么做,替罪羊重构即可.
至于链,我们每次随机一个没有搞定的点,走过去即可.期望的错误次数是
模拟退火
第一题
https://www.luogu.com.cn/problem/P2503
考虑如果要求有序划分,可以直接写一个dp.
因此我们考虑每次交换几个位置,然后当成有序的跑dp,用这个来模拟退火.
第二题
https://www.luogu.com.cn/problem/P2538
随机交换两个城市的状态即可.如果为了复杂度更好一点可以要求交换的城市状态必然不同.
第三题
https://www.luogu.com.cn/problem/P5544
这题退火退半天退不出来,但是爬山直接过了.
这是为啥呢?原因在于,这题我们既然要对坐标进行跳跃,很有可能大部分坐标的答案都是
而爬山不会有这种问题.
有没有什么改良的方式?一种是改变估价函数,通过精细实现估价函数导致其估价为连续实数函数,这样退火的效果就会好很多.
总的来说,退火失败的地方在于它一开始跳跃得太远了.而由于前几次操作我们跳出去的概率很大,因此极难得到答案.对于这种跳跃性不确定的题,反而你发现爬山不会拘束于局部最优解,而是会跳出去的.这也就是爬山在这题表现极其良好的原因.
有没有什么更优秀的方式呢?我们考虑先爬几次山,爬到一个好地方,然后以这个位置开始退火往旁边跳.
第五题
https://www.luogu.com.cn/problem/P7218
考虑一个显然的贪心是,直接枚举每个
考虑把一开始所有能放的
第六题
https://www.luogu.com.cn/problem/CF1105E
不妨考虑满足某个人要求,就一定要在一段时间内全是它的id.也就是说如果两个人都抢了一段时间,那这两个人不能同时选择.
这也就是一个最大团问题,模拟退火解决一下.
评论