- 博客(59)
- 收藏
- 关注
原创 25杭电春季第三场
lucas定理,按位贪心给一堆组合数,每个组合数n是固定的,k在0Li范围内,要他们乘起来模2余1,问有多少种方案,乘起来余数是1,也就是每一个余数都是1。组合数模2余1,根据lucas定理的推论,Cnk%21等价于nkk。具体分析一下,如果n在某一位是1k在这一位也必须是1,如果n在某一位为0,k在这一位随意。总的方案数就是每一个组合数的方案数乘起来,所以关键是求给定nk在0Li内,有多少个k满足nkk。
2025-03-26 10:53:29
1016
原创 CF1011(Div2)
字典序贪心给一个字符串,每次操作可以选两个字符交换位置,最多k次,操作结束后翻转,能不能比原本字符串字典序更大?字典序先看高位,因此我们只要能把原始串的最后一个,变成比原始串第一个更大就可以。那么只要操作次数大于0,并且字符串包含的字符种类大于1就可以。
2025-03-24 17:01:28
730
原创 25杭电春季第二场
给出干支纪年法,确定是哪一年?只要求一个周期里的年份,也就是60年内,直接打表先确定每个干支纪年法对应的年份,然后查表1003计数,问子序列(p,0,p,q)(p,0,p,q)(p,0,p,q)出现多少次?qqq只出现一次,可以枚举qqq,那么对于每个qqq,对答案的贡献就是他左侧(p,0,p)(p,0,p)(p,0,p)的个数。(p,0,p)(p,0,p)(p,0,p)可以先预处理,具体来说检查一个ppp能不能构成(p,0,p)(p,0,p)(p,0,p)可以检查它左侧是否存在另一个ppp,并且中间有
2025-03-24 13:48:24
927
原创 最小斯坦纳树
子集的转移枚举子集即可,另一转移类似求最短路的松弛操作,所以我们可以对于当前点集的dp数组,真的跑一次最短路,把此时。转移可以是我们考虑当前点集是由哪两个子集拼起来的,这是个子集枚举,也可以增加一条边,但点集不变,故有两个转移。由于无根树,不同根的答案可能不同,考虑换根。首先这肯定是个树,树肯定是联通了,且边权和最小。考虑反证法,如果不是树,删掉一个边,边权和肯定变小。给一个图,边权为正,给一个点集,求一个子图,包含集合中所有点,联通,且边权和最小。里不为初始值的点都放入初始队列。
2025-03-12 08:57:03
279
原创 CRT+LUCAS+EX欧拉 古代猪文
不是质数了,但它可以分解成几个质数的一次方,这种取模一般就考虑先分别求出对每个质因子的余数,然后用中国剩余定理,就能求出来对原模数的余数。,也就是求出来指数对于每个质因子的余数,注意到质因子不大,并且指数是个组合数求和,考虑。指数取模,想到欧拉定理,注意到模数是个比底数大的质数,那么。需要注意的是,求一个质因子的余数时,的模数都是固定的,只用预处理一次。那么下一步的问题是怎么求出来。
2025-03-04 12:04:10
498
原创 单调栈求凸包 Andrew算法
具体实现上,保存的都是满足条件的点,每次把栈顶的不满足要求的点删掉,直到合法,这其实是类似单调栈的方式。注意到在上半凸包和下半凸包里,边斜率的变化都是单调的,所以我们也就是要维护一个斜率的单调栈。那么利用这个性质,我们可以在每次加入一个点的时候,看他和凸包里前两个点构成的向量,是不是左拐,如果是右拐,就把凸包里前一个点删掉,然后继续判断,直到是左拐,或凸包中点不足两个。他有一个性质是,凸包肯定是所有包住所有点的多边形中周长最小的,因此还可以有一种定义是:包住所有点的,周长最小的多边形。
2025-03-04 11:31:54
472
原创 点分治模板
点分治的关键是:经过的根节点的我们可以树形dp求一下,一般就是dp求一下到根节点的距离为x的点数,然后处理一下。那么应该选重心作为子树的根,这样每个子树的大小都不会超过原树的一半,也就是子树大小会以折半的方式减小,这类似二分的思想,最多递归。所以我们可以处理完一个根节点的情况后,对各个子树再找一个点为根节点,继续处理。点分治一般用来处理树上路径问题,其实思想并不难理解,树型dp做多应该或多或少接触过:我们问树上某种路径的条数,那我们可以确定一个根节点,然后把所有路径分为经过这个根节点的,和不经过的。
2025-03-01 14:33:25
1139
原创 线段树分治
个区间,然后保存在这些区间的节点里,然后我们直接遍历整颗线段树,到达一个节点,就执行这个节点里的操作,递归返回时再撤销这个结点的操作。这个区间也能转化为时间轴,具体表现就是可以给出一个插入和删除边的顺序,这就相当于一个边的存在时间是时间轴上的一个区间,然后我们可能是要求每次插入后的答案,那我们可以在时间轴上建树,最后递归到叶子节点,就是某个时刻的答案。线段树分治是说,我有很多个区间的信息,我最后想知道每个点的一些信息,那我可以用线段树划分区间的思路,把一个作用于。
2025-02-27 22:37:53
271
原创 可撤销并查集
然后撤销到哪一步,需要我们制定,这可以在执行前,记录栈大小,那么撤销时再次撤销到这个深度就行了是,所以撤销函数需要传一个参数,表示要撤销到的栈大小。可撤销的思路就是,我们用一个栈记录每次的合并操作,被合并的那个根节点。,就可以执行撤销操作,撤销这次合并了,这里。,那么执行这个操作之前,,然后我们每次合并都是。
2025-02-27 22:18:52
745
原创 拓展域并查集/种类并查集
然后这题想要出现的矛盾矛盾尽可能小,那么可以把关系按权值降序排序,先处理权值大的关系,第一次出现矛盾时,这时的权值就是我们能得到的最小权值了。给出一堆在一起不能在一起的人,每一对不能在一起的,如果在一起了就会打架,有一个矛盾权值,所有人分成两个集合,让最后出现的矛盾的权值的最大值尽可能小。每次给出一个关系,不是两个人在一个集合,而是两个人不能在一个集合,判断是否有矛盾,这用一般的并查集显然没法做。在一个集合,就说明出现矛盾了,把不能在一起的两个人放到一个集合了。连起来的,然后每来一个关系。
2025-02-27 22:13:03
858
原创 lucas定理
可以看到Lucas也要预处理组合数,这里需要注意的是,由于p不大,可能出现阶乘的值是p的倍数,然后求逆元可能就会失败,所以我们不用求。第一项可以继续用lucas递归处理,第二项的系数都是模p之后的,所以我们预处理组合数,可以只用求出来不超过p的,预处理复杂度变成。求组合数模某个数的余数。注意一般的阶乘预处理组合数,虽然也能取模,如果出现的组合数。然后lucas本身的复杂度,由于一直在除。甚至更大时显然快了很多,这就是lucas的优点。这时就需要lucas定理了,内容是这样,的,如果我们的组合数很大就完了。
2025-02-27 21:56:34
852
原创 线段树优化建图
怎么办呢,边数太多的时候一种思路就是设置一个中继点,中继点会和区间所有点连上,然后我们想连这个区间所有点,只要和这个中继点连上就行了。需要注意的是,区间连边分为两种,点向区间连,区间向点连,这两种情况的图的边是相反的,为了处理这两种操作,我们需要建两颗线段树。这是可能会想,如果中继点可以反复利用就好了,我们巧妙的选取一些中继点,让所有区间,都可以拆分成个数不会太多的中继点,就好了。内的所有点连边,或是一个区间往一个点连边,如果暴力把区间里每个点都连边,边数爆炸了,建图都建不完。,我们就向线段树上对应。
2025-02-18 18:32:22
639
原创 Firefly Cup 1
等于中间的那个数(数组长度为奇数时),或在中间两个数之间(长度为偶数),往两边走都会变大,所以我们可以三分这个和函数的值,或者二分这个和函数的斜率,都能找到这个函数来到最小值的边界位置,这个位置一定就是中间数,也就是数组中的一个元素。有了这些,我们求一个数组里有多少个子数组是合法括号,就把所有元素扫一遍就好了,扫的同时统计当前层左右括号的个数,对于每个括号,可以当前层,相反括号组成合法括号子数组,这就是它对答案的贡献。计数问题,可以正难则反一下,总的字符串,不考虑重复,个数显然是。问最后每个点的颜色。
2025-02-18 12:45:05
1155
原创 Baozii Camp 2
检查大于0的子数组个数,由于可能有负数,不能滑窗了,考虑前缀和+线段树或者平衡树,当前前缀和是。的前缀和个数就行,这个值域线段树,或者能查小于等于某个值的元素和的平衡树都可以,其实就是在求减完之后的数组的前缀和的顺序对,也就是。,我们要把它移动尽量少的距离,到另一位置,那能移动的最近位置就是从低往高位第一个0的位置。既然要求1的位数相同,还要绝对值之差尽量小,那就把最低的能移动的1,移动尽量少的距离。需要注意的是我们这样没考虑长度为1的集合,这些集合显然就是所有后缀,他们的长度和就是。
2025-02-18 11:06:15
776
原创 ABC391 F 堆求第k大
那么我们可以每次取出最大的,然后把比它小的里面最大的三个加入堆中,取k次,最后一次取出来的就是第k大。第k大可以二分,也可以直接用堆,后者比较无脑,但是只能用在。,但是给一个元素,能快速找到比他大/小的几个元素,并且。可能被多次加入,我们要保证他只会被加入一次,可以用一个。次,实际上被加入的三元组也不会太多的,最多。记录三元组是否被加入过,这里虽然。不打大,就可以用堆模拟,找到第。比它小的元素里最大的三个一定是。,这里假设对元素降序排序。不大的情况,一般二分不好。比如本题,给三个数组。
2025-02-17 11:52:05
498
原创 ABC392 G FFT求卷积模板
的总数,显然这个条件可以转化为。数组自卷积,得到结果后,枚举。首先卷积就是如下的定义。数组,然后做卷积,那么。比如如果我们用卷积来做。的贡献,那么我们可以把。数组,然后卷积,最后第。有贡献,这就可以卷积了。,因此方案数还要除二。
2025-02-17 11:06:29
656
原创 dsu on tree/树上启发式合并
的,没有优化的空间,但是动态开点线段树不一样,可能某个位置的左儿子,在两个线段树里不一定都存在,那我们就选存在的那个线段树的左儿子作为左儿子就行了,这个分支不用进入了,只有这个儿子两棵树都有才需要继续往下递归。具体操作的时候,关键是,如果父亲比儿子大,把儿子移动到父亲里,如果儿子比父亲大,就把父亲移动到儿子里,然后交换父亲和儿子的集合的指针,交换指针是。自带的,只能对每个位都升序或者都降序,那么我们可以把颜色取相反数,这样对个数降序,对颜色相反数降序,就是对个数降序,对颜色升序了。记录每种颜色的个数,
2025-02-17 10:48:36
772
原创 虚树模板题
虚树是这样一种思想,很多时候一棵树里只有一些点是我们会用到的,如果我们只对这些点进行操作,复杂度可以接受,但是还有很多对答案完全没影响的点,如果把他们也加进来复杂度就太高了,所以一个很自然的想法是,如果把对答案有影响的点称为关键点,我们能不能建一颗只含关键点的树,然后在这个树上计算答案?这里还有个麻烦的地方是,虚树上两点间的边,可能是原始数上很多条边,我们断开虚树上的边,实际上是在原始树上多条边中选一条断开,那显然应该选边权最小的那个,那么我们建树的时候,每次把。为根的子树内所有集合中的点,都到不了。
2025-02-17 10:07:37
691
原创 树链剖分模板+一个练习
如果是一个序列,我们想区间加区间查,直接线段树就好了,但如果是一个树,我们想把两个点之间的路径加一个值,最后查任意两点中间的节点权值和,就没那么简单了,如果是静态的操作,我们还可以用差分,最后还原一次,但如果是动态查询就不行了。具体办法就是我们先进行一个dfs,优先进入重儿子,也就是子树最大的分支,这样我们能得到一堆链,每个链由于是dfs,dfn序都是连续的,也就形成了一个连续区间,我们可以把这些连续区间映射到数轴上,然后就能用线段树操作这些区间了。我们每次都划分重链,因此一条路径上的链不会太多,最多是。
2025-02-17 09:18:08
656
原创 后缀数组(SA)+height数组的应用
那么就是找每个值是多少个子数组的最小值,显然单调栈,然后和所有子数组最小值的和不同的是,这里是所有子集的最小值的和,因此确定一个位置的两层第一个更小。最后和统计子数组最小值的和一样,由于数组可能有重复元素,如果统计两侧小于当前值的第一个位置会有重复,因此应该一侧统计第一个。首先幂集是个很恐怖的东西,增长很快,我们不可能真的去枚举,显然考虑贡献法,即一个长度,是多少个集合的的。这里需要注意的是,第一我们这样没有考虑所有只含一个后缀的集合,这些集合的。,两侧的元素都可以取任意多个,因此两侧的贡献都是集合个数。
2025-02-16 23:15:11
559
原创 扫描线/矩形面积并
比如我们如果要求一个不规则形状的二维图像的面积,我们可以对x轴维度排序,然后y轴在任意时刻都只是一维上的一堆线段而已,我们控制这些线段沿x轴方向移动,记录扫过的面积,就是图形面积了。然而理解了这个思想还不足以解决矩形面积并这个问题,因为我们剩下的那个维度是要用数据结构解决的,具体来说,我们要解决这样一个问题:每次对一个区间进行加减,问整个区间里不为0的位置的个数?个区间,我们每次对一个线段的范围内进行加减,实际上只是对这些区间的组合进行修改,并不会出现一个区间被修改一半的情况。
2025-02-16 22:49:59
801
原创 可持久化线段树/主席树
具体来说,可持久化线段树是可以保存所有历史版本的线段树,每次插入,都会创建一颗新树,保存这次插入后版本的线段树,返回这个版本的线段树根节点,后面想查询一个历史版本时,就使用这个版本的根节点,进行线段树查询就行了,具体查询和线段树正常查询完全一样。个点,线段树中剩余的点其实完全没有变化,那其实我们可以在每次插入时,只对受到影响的点创建新的版本,然后接到未受影响的点上,这样每次插入,创建新版本的复杂度就是。小于左子树的元素个数,就进入左子树,否则进入右子树,知道来到叶节点,就是我们要找的元素的值。
2025-02-16 22:20:51
803
原创 FWT快速沃尔什变换
附上按位与和按位或的变换板子,其实就是oiwiki的稍微改了改,oiwiki这个板子难得的写的很好,居然封装好了。如果是按位与和按位或,更换一下变换的函数即可,正变换参数仍然是1,逆变换参数是-1。我们只要看这这个数组有多少个非零位置,就是异或得到的不同值的个数了。但是卷积是一个很神奇的东西,你把他变换到值域上再做,复杂度就能神奇地降到。处理位运算类卷积,板子很简单,就是需要记住正变换和逆变换的参数。数组,然后变换到值域上,卷积,再逆变换回来。就是自己和自己卷积.正变换的参数是1,逆变换的参数是。
2025-02-15 15:24:19
679
原创 拉格朗日插值
你如果能确定一个问题答案一定是一个多项式形式,那么你可以先暴力求出来几个点的解,带入,把这个多项式的系数求出来,接下来给出自变量的话,你直接往这个式子里带入就能得到答案了。这里需要注意的是,对于一个最高次为k的多项式,至少需要k+1个不同的点才能确定全部系数。,没啥好说的,把给出的点传进去,返回多项式系数,然后把自变量。的,这要求我们多项式次数不能太大。就是把每个长度的多项式解加起来,还是个多项式。这18个数据点就暴力求就完了,反正复杂度很低,可以考虑把。这就是一个球相同,盒子不同,可以空盒的球盒问题,
2025-02-15 13:16:04
1136
原创 CF Good Bye 2013 F 动态lca维护树直径
这里一个重要的性质是,首先每次给一个点加两个儿子,对直径的影响和加一个儿子是一样的,因为这俩儿子的位置完全一样,可以被视为一个。这很好想,只有在直径端点上加点才能影响直径,每次加一个点,肯定直径最多变化1,且这个新加点取代它的父亲变成新端点,但直径的另一端肯定没有任何变化。利用这一点,我们可以维护直径的两个端点,以及直径长度,每次加点后,检查新加点到直径两个端点的距离,如果大于当前直径,就更新直径大小和直径端点。数组,而我们加一个点的时候,他的祖先的。,而是需要每加一个点,就计算一下它的。
2025-02-04 12:09:44
652
原创 CF 907 (Div 2)F dfs+线段树
那这题就很典了,我们可以在dfs遍历所有点的同时,维护一个数据结构,只保存这个点的所有祖先,然后再根据需要在这个数据结构上查询。这种正着想不好想的,转换一下角度,一个操作能影响哪些点不好想,可以思考一个点会被哪些操作影响,那显然会被作用于这个点的祖先上的,且操作时间在这个点的创建时间之后的操作影响。这题的难点在于,有时间顺序,一个点只会被在他被创建之后的子树加操作影响,之前的加操作可能是包含这个点的子树,但是那时这个点还不存在,也就不会被影响。
2025-02-04 11:59:29
212
原创 CF Deltix Round(Div 1+2) E 多tag线段树
首先一个区间有ab只有三种情况,左边有ab,右边有ab,左边有a右边有b,把这三种全删了就行了。那一种方法就是让左边没有a,这样左边的ab肯定没了,左边a右边b也没了,就剩下右边的ab了,我们直接把右边的ab删掉。另一种思路类似,把右边的b删掉,这样左边删掉ab就行了。那么怎么求不含abc的最少次数呢,和前面的分析类似,要么左边不含a右边不含abc,要么左边不含abc右边不含c,要么左边不含ab右边不含bc。这么看来我们需要维护一个区间的a,b,c的个数,以及不存在ab的最少删除次数。
2025-02-04 11:40:34
312
原创 CF971(Div 4) G2 单调栈+倍增
然后就是求把一个区间的元素都变成相等的最小操作数,那显然应该变成众数。当然二进制位拼数最后肯定能恰好拼完,因为任何一个整数都可以转化为二进制表示,但是本题最后一段可能会剩一点,因为最后一段的下一个更小,可能是在。然后我们知道分段情况了,就可以倍增预处理,然后查询的时候用倍增数组跳几次,就能覆盖到所有段了。虽然维护的东西有点抽象,但这其实就是最经典的倍增思路,比如我让你用最少的二进制位表示出来一个整数。)的子数组最小操作次数,每次操作可以把一个位置的元素变成任意值。的问题了,这里也有一个trick,我们把。
2025-02-04 11:31:19
718
原创 CF940(Div 2) D 位运算+前后缀分解
这就是说两个数异或起来,再异或另一个数,会变大。那么这个新加进来的数,在最高位一定和原本的两个数异或后的最高位相同。这很好想,如果最高位不相同,即使更低位全都相同,由于低位加起来也没有最高位大,异或起来,最高位变大,其余位都变小,整体还是会变大。这实际上就是个前后缀分解,我们要先预处理二进制每一位的前缀和和后缀和,然后枚举。这样两个前缀和数组异或起来在最高位是0,然后。在它的最高位肯定是1,异或一下最高位就从0变1了,整体会变大。,两边0的个数相乘和1的个数相乘就是答案。这个式子用前缀异或和表示,就是。
2025-02-04 11:06:13
498
原创 Bubble Cup 11(Div 1) G 二位数点+treap
乍看就是个二位数点,但是这个交流是双向的,我们如果按一般的排序+线段树的方式做,可能一个点能到另一个点,但是另一个点到不了这个点,计算的答案是有问题的。两个点能交流,必须是相互的,就是一个点的矩形包括另一个点,另一个点的矩形也包括这个点。但这样的问题就是,我们遍历点的顺序必须是。降序的顺序遍历所有点,这样如果一个点到前面的一个点,前面的这个点由于。这里就有几种选择:一种是建动态开点线段树,一种是先对所有。这个维度不用线段树,完全可以手动枚举所有可能的。的顺序访问所有点,所以没法用排序+线段树了。
2025-02-04 10:55:00
496
原创 2023-2024雅加达区域赛 F 离线+线段树维护最大子段和
内这个条件,就相当于对一个区间的元素求最大子段和,这个东西可以线段数维护,和维护区间最长全0子串类似,也是维护三个。的单点加,然后我们要选一个区间的操作,让区间元素和最大。首先可以先去掉一些条件,如果就是给一堆区间加操作,然后问选择一个子数组中的所有操作执行,:全局最大,前缀最大,后缀最大。具体来说,我们就是开一个线段树,存所有操作,如果第。中选择一个非空子区间,执行序号在这个区间内的区间加操作,然后问。这个位置的所有区间加操作,然后再这些操作里,他们都能对。的所有操作的最大子段和,就是一个区间查。
2025-02-04 10:26:25
760
原创 CF 939(Div 3) G dfs序+二位数点
在子树中有一个重要性质,就是一颗子树中的点的dfs序是连续的,具体来说,在。,我们不能对时间维进行一个非前缀的区间查,任意时刻都只能进行前缀查询。这就是个二维数点问题,我们可以对询问离线,一边按照。给你一颗树,给你一个排列,代表树上节点。这个二位数点问题还有点难,一般如果。排序,我们实际上是用时间维来处理。,我们应该把它拆成两次,分别放到。中的节点,是否存在至少一个在。这个区间里的点数是否大于0。前缀和就好了,我们可以把。个元素在二维平面上对应一个。这个点,然后每次询问就是问。对答案的贡献是负的吗,
2025-02-03 23:30:19
809
原创 CF 996(Div 3) H 线段树维护最长全0子串
线段树,我们可以维护一个区间前缀最长全0串,后缀最长全0串,全局最长全0串。然后合并的时候,全局最大就是左右的全局最大,以及左边的后缀+右边的前缀,前缀需要分讨:如果左儿子全是0的话,就是左儿子前缀+右儿子前缀,否则是左儿子前缀。一个集合,每次可以加元素,删元素,或询问后面至少有k个空位的最小元素。后缀上(如果不在后缀,我们可以把这个长度为k的串到结尾这一段删掉,那么s就还不是最小的),答案即为。这需要我们先实现一个维护区间最长全0串的线段树,这是个经典多。个空位,实际上就是找长度至少为k的全0串。
2025-02-03 23:10:13
640
原创 CF 993(Div 4) H 推式子+前缀和
具体式子就不推了,但是这种查询一段的和,然后一眼又看不出来怎么维护的,可以尝试把表达式列出来,然后把类似于。这种题就是看着吓人,实际上最后都能拆成几个前缀和的组合。这题的前缀和就是前面举例提到的三种。这种项分别提出来,对每一项维护前缀和一般就好了。
2025-02-03 22:45:55
134
原创 CF EDU172 F 线段树维护dp
首先不说带修和区间查,就看这个问题,其实是个很简单的dp问题,可以用状态机dp,表示当前进行到选两个子数组的哪一步了,比如说已选第一个区间的左端点,已选完第一个子区间,已选第二个子区间的左端点,已选完第二个子区间……这个结论实际上可以推广,就是所有转移是前面项的线性组合的dp,都可以转化为矩阵连乘,然后也就都可以用线段树实现带修和区间查询。的dp结果,实际上是要把这个区间里的转移矩阵乘起来就好了。然后我们发现,状态机dp的转移,实际上可以转化为一个矩阵乘法,因为它只和前面有限项的线性组合有关。
2025-02-03 22:41:11
401
原创 ARC189 D 单调栈
然后对于一个一般的人,他首先可以吃掉两侧比他小的人,这可以单调栈求出两侧第一个更大的人,然后把中间的人都吃掉,这可以前缀和。然后再取挑战两侧更大的人,如果此时,比两侧原本更大的人还大了,就可以吃掉两侧更大的人,并且两侧更大的人能吃的,他现在一定也能吃,因此这个人的答案就应该是两侧更大的人的答案。我们可以根据初始大小排序,从大到小计算答案,这样就可以保证更大的人的答案已经算出来了,然后最开始,最大的那个人前面讨论过了,显然可以直接求出。答案是都行,因为如果吃完中间的,比两侧更大的人都大,那么。
2025-02-03 22:26:45
759
原创 ABC375 F 离线+最短路
但是每加一次,最短路都可能发生变化,需要重新跑最短路。这里就有两种策略,一种是对于每次查询,都跑一个单源最短路,另一种是每次加边都跑一个全源最短路,然后查询的时候直接查。加边多的话,应该用第一种策略,查询多的话,应该用第二种策略。但是每次都跑最暴力的全源最短路的话还是会超时。可能是不一样的,因此更新最短路的时候这两种转移都要使用,才能得到全局最短路。,也就是把最外层的枚举所有点作为中介,换成只利用新加边的两个端点作为中介,这样复杂度是。一种是删掉一个边,一种是询问两点之间的最短距离。
2025-02-03 22:12:26
677
原创 ABC 379 F 单调栈二分/单调栈+线段树
然后我们再注意到这个能看到的条件实际上就是单调栈的状态,也就是遇到一个元素,右侧比这个元素更矮的元素就都看不到了,只有右侧更高的元素才能被继续看到。类似于遇到一个元素就把栈中更小的元素出栈,只保留更大的。这个条件其实比较反直觉,他不和看的人的高度无关,之和被看到的人,以及被看到的人到看的人之间的元素有关。所以很显然,从被看的人,到看的人之间元素越多,越可能被挡住,这实际上是说子区间一段变长,区间最大值是不减的。的下标个数,这可以对单调栈中的元素进行二分,这需要我们数组模拟栈。的元素个数,就是一个区间查。
2025-02-03 22:03:01
528
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人