OI中的常见套路
本质相同
Example1
对于所有满足以下条件的长度为
对于每一个数
首先注意到可以枚举每个数
对于一个没有限制的好的序列,设
这样,对于一个
再思考一下,似乎我们不用枚举它出现的次数,而是可以直接用
如果写出上面的式子的话,会发现最难处理的是一个形如
再进一步想,我们之所以合并麻烦,是因为取了两段上升区间.如果我们能求出一个上升区间和一个下降区间,在交点处合并呢?
但是这样怎么统计平方和呢?我们发现如果在
排列转环
Example1(P8416)
这题牛逼.
首先考虑一维的情况,一维情况下最劣应该是
为啥捏?因为注意到操作数
而我们显然可以通过两次操作把一个位置归位,最后剩一行再随便做做,这样的答案就是
这咋做呢?类似上面的做法,也考虑找环然后省一步,对于一行,我们找到所有应该放在这里的值以及它们所在的列,把它们应该在的列和实际在的列连边,一定能找到至少一个环(自环也算),删环就可以省一步操作.
Example2
给序列
-
修改操作:给定
,将 改为 . -
查询操作:给定
,查区间 内最长的子区间 ,使得对 ,有 ,且存在 使得 .需要输出满足条件的子区间的长度最大值.
一步一步来,首先处理出所有的极长的满足条件的段,不难发现修改一个点只会断掉一个段或者连接两个段,影响是
难点在于,我们如何处理要求其中存在一个
注意到
考虑由于是单点查询
现在对于区间查询,我们考虑特殊处理和端点相交的段,这个是平凡的.这样我们只需要处理出完全被区间包含的那些段该怎么做.把右端点缩一缩,就等价于左端点完全被区间包含的那些点.也就是以
规定转移顺序
Example1
给定一张
首先无根树转有根树计数,设
冷静一下,想到斯坦纳树,于是再设一个
这个故事告诉我们:对于图论计数问题(尤其是和树有关),
Example2(P7142)
类似宝藏那个题,我们考虑设
复杂度均摊
大概是如果多组询问那复杂度是错误的,但是如果我全局求,那我
Example1
给定一颗二叉树,求对于每一个
乍一看,二叉树,想到换根后做dsu on tree+set.但是
字典序相关
题目中询问满足条件的字典序第
Example1([2022noip十连测day8]8ady)
首先,我们肯定想如果知道
首先不难发现,我们可以这么还原:先开一个堆,然后先将前
大量实验证明:这种反向构造思路,你用个堆通常是做不动的.
我们考虑有没有别的做法.
一个一个数地考虑,
我们继续考虑
以此类推.不难注意到对于一个数
但是,这显然是个上界.这个区间能不能缩小一下呢?
对于一个
冷静一下,显然,
也就是说,我们将每个数能填的区间缩小为了
那是不是说每个数只要填在这个区间中,就一定合法呢?
我们考虑一个数
这样我们就可以简化为:给定
冷静一下,这个时候假设新序列长度为
所以前面一定是按顺序填,直到后面才会打乱顺序.而后面的长度大概也就是个
前缀和与差分
Example1(loj3266)
把点都扔到坐标系上,显然到一个点曼哈顿距离相等的数一定在一个正方形(对角线平行于坐标轴)上.
我们考虑如果已知两个点,怎么找第三个点的坐标,显然是两个正方形的边界的交点,那也就是说,曼哈顿距离下,一个等边三角形必定有两个点所在直线与坐标轴成
注意到有的点对可能会被算两遍,要特判.
Example2
小孔在玩卡牌游戏.众所周知,在卡牌游戏里,过牌是很关键的,所以目前小孔的牌库中,只可能有数字牌
数字牌
目前,牌库里有
接着,小孔会抽
请问,这一回合中若小孔使用最优策略,那么牌库里最少还剩多少牌.进一步地,有
每次询问是独立的,也就是说每次询问并不会以任何方式影响到之后的询问.
首先我们想一下我们需要知道什么:我们需要知道其在这一回合中打出的各种牌的数量是多少.而只要知道这一点,我们自然得到了答案是多少.注意到每次一定优先打出手头上最大的牌.
我们设
那我们一开始抽了
等一下,注意到我们好像没啥办法判断还有没有大小为
想出
首先,由于切牌这个环节会变化起点.所以有两种可能:要么是像倍增那样起点不定,要么是像差分一样其它起点的答案可以由原本的起点答案得到.那想到差分后呢?又注意到一定会先选较大的牌,所以大概率可以分层考虑:这样就先把问题转化为只有
二分答案
Example1([2022qbxt国庆Day6]kth)
考虑
注意到每个类别内部是很有序的,也就是说我们可以采取类似初赛归并排序的方法二分,找到前
调了一年,这个故事告诉我们,如果一个东西暴力调整能过/复杂度均摊,就不要写一些很丑的很难写的即使更快的东西去做.
Example2
给你一棵
有
从
每次询问走过的边直接从树上删除,一条边正反方向算同一条边,也就是说没法
这个过程会停机,你需要输出在哪个点停下来,询问之间独立.
这题最重要的思想在于:我们首先需要将这个问题改成一个判定性问题:判定性问题显然弱于找到答案.
怎么判定呢?对于一条路径,如果我们要沿着它走,那么我们就可以确定每个点的最小边(或者次小边),这等价于给出若干个边之间的大小关系,可以使用bitset维护一下,最后判定即可.我们发现判定数组是可以合并的,于是这玩意可以扔到线段树上维护.
会了判定这题就做完了,做树链剖分,然后开始从下往上跳重链,能跳到顶端就跳,不然二分跳到哪里,下去是同理的,只不过下去的二分需要多个
整体二分
通常解决在二分的情况下,单次check的复杂度比较高的问题.思想是把所有询问共同的check一起做.
整体二分的具体复杂度往往需要现场分析.
最常用的整体二分的写法是分治.但是有的问题(例如不能撤销)可能不太好写分治.
还有一种方式是,我们把所有询问一字排开,然后求出每个询问当前二分的
Example1([AGC002D]Stamp Rally)
直接整体二分,注意需要做可撤销并查集之类的东西.
分治
Example1(平面最近点对)
按照
Example2([CF1764G3] Doremy's Perfect DS Class (Hard Version))
有一个
第一反应就是令
那么如何优化呢?我们冷静一下,如果我们查询一个区间
那么
那怎么继续优化呢?我们还是令
-
左右两边未配对数量相差
,这个时候 和 一定都在较大的那边,直接递归. -
左右两边未配对数量相等,这个时候一定
在一边, 在另一边,我们可以通过一次查询 判断哪边是 .
于是只需要
但是还是不够,我们从哪里抠出那一次呢?发现最后处理区间
-
和 都在 中,我们显然只需要查询一步就可以知道哪边是 . -
只有
在 中,我们考虑利用一下前面的信息.注意到我们一定已经知道 的答案(如果区间为空或者区间为 显然我们也知道答案),假设这个区间中的两个数是 和 , ,那么 一定有一个和它配对的数字,我们考虑通过 和 就可以知道和 配对的数字在 还是在 .接下来只需要一步判断就可以找到 了.
Example3(XVII Open Cup named after E.V. Pankratiev. Grand Prix of Japan(opentraisn contest 1489)D Nice Set of Points)
给定一个点集
找一条分界线
Example4([CF1442D]Sum)
一个自然的想法是由于越靠后的可能越优秀,所以应该是要不断往后挖的.具体地,我们发现只可能有一个数组被选了一部分,剩下的数组要么不选,要么全选.
为什么呢?假设有两个数组各选了一部分,不妨假设它们最后选的数分别是
有了这个性质后,我们可以枚举是哪个数组只选了一部分,然后求出剩下部分的背包,背包部分可以求前缀和后缀最后合并起来,我们的复杂度就是
但这个复杂度还是不太够,如何优化呢?
注意到这里的背包是支持撤销操作的,我们考虑一个分治做法:每次做到
Example5(AGC044D)
这题在于分治后归并,考虑我们是可以快速判断一个串是否是原串的子序列的,就是判断它们的编辑距离是否恰好等于长度之差.而我们也可以快速判断每个字母在原串中出现了多少次,只需要询问
倍增
顺便一提,倍增比二分方便的一点在于:倍增能迅速确定答案的规模,这在复杂度与答案规模有关的时候至关重要.
Example1([SCOI2015]国旗计划)
先破环成链,然后设
Example2([PKUSC2018]星际穿越)
Example3(CF1523H Hopping Around the Array)
类似国旗计划,只不过需要用背包合并一维.
不过吧,这题有个问题在于最后的询问,我们要每次判断当前越界的点的代价是否小于等于dp数组的代价,如果小就回撤dp数组(因为无论如何都必不可能在这里选择).
Example4(loj3665)
思考一下发现,走相同的步数能到的点一定是一段区间,于是考虑使用倍增算法,设
但是初值怎么求呢?先考虑右端点怎么求.对于每个路线
Example5(CF1707E)
引理1:如果
引理2:如果
引理1显然,引理2是因为
于是,考虑
考虑求出每个单点的倍增数组,那么总区间的倍增数组也就是这些数组的最小值和最大值.
大概做一下.
Example6([22zr提高组十连测day6]百分号)
首先看上去多组询问给定起点终点看上去就很像倍增.
一个很自然的设计是
冷静一下,注意到我们好像还没有用到括号序列的性质:两个跳跃要么包含要么不交,不可能出现第三种情况.
所以,如果目前能跳到的最远的点为
同理,我们最后处理询问答案的时候,考虑从
对称/建立双射
Example1(CF1627F)
冷静一下考虑,分界线一定是一个中心对称图形,分成的两部分一定中心对称.那这条分界线一定过中心点.
我们考虑这么一点:如果所有点对都在矩阵一边,我们就可以直接求中心点到矩阵一边的最短路然后对称一下就好了.
而矩阵上遍布点对怎么办呢?我们在和每个点对对称的位置把这个点对复制一遍,然后从中心点找到一条到边界的最短路,把它对称一下即可.
Example2([AH2017/HNOI2017]抛硬币)
设
当
同样,当
于是只要求出
考虑
Example3([2022qbxt国庆Day4]C)
直接考虑对于每一对位置
设
-
如果
,那么一定贡献了逆序对,这里总共贡献为 ,一半的贡献也就是 . -
如果
,考虑前后两者形成双射.如果 在 和 之间,那么无论前者还是后者,都一定贡献逆序对;不然,则两种情况一定只有一种会贡献逆序对.前者多出的贡献应该是 ,也就是先选出 ,如果 ,那么剩余的可能性就是 ;不然,也就是说 ,类似于错排公式,剩余的可能性为 .另外,由于 ,所以上面的贡献也就是 . -
如果
互不相同,那我们交换 和 一定可以构造出另一组答案,并且这两组答案中一定只有一组贡献了逆序对,于是二者形成双射.
除去上面的部分的贡献是
Example4(ARC115D)
第一反应感觉完全不可做.
思考一下,如果我们随便选边肯定完蛋了:我们又不知道选出了几个奇度点,这不完蛋了?
先考虑要求全是偶度点怎么办?
由于点只有奇度点和偶度点两种,如果我能先随便选个边集,再把它删到全是偶度点好像就赢了.但是一方面我咋删啊,一方面这样删有可能删出重复的.又注意到删一条边就一定可以让两个点的奇偶性改变.
我们考虑求出原图的一棵生成树,然后剩下的边随便选.之后从生成树深度较大的点开始考虑:如果这个点是奇度点,我们就把它的父边删掉.容易发现这样是双射.而如果有奇度点的话可以先组合数选出来然后同样做上面的操作,容易发现是一样的.
不同的连通块可以分别做最后卷起来.
Example5(Hihocoder1230)
这题最重要的一点在于观察到一组
Example6(23省选10连测 day5B)
首先我们要知道,一轮冒泡排序的过程等价于:从前往后考虑每一个点,如果它前面存在一个比它大的点,就将它和前面的点交换.
于是我们考虑令
有了这个条件后,我们不妨设原序列是
拆多项式
通常适用于数据范围中有一项的范围不大的情况,然后拆成多项式后可以带入另一项较大的值.
Example1([22zr提高组十连测day5]可)
首先考虑数位dp,每次枚举当前的
然后想了好久发现这个东西好像优化不动了.
冷静一下,注意到问题在于枚举,我们不妨把枚举换成容斥试试.设
我们最后要求的答案也就是
看上去好像推不动了.
冷静一下,会发现
拆二项式系数的时候要注意特判上指标小于下指标的情况.
其中
这样我们就成功地分离出了一项
考虑枚举
这样我们需要枚举
抽屉原理
Example1([UNR #6]小火车)
首先考虑证明一定有解:
注意到我们可以先选择出两个不完全相同的集合,如果这两个集合的和相等,那么我们把只在第一个集合的
而由于
考虑对于一个权值区间
假设现在已知权值区间
Example2([NOI2021]量子通信)
考虑
考虑把在一块中是某个数的零一串全都集合到一起,然后暴力判断,复杂度约为
拆贡献
Example1([2022qbxt国庆Day7]fenwick)
注意到要变换多次,考虑每个值的贡献.
一个点要往后更新,不难通过平行求和法则一个值
Example2([QOJ5097] 小 P 爱学习)
这个题的厉害之处在于完全将贡献拆开.
我们不妨设最后将所有的数分成了
-
. -
.
第一个显然就是个背包,问题在于第二个的分子部分,我们用生成函数,设
这个东西可以做BSGS,也就是光速幂.这样就可以用
Example3(Luogu4211 [LNOI2014]LCA)
将
CF757G是一样的,只不过好像需要卡卡空间?
二进制拆位
Example1(Luogu5354 [Ynoi2017]由乃的OJ)
对每一位分开处理,对于线段树上每个区间,设
bitset优化暴力
Example1([2022qbxt国庆Day4]D)
先想一个很明显的优化:我们记录一下每个字符出现的位置,当我们判断当前字符串是否出现过的时候,我们直接从这个字符串开头的字符存在的位置进行判断.
如果我们记录下每个字符在母串中的某个位置是否存在,我们就可以基本脱离母串进行判断.注意到只需要用bitset优化这个过程就可以做到
Example2([NOI2020] 制作菜品)
这题首先要根据数据范围,注意到
具体怎么做呢?我们将原料按照质量排序,每次选最小的那个,不够的话就选最大的那个的一部分,重新排序后递归处理.
为啥这个是对的呢?根据鸽笼原理,最大的那个的质量一定大于等于
接下来我们就只需要做
那么这个怎么做呢?我们发现每道菜和两个原材料有关,于是不妨抽象成图论模型:将这两个原材料所代表的点用一条边连起来:我们发现有
接下来的问题在于01背包,用bitset优化一下.
简化能更新答案的集合
简单来说就是当你注意到一个答案只有可能由某些地方贡献,我们就只判断这些地方的贡献.有的时候不仅需要减小集合,还需要使这个集合尽可能好维护,这个时候可能会向集合里放一些不合法但不可能更新答案的选项.
Example1(CF1149D Abandoning Roads)
首先一个把只有
由于防止用
但是集合数量可能很多,怎么办?
注意到,如果这个集合只有一个点,那显然不可能重复经过;如果这个集合只有两个点,那重复经过意味着想用一条长度为
于是只有点数
Example2
给定
首先
注意到这题看上去就不太能多项式复杂度,我们考虑简化一下状态数.考虑做
我们现在有
于是我们可以枚举目前集合填成啥样了,这样状态数变成了
这样还是过不去,我们再冷静一下,显然我们只关心每个集合填了多少个数而不关心具体是哪个集合,于是我们把每个集合的大小排序后再压成状态,这样状态数就是
不过我们还需要保证一个集合里不能有相同的元素.这里我们考虑将相同的元素一起放并规定放的顺序.因为放进去的集合在放这种元素前是有大小顺序的,我们每次放进最大的集合中.换句话说,我们设
算一下复杂度是
Example3
给定一张有向图,多组询问,每次询问三个数
冷静一下,先加边,注意到如果加
做完这一步后,我们注意到可以在加边的过程中对于每个
Example4([Petrozavodsk Winter-2014. Moscow SU Tapir Contest(openstrain contest 1435) C]Combinations Strike Back)
给定一个大小为
自然的想法是上生成函数.
假设数字
插入一个数字
注意到答案与插入的数字本身无关,只和这个数字在原集合中出现了多少次有关.而原集合最多有
Example5([CF1621G]Weighted Increasing Subsequences)
一个自然的想法是拆出每个点
那么怎么继续优化呢?我们还是想拆出每个点的贡献,但是如何不枚举终点
注意到
Example6(CF919F A Game With Numbers)
最小表示法表示每个人的手牌.
不过要注意有可能成环.我们考虑用刷表法更新,最后刷不出来的点就是和.
Example7([IOI2014]holiday)
首先发现走的一定是一个区间,然后发现这个区间
Example8(CF1446D2)
我们假设目前得到的答案区间是
这个是怎么想到的呢?我们考虑一个区间如何拓展成更大的区间:如果每个数出现次数不降,显然是一个更大的区间.这同样是在说:如果我们能找到一段区间,使得加上这段区间后,原本不是区间众数的数成为了区间众数,并且区间仍然合法,那就一定更为优秀.再注意到如果一个数在全局出现次数多于区间众数,这一定可以实现,进而推出全局众数的结论.
你以为结束了?没有,我们下面给出一个
首先,我们假设全局众数是
我们发现这一段x一定是没有意义的:xyxyyxyxx[xxxx].
我们对于每一个
当然,这里得到的区间不一定是合法的(有可能
【luoguP4062 [Code+#1]Yazid 的新生舞会】也是这个标记的思路,标记的话用一下链表之类的大概能做.
支配对问题
lxl起的名字.
这里的思路其实大概就是:我们将一些很废物的二元组杀了,然后将剩下的二元组进行贡献答案.我们称这种一个二元组严格强于另一个二元组的限制称作支配关系.
第一类支配对
虽然总数很多,但是本质不同的很少.
Example1(luoguP7880 [Ynoi2006] rldcot)
我们这么考虑:如果现在有三个点
Example2(luoguP8528 [Ynoi2003] 铃原露露)
和Example1基本差不多.
第二类支配对
虽然总数很多,但是有用的很少.
Example1(CF765F)
典.
Example2(CodeChef MINXORSEG)
这个题比较厉害,仍然考虑
简单分类讨论一下,不难发现这意味着
Example3(Luogu9058 [Ynoi2004] rpmtdq)
这题更为逆天.
首先,这题有两个维度:树和序列,我们要先处理掉其中一维.lxl:树这一维度更加困难,因此我们应该是选择困难的那一维分治掉.
考虑边分治,然后就只需要处理两棵子树间的贡献.但是对于一棵子树内的点,我们要找到在另一棵子树中有可能和它产生贡献的点对,这个咋做呢?
牛逼的一步来了,我们考虑对于每个点,算出它到分治中心的距离
Example4(CF1635F Closest Pair)
首先,由于匹配无序,我们考虑对于一对数
不妨假设较大的为
如果现在有两个数
于是我们可以找到
这一步可以将
Example5([ICPC2017 WF]Money for nothing)
注意到抽象问题后等价于有若干个A点
怎么做这个问题呢?首先我们必须要发现的一点是:对于A点来说,如果有两个点
这个序列看上去就很亲切了,接下来简单证明一下是满足决策单调性的就可以判断答案了.
奇偶染色
Example1
一个
sol1:
注意到如果条件不成立,则一定存在若干条路径,蚂蚁在路径上转圈,也就是找到长度和尽可能大的路径不交地覆盖矩阵,注意到一定是使用
sol2:
考虑对奇偶染色,设
我们把黄格子和蓝格子称为彩格子,注意到如果一开始一只蚂蚁在白格子,一分钟后必定在彩格子.一开始一只蚂蚁在蓝格子,两分钟后必定在黄格子.
因为最多有
Example2(CF1521E)
首先考虑我们显然可以一行空一行放,也就是说如果最大的
类似lyz那个题,我们考虑删去行列编号均为偶数的点,这样就满足了一个子矩阵不能全放的限制.
然后呢?我们考虑将所有能放的位置排序.先把所有的位置分成三类:
好!冷静一下,咋想到的啊.
首先这种题肯定要找到一些看上去就很显然的边界,当你发现找不到的时候,大概率就一定有解了(大概率).
然后呢?注意到不合法一定是同种颜色放到了
所以大概是说,这种构造题要先想判断边界的条件,然后对着做.
Example3(CF1615F)
太牛逼了这个题.
首先,找边界条件:啥时候
然后:注意到每次操作是相邻的两个数,于是我们有:奇数位置的和-偶数位置的和是定值.但是:注意到这个操作是有限制的!它只能对相邻相同的位置做.
然后我也不知道咋想到的,可能是因为找到限制条件后只要不改变限制条件就可以随便转化?反正我们先把偶数位置全部取反,这样操作就变成了交换相邻数字(如果相邻数字不相同,取反后相同,交换无用).
就可以dp了.
Example4(CF1517G)
按照横纵坐标的奇偶性,分四种情况染色.注意到四边形接下来的路径一定会形如
捆绑更新答案
Example1([2022qbxt国庆Day6]binary)
首先因为有
冷静一下,二进制大概率是没啥通项公式的,还是要一点一点做.但是我们枚举每一个数实在是太慢了,我们考虑一个地方:
所以我们考虑:当遇到
Example2
给定一棵树和一个值域为
设
这么考虑:这题看上去就需要把任何一个数字
接下来的问题在于如何快速处理一个块的答案,考虑把所有的
牛逼的一步来了:考虑对于每个块内的
单独更新答案
Example1
一个数轴上有
考场的想法:按照洞分类,把被同样两个洞夹起来的球一起处理,显然会有一段区间往左走一段区间往右走,按照这种区间的长度排序,然后硬dp,复杂度
实际的做法:我们抛弃区间,单独考虑每个球.对于每个球而言,有用的信息只有它到左端点的距离和它到右端点的距离.我们把这两个距离缩为
如果存在两个点
zhq对这题的理解:
这可以等价成求一个上升子序列.上升子序列说的是如果
这个说法很有意思,但是要注意:类似说法成立当且仅当我们认为
Example2([Petrozavodsk Summer-2015. Moscow IPT Contest(openstrain contest 1464) J]Two Airlines)
这是一道交互题.给定一张
考虑将点逐个加入.假设现在的哈密顿回路的两种颜色分别是
不过这样用了
寻找不变量
Example1([NOIP2021] 方差)
首先我们注意到:设
接下来推一下式子:
令
推到这一步发现好像没啥用但是推了好久懒得删了
冷静一下,由于一开始的数列是单调递增的,所以改变后的数列一定也是单调递增的(差分数组均
这样我们设计
注意到
Example2([AGC030E] Less than 3)
注意到:当我们把一个位置取反的时候,这个位置相邻的左右两个位置一定有一个
然后枚举一下从边界多产生了多少个分界线就行.
组合意义
Example1(ARC110D)
注意到这相当于先把一个长度等于
于是自然是
Example2(ABC231G)
乍一看,感觉完全不可做.因为一开始给定
如果没有
那给定
Example3(AGC060D)
不妨设
用一下组合意义,注意到答案等于:
中间那个地方看上去是经典的计数容斥,我们对着它做容斥:
这个咋做呢?我们考虑用组合意义展开:
注意到
考虑
但我们很快发现了难点:
我们考虑一下这个东西的意义:其实也就是在
其中
写到这里应该就能发现,接下来必然要对
这里已经很显然了,我们大概要做一个不断加段的做法,那此时
令
考虑下面这个东西怎么求:
注意到,如果我们把每一段(
这题还有一个做法:tyy的变魔术做法.
还是容斥,考虑将
复杂度抵消
Example1(CF1439B)
首先注意到度数小于
首先如果剩下的点度数全都
欸等一下,这总复杂度
首先,删完点后的度数全都
好像还是过不去,这咋办?
冷静一下,如果
寻找关系式
Example1
一张有向图,边有两种颜色,从
(注意方差为平方的期望减去期望的平方.)
注意到难点在于权值归
然后就来到了降维打击的时间:我们可以使用数学归纳法证明,如果到一个点
如果要严谨一点的话,我们发现第一种颜色的边会影响常数项,第二种颜色的边会影响一次项,因此最后的答案一定是一次函数.
最后可以使用高斯消元直接求出每个点权值的
至于方差是同理的,你注意到平方的期望一定是一个二次函数.
特判边界
Example1(2022ICPC杭州E)
第一反应肯定是一点一点调整成
假设目前形如:
.
我们有:
.
直接合并就行.
.
假设
.
此时一定有
摩尔投票
Example1([CF643G]Choosing Ads)
将摩尔投票扩展一下.我们现在想求其中出现次数大于等于
寻找周期性
Example1([CF1463F]Max Correct Set)
自然的想法是
接下来比较牛逼的是,注意到如果
我们考虑
因此,只要我们找到了一个长度为
进一步地,我们一定能证明:原集合中的最优解是以一个长度为
这个是为啥呢?我们设
补集转化
Example1
给定一个
考虑正难则反,算不存在的概率(事实上也确实很好理解,因为存在性问题通常都要取补集),这时候我们发现:此时
那么这个怎么算呢?我们仍然考虑正难则反,如果
二进制分组
Example1(loj3273)
先考虑没有插入怎么做,注意到所有的线会扫出一个空白区域:这个空白区域由一条折线围成,而所有的点都在折线外或在折线上,更进一步地,在折线外的点没有动,就是初始位置.
这启发我们分开维护,每次扫线的时候更新折线,把该扔进来的扔进来,由于折线上的点
问题在于如何维护插入点.我们使用二进制分组,将所有点分为大小为
Example2(Luogu7447 [Ynoi2007] rgxsxrs)
一眼看上去和CF702F很像,但是区间操作感觉很艰难,怎么做呢?
我们对值域分块:分成
好,下面开始思想总结:
首先,我们发现这个区间和值域都很难处理,但是感觉值域更加重要,应该是对值域做均摊(也就是类似CF702F的打tag操作和暴力修改操作分开),于是考虑到对值域分块然后内部平衡树,然后发现可以做了吧.不太清楚,也有可能只是值域分块的套路.
Luogu9069是同款思路,判一下负数.
Example3(CF1515I Phoenix and Diamonds)
俗称带修T-shirt.
做法大概是这样的:我们考虑对于每次给出的
但是我们不一定能减去一个还在这个块里的数字,我们怎么做呢?
我们考虑最后的操作一定是减去若干个小于这个块的,最后有可能再减去一个这个块的,然后
[IOI2021]地牢游戏 类似,但是因为是在图上做,所以把二分要改成倍增.
评论