首页 > 其他分享 >bitset 相关优化

bitset 相关优化

时间:2024-03-06 21:46:25浏览次数:23  
标签:false int 优化 tree pos bitset 相关 true

bitset 基础用法

operator []: 访问其特定的一位。
operator ==/!=: 比较两个 bitset 内容是否完全一样。
operator &/&=/|/| =/^/^=/~: 进行按位与/或/异或/取反操作。
bitset 只能与 bitset 进行位运算,若要和整型进行位运算,要先将整型转换为 bitset。
operator <>/<<=/>>=: 进行二进制左移/右移。
operator <>: 流运算符,这意味着你可以通过 cin/cout 进行输入输出。
成员函数
count(): 返回 true 的数量。
size(): 返回 bitset 的大小。
test(pos): 它和 vector 中的 at() 的作用是一样的,和 [] 运算符的区别就是越界检查。
any(): 若存在某一位是 true 则返回 true,否则返回 false。
none(): 若所有位都是 false 则返回 true,否则返回 false。
all():C++11,若所有位都是 true 则返回 true,否则返回 false。
set(): 将整个 bitset 设置成 true。
set(pos, val = true): 将某一位设置成 true/false。
reset(): 将整个 bitset 设置成 false。
reset(pos): 将某一位设置成 false。相当于 set(pos, false)。
flip(): 翻转每一位。(相当于异或一个全是 1 的 bitset)
flip(pos): 翻转某一位。
to_string(): 返回转换成的字符串表达。
to_ullong():C++11,返回转换成的 unsigned long long 表达。
_Find_first(): 返回 bitset 第一个 true 的下标,若没有 true 则返回 bitset 的大小。
_Find_next(pos): 返回 pos 后面(下标严格大于 pos 的位置)第一个 true 的下标,
若 pos 后面没有 true 则返回 bitset 的大小。

bitset 优化例题

CF633G

首先可以知道:可以将子树通过 dfn 序转化为序列。

有一个思路是:维护大约 \(200\) 个树状数组来存储每个质数在区间中出现次数。复杂度 \(O(200\times n\log n)\)。在某些网站上可以通过(什么oj我不说)。

换一个思路,有一个限制:\(m\leq 1000\),这意味着我们完全可以将区间内开一个大小为 \(1000\) 的数组代表这个数是否出现。可以用线段树维护这类信息, push_up 时只需要将左子树维护的数组和右子树维护的数组或起来。区间加上一个数 \(x\) 相当于平移 \(x\) 单位,并且超出 \(m\) 范围的要循环移位。

复杂度 \(O(nm\log n)\)。肯定过不去。甚至还不如之前做法。

但是我们发现:我们数组维护的全是 01 信息,可以用 bitset 来代替。push_up 直接 tree[p].s = (tree[ls].s | tree[rs].s),区间加直接 tree[p].s = (((tree[p].s) >> (m - x)) | (tree[p].s << x))

复杂度 \(O(\dfrac{nm\log n}{32})\)。只放部分代码:

struct edge {
	int l, r, lazy;
	bitset<1005> s;
}tree[N * 4];
void push_up(int p) {
	tree[p].s = (tree[ls].s | tree[rs].s);
}
void down(int p, int x) {
	tree[p].lazy += x; tree[p].lazy %= m;
	tree[p].s = (((tree[p].s) >> (m - x)) | (tree[p].s << x));
}
void push_down(int p) {
	if (tree[p].lazy) {
		tree[p].lazy %= m;
		down(ls, tree[p].lazy); down(rs, tree[p].lazy);
		tree[p].lazy = 0;
	}
}

P5670

这题和上一道例题如出一辙,因为只看后 \(m\) 位,那前面的位其实就没有用了!等价于模上 \(2^m\)。这道题维护异或信息就行了。只放部分代码:

struct edge {
	int l, r, lazy;
	bitset<1024> s;
}tree[N * 4];

void push_up(int p) {
	tree[p].s = tree[ls].s ^ tree[rs].s;
}

void add(int p, int x) {
	tree[p].lazy = (tree[p].lazy + x) % m;
	tree[p].s = ((tree[p].s >> (1024 - x)) | (tree[p].s << x));
}

void push_down(int p) {
	if (tree[p].lazy) {
		add(ls, tree[p].lazy);
		add(rs, tree[p].lazy);
		tree[p].lazy = 0;
	}
}

signed main() {
	n = read(), m = read(), p = read(); m = (1 << m);
	for (int i = 1; i <= n; i++) a[i] = read();
	build(1, 1, n);
	while (p--) {
		int op, l, r, x;
		op = read(), l = read(), r = read();
		if (op == 1) {
			x = read();
			modify(1, l, r, x);
		} 
		else {
			ans.reset();
			query(1, l, r);
			int res = 0;
			for (int i = 0; i <= 1023; i++) if (ans[i]) res ^= i;
			wr(res & (m - 1));
			putchar('\n');
		}
	}
}

习题:

  • AT_abc258_g: [ABC258G] Triangle
  • P3674: 小清新人渣的本愿
  • P4688: 掉进兔子洞
  • P5355: 由乃的玉米田

标签:false,int,优化,tree,pos,bitset,相关,true
From: https://www.cnblogs.com/stOtue/p/18057663

相关文章

  • Python涉及路径相关的知识点
    脚本中的路径信息print('__file__:',__file__)#脚本的位置print('os.path.abspath(__file__)::',__file__)#脚本的绝对路径(和上面的一般情况下是一样的)print('os.path.abspath(__file__):',os.path.abspath(__file__))SCRIPT_DIR=os.path.dirname(os.path.abspat......
  • springboot3+vue3(四.2)ThreadLocal优化
    解决痛点:我们在拦截器内已经获取并解析了一遍token数据,如图:然后在获取当前登录用户详细信息时又做了一遍同样的操作,如图:后续如果说需要用到当前登录用户的信息时都要带上token参数,这样是很冗余的。这时就会用到ThreadLocal来进行优化处理。 ThreadLocal工具类/***......
  • (22)Lazarus退出时保存相关对象值为Ini和XML格式(IniPropStorage1和XMLPropStorage1)
    参考自带例子C:\lazarus\examples\propstorage1]放一个IniPropStorage1到界面上,将它的IniFileName设置为config.ini 2]类似地,拖一个XMLPropStorage1到界面上,将它的FileName设置为config.xml 3]添加要保存的属性 ......
  • 第三节:队列相关(滑动窗口最大值、)
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • SQL优化实战分析
    分享一个案例,一条SQL引发的“血案”!技术人人都可以磨炼,但处理问题的思路和角度各有不同,希望这篇文章可以抛砖引玉。以一个例子为切入点一、问题背景这是一个数据仓库系统,正常情况下每天0~6点会跑批,生成前一天的业务报表,供管理层分析使用。某天凌晨,监控系统频繁发出告警,大批业务报......
  • 搜维尔科技:捕获、分析、优化,使用 Xsens Ergo 创建更安全的工作空间
    简化人体工程学分析,优先考虑员工福祉,并利用客观数据和见解提高生产力。捕获。分析。优化。使用XsensErgo创建更安全的工作空间1.质量数据使用高质量、客观且经过验证的运动数据进行详细的人体工程学分析2.随处使用在最具挑战性的工作环境中随时测量和分析3.快速、实时分......
  • Mac终端安装Jupyter Notebook,配置环境变量及其相关知识(环境变量相关操作、编辑器、zsh
    目录1.Mac终端安装JupyterNotebook1.1先更新一下pip,然后安装JupyterNotebook1.2配置环境变量1.2.1找到Jupyter的安装位置1.2.2环境变量加到.zshrc2.相关知识2.1环境变量2.2编辑文件2.3zsh和bash2.4.zshrc(.bashrc)文件和.zprofile(.bash_profile)文件的区别1.Mac终......
  • 性能优化 flutter
     1.widgetbuild()方法避免执行重复耗时的非必要操作避免在widget或者state的build()方法中进行重复且耗时的非必要工作,因为当父widget重建时,子widget的build()方法会被频繁地调用。因此确保非必要的耗时工作不放在build()方法中。2.控制widgetsetState()的重建范围......
  • 前端性能优化
    1、尽量不要使用第三方库,考虑是否可以通过代码实现,比如时间格式化,可以自己写代码实现指定格式的转换,不要使用第三方库来实现,这样可以减少打包代码的体积2、去除大的base64体积3、首屏数据尽量并行,让一些小的接口合并到其他接口,请求接口的时间包括三次握手的时间,这也是时间,合并到......
  • 2024 年春节集训 _ 第二课 - 数据结构优化动态规划
    【例题\(1\)】递增子序列\(\color{white}{link}\)考虑\(dp.\)\(dp[i][j]\)表示以元素\(i\)为结尾,长度为\(k\)的方案数。那么显而易见就有一个转移方程:\[dp[i][j]=\sum_{a[k]<a[i],\k<i}dp[k][j-1]\]先抛去第二维度的\(j\),这是可以做一个关于\(a[i]\)值的大......