![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
枚举
陈末iiiiiiiiiiii
Retired
展开
-
Codeforces Round #772 (Div. 2) D 无限集 二进制枚举 思维
题面给定一个由 n 个不同的正整数组成的数组 a。让我们考虑一个无限整数集合 S,它包含所有满足以下条件之一的整数 x:x=ai 对于某些 1≤i≤n。x=2y+1 且 y 在 S 中。x=4y 并且 y 在 S 中。例如,如果 a=[1,2],则 S 中的 10 个最小元素将是 {1,2,3,4,5,7,8,9,11,12}。找出 S 中严格小于 2的p次方 的元素个数。 由于这个数字可能太大,所以以 109+7 为模打印。输入第一行包含两个整数 n 和 p (1≤n,p≤2⋅105)原创 2022-02-21 16:46:20 · 477 阅读 · 0 评论 -
2021牛客寒假算法基础集训营4 E 折半枚举 dfs 字符串hash优化空间 字符串哈希的巧妙运用
题目题解思路子字符串只有40个,如果我们枚举每次枚举20个,再用枚举后的结果进行匹配,时间复杂度显然是够的,用STL内置的哈希表哈希string再匹配,交了一发mle了。只能用自己的写的哈希来优化了。利用字符串哈希,我们可以O(1)的获取某个连续子串的哈希值,在用A中的小字符串来拼接大串的部分,通过前一半和后一半的组合来得出答案。这里用dfs显然更优,我们判断可行性后再进入分支,如果用2进制枚举的化需要知道每个小字符串组合的哈希值,这东西也很大的。2^40我们用dfs判断进入了某段长度后,再试探原创 2021-12-01 10:01:07 · 121 阅读 · 0 评论 -
Codeforces Round #755 (Div. 2)D 交互题 二分 找规律 思维
题目一开始有一个有序序列1 2 3 4 5 …n因为一次操作,它有两个部分被反转了。i 到 j-1 j到k这样使得它产生了一些逆序数。你可以询问l r 内有多少逆序数。你可以至多进行40次 询问,要求在询问后判断有原序列的 i j k 是什么值。3<=n<=1e9题解思路因为1e9内要二分n需要至多30次,所以我们只有剩下的几次来发现答案。我们可以先二分出i 或者 k 。这两个点的性质肯定是逆序数总和刚好改变的点。所以我们需要先求逆序数的总和。就可以确定 i原创 2021-11-15 09:26:39 · 423 阅读 · 0 评论 -
牛客xb月赛 E 类似埃筛的调和级数优化
题目题解思路大概就是X只能由X的倍数gcd出来。所以我们直接枚举他的倍数存不存在,存在就gcd一下。最后保存最后结果防止下次还搜。优化后复杂度大概 mlogn 。这题还卡memset,我麻了。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define ll long longusing namespac原创 2021-11-07 19:49:58 · 111 阅读 · 2 评论 -
牛客xb月赛38 E 求任意区间的长度等于区间值的积 暴力枚举区间+玄学优化术
题目题解思路暴力枚举每个区间,枚举左端点,再枚举右端点。当乘积大于n的时候break,将连续的1优化成直接指向下一个非1数,这样就只需log级别就能枚举出来了。因为这样最差情况下全是乘2也只需要17次就能出循环,所以这个优化是很恐怖的。这样我们只需预处理每个1下一个非1是多少。然后直接暴力枚举区间。枚举左端点和右端点。进行判断能否相等即可。AC代码#include <iostream>#include <cstdio>#include <cstring原创 2021-11-02 15:54:08 · 89 阅读 · 0 评论 -
力扣 869. 重新排序得到 2 的幂 next_permutation() 全排列函数
题目题解思路直接预处理出所有范围中2的幂次的结果。然后再将这个数全排列枚举出答案。全排列可以用next_permutation()函数。但是他只排列出字典序比这个数大的数,所以先将数字从小到大排序出最小字典序,再用这个函数就可以全排列出所有情况了。而且这个函数还可以加入cmp来改变比较类型。参考文章参考文章AC代码class Solution {public: bool reorderedPowerOf2(int n) { bool flag = 0 ;原创 2021-10-28 19:23:18 · 96 阅读 · 0 评论 -
2020ICPC 江西省大学生程序设计竞赛 E.Color Sequence 二进制 异或位运算 传递1 思维
题目给你长度为N的序列,序列里的数只包含0到20。表示第i个位置的颜色。要求计算出满足要求的子序列总数子序列的含有的每个颜色数的总和都是偶数。题解思路比赛的时候想着什么暴力双指针一条路走到黑都没写出来。这里颜色数很少,所以我们可以直接用21位的二进制数表示出来。即0表示含偶数或者0个,1表示奇数个。这样我们就能表示1到n的所有状态了。用异或运算传递一下之前状态的结果。再判断这个状态的是否含奇数个这个颜色。如果是就变成这个位数就0,减去对应的幂次。不是就加上对应的幂次。这样我们就好像原创 2021-10-19 21:54:25 · 206 阅读 · 2 评论 -
95. 费解的开关 二进制枚举 递推 连锁开关问题
题目题解思路法一利用BFS倒推出所有状态 预处理 存表 ,查表搜答案。时间复杂度不好估计。法二利用二进制枚举第一行的所有状态,定下第一行,然后走第二行,此时能处理第一行没开的只有第二行。以此类推最后检查最后一行的结果和按的次数。取出答案。时间复杂度 2^5 * 5 * 5*nAC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#incl原创 2021-09-23 17:27:31 · 63 阅读 · 0 评论 -
CodeForces - 1095C 位运算的处理 存幂次 标记数目 有点陌生
题目题解思路将数字转换成二进制处理,也叫位运算。从最高位开始往下压缩,每次压缩都能提供1的贡献,因为本来是一个数,现在变成两个数,这样下一位的标记数需要加2,当压缩到1时还是弄不出这个K值就不能表示。此外最小的K值就是用数表示二进制中的所有1的个数,最大就是数本身(全转化为1)。 (可以进行提前特判)AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue&原创 2021-07-27 11:16:29 · 215 阅读 · 0 评论 -
AcWing 3734. 求和 DFS枚举 区间优化处理
题目链接题解思路策略就是枚举到符合1e9的数,这样需要搜到10位,枚举完排序,对应区间进行优化,暴力会TLE,枚举数到目标数可以直接做乘法乘数量来减少枚举的数量。数据类型记得longlong int 直接爆。AC代码#include <iostream>#include <cstdio>#include <algorithm>using namespace std;long long a[1300000];int p;void dfs(原创 2021-07-08 18:29:03 · 70 阅读 · 0 评论 -
Aizu - 0525 行列01翻转 二进制枚举
题目给出n行m列的0、1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0。问通过任意多次这样的变换,最多可以使矩阵中有多少个1。N >= 10 M <= 10000题解思路行比较少,我们可以枚举行的变换来确定列。当列的1数目大于一半时不翻转,小于等于时翻转,等于翻转就涉及到奇数取整的问题,例如 1 3 3/2 = 1 .但如果翻转了就是2了,所以等于也要翻转。这里我用二进制枚举,建议用二进制枚举时数组从0开始,方便后面枚举。AC代码#include &原创 2021-07-02 17:40:06 · 357 阅读 · 0 评论 -
POJ - 3187 回溯DFS 或者 全排列next_permutation() 暴力枚举
题目链接题解思路因为数据量小,考虑枚举,可以用DFS枚举全排列,然后判断答案是否正确,因为我们从1开始枚举,本来就是最小字典序,所以有答案就直接return。也可以用next_permutation(),将前N个数放入数组,然后进行全排列循环,在里面循环判断是否符合答案。AC代码#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using原创 2021-07-02 16:21:21 · 85 阅读 · 0 评论 -
AcWing 3711. 方格涂色 二进制枚举 模拟
题目题解思路首先想到了肯定是4个顶点,对四条边的影响,我们可以对每条边分别进行特判,当他大于n-2的时候就必须涂顶点,为了减少影响,我们肯定让他涂在要涂的地方多的位置,最后在判断值是否合法就可以,不过模拟的比较麻烦。闫总用的是二进制枚举来枚举枚举4个顶点涂和不涂的情况,对每个情况,进行判断,只要有一个满足即可。AC代码#include <iostream>#include <algorithm>#include <cstdio>using namesp原创 2021-06-30 18:05:39 · 103 阅读 · 0 评论 -
ACwing3481. 阶乘的和 二进制枚举 也可以DFS
题目数N能否由某些数的阶乘的合组成题解思路很自然的先把每个数的阶乘放到数组里,因为1e6不超过10的阶乘,所以只需取到10的阶乘就行。这样我们也可以用DFS解决,对每个数的阶乘选择取还是不去,及时剪枝,也能AC。我们玩点新花样,同样和上一篇博客一样用二进制来枚举这个过程。对阶乘进行0到2的9次方的枚举,对每个0代表不选择1代表选择,将答案全放进set里,如果N在集合里存在就是对的。AC代码#include <iostream>#include <cstdio>#原创 2021-06-10 22:03:06 · 95 阅读 · 0 评论