枚举
lamentropetion
---
展开
-
2023年浙大城市学院新生程序设计竞赛(同步赛)G
不难想象其实就是操作结点的子树和该点连通的黑色连通块的所有结点,对这些结点会有影响。首先想法非常单一,一定是去枚举操作点,然后看它染白和不染的价值差值。黑色连通块容易用树形dp求,然后就是操作点到最近白色祖先距离怎么求。那么差值其实就是黑色连通块大小 * 操作点到最近的白色祖先的距离。也就是说,把一个黑色结点染白之后,对哪些结点的价值会影响。dfs即可,记录上次的白色结点是什么即可。原创 2023-12-23 23:45:17 · 868 阅读 · 1 评论 -
【字符串】ABC324E
然后因为拼起来之后要包含 t 这个字符串,隐隐约约会感觉到和前缀后缀子序列有关。满足ai + bj >= m有多少对 (i, j),这个直接值域统计一下即可。统计两个指针的方案数一定是枚举一个,统计另一个。退役啦,接下来的博客全是图一乐啦。原创 2023-12-14 00:45:15 · 641 阅读 · 0 评论 -
【前后缀技巧】2022牛客多校3 A
预处理出前缀lca和后缀lca,枚举哪个消失即可,可以统计方案数。这种是典中典中典,对于gcd,背包问题都是一样的处理方式。原创 2023-10-05 00:58:31 · 465 阅读 · 0 评论 -
(枚举 + 树上倍增)Codeforces Round 900 (Div. 3) G
首先,目标值和结点权值是直接联系的,最值不可能直接贪心,一定是考虑去枚举一些东西,依靠这种枚举可以遍历所有的有效情况,关于怎么跳其实可以参考树上倍增往上跳的跳法,记录一个数组指向下一个结点,在dfs上维护即可,有点像在树链上DP。如果考虑在链上枚举,如果前缀或值不变,那么这样的枚举是无效的,我们直接考虑跳着枚举,只枚举所有。注意到一条路径上的前缀或值不会超过 logV个,因此考虑枚举前缀或值。如果去直接在链上枚举的话, 复杂度是O(nq),肯定不行。关于每次跳使前缀或值变化的最深的点,我是这样理解的。原创 2023-10-03 23:23:14 · 365 阅读 · 0 评论 -
【枚举+贪心】CF1409 E
然后就能直接做了,枚举一个区间,然后找这个区间后缀的最大贡献的区间即可,所以需要维护一个后缀贡献的最大值。首先贪心的结论很明显,选两个贡献最大的区间。还有一个结论,这两个区间没有交点。原创 2023-09-23 01:06:47 · 272 阅读 · 0 评论 -
【枚举子序列+组合数学+推式子】Cf Edu11 E
【代码】【组合数学+推式子】Cf Edu11 E。原创 2023-09-06 11:05:28 · 216 阅读 · 0 评论 -
【枚举区间+线段树】CF Ehu 152 E
对区间计数,按照CF惯用套路,枚举其中一个端点,对另一个端点计数。对于这道题,枚举右端点,对左端点计数。原创 2023-09-01 21:40:58 · 328 阅读 · 0 评论 -
【枚举区间】CF Edu10 C
枚举区间,一个很经典的套路是,枚举 l,对 r 计数。对于一个l,r取这么多限制中离 l 最近的那个。应该反思一下这么典的思路为什么会想不到。原创 2023-08-31 16:51:42 · 191 阅读 · 0 评论 -
【枚举】CF1858 B
虽然赛时做出来了,但是这种计算还是感觉不熟练。直接枚举是去掉哪个店,然后计算贡献即可。原创 2023-08-16 18:51:56 · 101 阅读 · 0 评论 -
【贪心+二分】CF1791G2
按贡献 min(ai + i, ai + n - i + 1) 排序之后,我们发现,第一个传送门是什么不确定。我就想到了这里,这里我直接猜测第一个传送门一定是ai + i最小的那个,但是这个结论是错的。那么就回溯一下思路,思考一下一般情形,我们只需要枚举这个位置,然后把传送点个数取最大即可。首先,模拟一下样例发现,第一次传送之后,每次传送的贡献都是独立的,每次的贡献都是。那么直接在排序后的数组上操作即可,看最多延伸到这个数组的哪个长度。注意到这个长度具有单调性,当长度足够长时,钱就不够,足够短时钱够。原创 2023-08-16 15:21:32 · 97 阅读 · 0 评论 -
【贪心】CF1841 D
考虑一个大区间包含所有小区间的情形,这种情况就是在这么多区间中找出两个区间。n^2枚举所有区间对,每对区间合并成一个新区间,这个新区间就是一个连通块。换句话说,这么多区间组成一个连通块,在这个连通块中找出两个区间。问题就变成在这些新区间中找最多的不相交的区间的区间个数。这个就是典,把所有新区间按 r 排序,贪心地选即可。那么就去考虑特殊情况,看看有没有什么启发。一个连通块贡献出两个区间。问题转化成有多少连通块。原创 2023-08-15 19:56:34 · 171 阅读 · 0 评论 -
【枚举边+MST+组合计数】CF1857G
可以发现对于每一对点,贡献是 s - 这对点对应的环的最大边 + 1。然后,根据惯用套路,枚举树上的点对问题可以转化为枚举边,按边去算贡献。在Kruskal的过程中,一条边是作为最大边出现的,贡献是。那么这样就有了 n^2 的做法。原创 2023-08-15 15:25:09 · 186 阅读 · 1 评论 -
【枚举gcd】CF803 C
还有就是,(2 * n) / k < 1 + k) 的情况直接判无解,否则会超时。注意 gcd = 1和 gcd = n的情况要特判,不然枚举因子的时候会超时。因为要求严格递增,贪心地考虑,构造成1,2,3,....,k - 1即可。那么就是 k1 * k,k2 * k,k3 * k,....那么(k1 + k2 + k3 +....) * k = n。然后最后一项就是 n - k * (k - 1) / 2。根据惯用套路,我们去枚举 n 的因子即可。需要判断最后一项要大于k - 1。原创 2023-08-14 14:22:31 · 158 阅读 · 0 评论 -
【动态map】牛客挑战赛67 B
在这里,定义{a,b}为cnt1 - cnt0和cnt2 - cnt0。可以先定义一个状态,然后用map统计前缀这个状态的出现次数。当cnt0 和 cnt1都和cnt2相同时,统计贡献。原创 2023-08-13 00:00:35 · 547 阅读 · 0 评论 -
【枚举+推式子】牛客小白月赛 63 E
组合数学就是在考虑枚举所有包含1和n的区间。这个典中典就是枚举1和n的位置然后算贡献。首先是个计数问题,考虑组合数学。原创 2023-08-12 19:05:14 · 418 阅读 · 0 评论 -
【枚举】CF1660 D
对于每一段,枚举去掉左边段还是右边段,左边段是 l 到第一个负数,右边段是最后一个负数到 r,看哪个大。思路巨简单,代码也wa了很多发才过,都是因为细节....比较的话不需要把区间积算出来,比较区间2的个数即可。如果区间积本来就是正数,那么直接取一整段即可。很显然,要根据0分段处理。原创 2023-08-12 01:11:26 · 195 阅读 · 0 评论 -
【枚举】CF1706 C
很显然,对于n是奇数的情况,只有一种情况,直接操作偶数位就好了。其实有个小技巧,在模拟样例的时候特殊化成0和1会比较好看一点。主要是没搞清楚n是偶数的情况。原创 2023-08-07 19:33:17 · 411 阅读 · 0 评论 -
【枚举,构造】CF1582 C D
但是回文子序列的判定我vp的时候写的很答辩,也不知道为什么当时要从中间往两边扫,纯纯自找麻烦。可以发现,如果n是奇数,那么就分组成3+2+2+2+....的形式。当然这里的c和-c可以替换成b和-b,a和-a,所以是三种情况。思路很简单,只删除一种,直接枚举删除的是哪一种即可。直接从两边往中间扫就行了,然后把该删的都删掉。然后考虑将特殊情况“组合”到一般情况中去。否则就可以是2+2+2+....的形式。然后就越改越复杂,两小时的时候才过C。构造题,看样例发现什么都看不出来。如果N = 2,那么。原创 2023-08-06 01:48:47 · 171 阅读 · 0 评论 -
【枚举+trie+dfs】CF514 C
注意到字符集只有3,因此如果发现有不同的字符,去枚举新的字符。对于每次询问,都去字典树上dfs。其实是trie上dfs的板题。先把字符串插入到字典树中。原创 2023-08-04 11:19:09 · 487 阅读 · 0 评论 -
【枚举+01 trie树】CF1658 D2
给定一个区间[l, r]和r - l + 1个数,问是否存在一个数 x ,使得这些数异或上 x 之后为[l, r]的一个排列。如果存在 x ,使得这些数的对 x 的最大异或为 r,最小异或为 l,那么就一定满足条件(因为这些数一定不同)但是是哪个 ai 异或了 x 变成 l不确定,所以可以转化成枚举 ai。首先一个结论:若两个数异或 x 不同,那么这两个数本来一定不同。因为这些数异或 x 之后是一个排列,因此这些数原来就不同。这种有关一个集合和异或操作的,都可以试试字典树。这样 x = ai ^ l。原创 2023-08-04 10:17:19 · 119 阅读 · 0 评论 -
【枚举边+树的直径】CF14D
两条链不相交,说明是在不同连通分量中,我们可以枚举边来把树分为两个连通分量,然后分别计算直径即可。原创 2023-08-02 14:24:49 · 202 阅读 · 0 评论 -
【组合计数】CF1151E
对于每条边,它包含在区间的条件是ai和ai-1都在[l,r]范围内,贡献为min(a[i],a[i-1])*(N-max(a[i],a[i-1])+1)对于每个点,它包含在区间的条件是ai在[l,r]范围内,因此贡献为ai*(N-ai+1)一个是枚举右端点r,然后计算左端点l的贡献。我们要统计区间数量,有两个思考方向。对于点和边我们去单独计算贡献。还有一个就是,更换枚举对象。连通块数量=点数-边数。因为答案是连通块数量。原创 2023-08-02 10:53:33 · 196 阅读 · 0 评论 -
【枚举+结论】icpc2022 济南 A
其实错误的思路都有个共同点,就是猜了结论之后没有去想为什么,在想为什么的过程其实就是pushup归纳的过程。然后,需要把贡献算出来之后再去排序,去掉排序后的m个大的,这里也有点问题,应该把贡献算出来了之后再去排序。考虑最后会变成什么数,手摸了几个发现,都是2,不论本来的集合是不是包含2。然后考虑去枚举最后变成什么数,猜测最后会变成集合中本来有的数,也wa2了。首先第一个,最后变成的数,一定是集合中某个数/2之后的值,这点需要观察到。然后要去掉m个,直接考虑去掉最大的m个。原创 2023-07-31 15:47:08 · 412 阅读 · 0 评论 -
【枚举】CF978 D
所谓枚举,就是要利用隐含条件找出不明显的小数据,即状态数很少。这道题中,因为是等差数列,且每个数只能被+1或-1一次。确定了前两个数和公差之后,数列就被确定了。而公差只有3种情况,前两个数只有9种情况。那么只需要O(9N)枚举即可。原创 2023-07-25 20:57:47 · 199 阅读 · 0 评论 -
【枚举】CF1833 D
观察样例可知,r是可以直接确定的,l是不确定的,因此考虑O(N)枚举左端点,统计字典序最大值。给定一个序列,让你找一个区间,翻转区间内的数,交换前缀和后缀,让结果数组的字典序最大。关于字典序,放vector里可以直接比较。原创 2023-07-23 22:27:27 · 153 阅读 · 0 评论 -
【前后缀GCD】ABC125 C
由样例可知,换成的数可以是其他N-1个数的gcd,这样对答案的贡献也没有影响。因此怎么去快速求其他N-1个数的GCD就成了问题。这样trick非常经典,在牛客寒假营就出现过。它那个是前后缀背包,这个是前后缀GCD。这道题,多看看样例大概就出来了。所以直接去枚举换的是什么数就行。原创 2023-07-13 23:37:57 · 196 阅读 · 0 评论 -
【*1900倍数遍历】CF1627 D
对于这道题要注意,j/i的gcd要为1,这样才能保证j是i的最大公约数。原创 2023-07-11 17:16:38 · 80 阅读 · 0 评论 -
【枚举+exgcd】牛客练习赛33 C D
注意到减y的次数不会超过N,因此我们去枚举减y的次数,然后去计算加x的次数。首先要使平均数是整数,说明sum是N的倍数,即要使sum%N=0。问题就是经过若干次操作的最少代价,可以使sum%N=0。easy版本一般是枚举,我们去考虑枚举。如果x=1,那么加x的次数可以直接计算。=1,那么需要exgcd。那就去考虑模N意义下的sum。原创 2023-07-10 11:50:37 · 91 阅读 · 0 评论 -
【枚举+容斥】牛客练习赛113 F
我们去枚举子序列的长度和在子序列中出现次数>=(d+1)/2的元素是哪个,然后再去枚举这个元素在。但是这样算出来的答案,对于[1,1,2,2]这种数列会算两次,因此需要容斥一下,减去这部分的贡献。况且数据范围是200,更是暴力。这道题做法是枚举+算组合数。的出现次数,然后去算组合数。原创 2023-07-08 11:25:39 · 190 阅读 · 0 评论 -
【组合数学 or 枚举】逆序对
我们去枚举位,一共最多1e18位(不是指真的枚举,是按位去计算贡献)组合数学,无非两种做法,一种是计数DP,另一种是组合数。考虑组合数的时候可以把这道题变成一个枚举题。DP显然不可能,那就组合数。原创 2023-07-06 20:03:02 · 127 阅读 · 0 评论 -
【枚举区间思想+DP】子串的子序列
这里的DP并不是传统意义的子序列DP,也就是说,并不是枚举两个指针然后转移(LIS),也不是统计前缀满足某个性质的子序列的最值(接龙数列 or 绝世好题),这里用的是状态机DP。为什么是这样设计的,其实一开始想的应该只是ac的数量的奇偶性,但是发现这样不能算贡献,考虑多一个字符c,贡献还与前缀a的数量的奇偶性有关,所以应该还有加上一维。设dp[i][0/1][0/1]表示,前i个字符,a的数量的奇偶性是0/1,ac的数量的奇偶性是0/1的。我们去枚举右端点r,然后计算满足条件的左端点的个数。原创 2023-06-18 15:28:40 · 465 阅读 · 0 评论 -
【枚举+数学】代码源每日一题div2 数学
那么只需要分开枚举即可,然后求一下最大值*次大值 和 次大值*最大值 的 最大值。也就是说我们要枚举(N+1)*N/2的因子,其实就是找出它的最大因子。注意到还有个条件我们没有利用:数列是1~N的。那么就是(k1+k2)*K=sum。这意味着sum=(N+1)*N/2。因此只需要枚举sum的因子即可。说明不能直接枚举,怎么办呢。所以K是sum的一个因子。但是注意数据范围:1e9。原创 2023-06-15 16:52:55 · 388 阅读 · 0 评论 -
【GCD枚举因子+环上问题】代码源每日一题div1 最大公约数
这个又是典中典的东西,直接求个前缀和%x就好了,看看mp[pre[i]%x]的最大值就是最多能分成几段,然后记录答案即可。还有一个很显然的点我没有想到:如果一个序列能分成多段,那么自然可以分成更少段,因此答案数组需要求个后缀最大值。要让GCD(sum1,sum2,sum3,....sumk)最大,惯用套路,令其为K,那就是让K最大。事实上都不需要枚举,因为你一段区间和%x为0了,头尾相接%x也一定是0了。还有环的条件,我想的是倍增数组之后O(N)枚举区间,但是这样肯定T。所以很自然想到了枚举sum的因子。原创 2023-06-11 15:48:43 · 69 阅读 · 0 评论 -
【期望定义】CF453A
关于期望的问题,有两种思路:一种是期望DP,另一种是直接根据期望的定义求。我们可以把所有可能的结果抽象成一棵树,一棵很特殊的K叉树。对于第 i 次抛硬币,合法情况是i^n-(i-1)^n。我们去枚举在n次抛硬币的过程中的最大值。对于特殊的树,直接用组合数去计算即可。n次抛硬币,硬币有m种结果。期望是什么,是权值*概率。原创 2023-06-02 20:24:30 · 58 阅读 · 0 评论 -
【结论+贡献+枚举+排列】CF1671D
结论是一步步搞出来的。原创 2023-05-30 00:52:41 · 61 阅读 · 0 评论 -
【枚举+DS】CF1831D
题意:思路:原创 2023-05-29 20:44:07 · 64 阅读 · 0 评论 -
【*1500 枚举】CF1487D
问你存在多少个三元组(a,b,c),满足a*a=b+c且c*c=a*a+b*b。枚举题,直接枚举a,b和c直接就出来了,check一下范围就好了....看到a*a,a*b这种的应该直接想到数据范围直接变成根号。注意到a的范围最多sqrt(2e9)且满足1<=a<=b<=c<=N。注意要和N取min,不然会超时。原创 2023-05-29 15:53:52 · 53 阅读 · 0 评论 -
【猜结论+Tree】ICPC 昆明 F Find the Maximum
考虑一条长度>=4的路径,将其对半分,因为长度/2,权值和有一段<原来的1/2,有一段>原来的1/2,因此>原来的1/2的那段的均值就乘了个大于等于1的值,一定不差于原来一整段,那么就可以一直分下去,直到分到长度为2或者3的链。给定一棵树,问你对于所有的简单路径,下面这个式子最大值是多少。那么我们可以枚举所有长度为2或者3的链,然后统计最大值即可。原创 2023-05-28 20:38:17 · 52 阅读 · 0 评论 -
【反悔贪心+二分答案+枚举】Educational Codeforces Round 149 (Rated for Div. 2) F. Editorial for Two
那么,接下来就是看是否存在所有长度为K的子序列中分割成两部分的max(左,右)<=mid,即去看这个子序列的长度有没有K。给定一个长度为N的数列,问你所有长度为K的子序列中,将子序列分割成两部分,max(左半部分,右半部分)的最小值是多少。用堆预处理出前缀的子序列和后缀的子序列,然后枚举分割点就好了。最小化最大值,我们去二分这个最大值。关于子序列,这里用反悔贪心。原创 2023-05-26 18:47:59 · 97 阅读 · 0 评论 -
【枚举】ABC160 D - Line++
看数据范围应该是n^2枚举。枚举i和j,暴力统计即可。如果只枚举k会算不清楚。因此枚举的东西很重要。原创 2023-05-25 11:49:40 · 41 阅读 · 0 评论