二进制的神奇操作——拆位法和贡献思想

news2024/11/29 1:34:44

拆位的引入

我们来思考这么一个问题,如果给你一个数组,让你去求一个数组里面所有连续子串的异或和的和,问你该怎么求?

我们该如何去处理,首先肯定是会想到暴力的思路,第一层循环遍历左端点,第二层循环去遍历右端点,第三层循环去遍历区间内所有值的异或和,然后累加,时间复杂度为O(n^3),如果数据很大,那么暴力肯定是不行的,那么我们就要考虑该如何去优化?

我们首先想到的就是从异或操作的性质去想办法优化,我们首先想到的性质肯定是 a^b^b=a;那么我们可以想到这样的一种操作,如果用S(L,R)表示区间L~R之间的异或和,用pi表示从1~i位置的异或和,那么我们可以想到S(L,R)=pR^pL-1;这样就可以让去查询异或和的操作的时间复杂度变为O(1),但整体的时间复杂度仍然为O(n^2),在面对大数据的时候仍然很乏力,有没有一种更好的优化方式可以使其时间复杂度降为O(n)或者O(logn)呢?

很明显,我们已经很从异或的性质上找到更多线索了,我们可以考虑从二进制的本质入手,不如将其每一位数都拆开,去统计1的个数和0的个数,只有1的个数为奇数的时候,这一位才能计算贡献,我们从上面的异或操作性质已经发现,我们要找到一段区间有贡献,实际上就是去算两个点上的异或,所以我们只需要保证其中一个点是1,一个点是0即可,那么我们就可以得到最终的结果,1的数量乘以0的数量*此位的贡献值即可得到最终的结果

这就是拆位法以及贡献思想

话不多说,来看样题

例题:

P9236 [蓝桥杯 2023 省 A] 异或和之和

 很明显是一个拆位思想的板题

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[100005];
int cnt1,cnt0;
int ans=0;
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		a[i]^=a[i-1];
	}
	for(int i=0;i<=20;i++)
	{
		cnt1=0;
		cnt0=1;
		for(int j=1;j<=n;j++)
		{
			if((a[j]>>i)&1)
			{
				cnt1++;
			}
			else
			{
				cnt0++;
			}
		}
		ans+=cnt1*cnt0*(1<<i);
	}
	cout<<ans;
	return 0;
}

E - Xor Sigma Problem

一个不算变式的变式,只是说左区间不能等于右区间,去掉单独的值的和就是最终结果,也是拆位板题

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[200005];
int s=0;
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		s+=a[i];
		a[i]^=a[i-1];
	}
	int ans=0;
	int cnt1,cnt0;
	for(int i=0;i<=30;i++)
	{
		cnt1=0;
		cnt0=1;
		for(int j=1;j<=n;j++)
		{
			if((a[j]>>i)&1)
			{
				cnt1++;
			}
			else
			{
				cnt0++;
			}
		}
		ans+=cnt1*cnt0*(1<<i);
	}
	cout<<ans-s;
	return 0;
}

C. Bitwise Balancing

 这题怎么说呢?算是没有用到异或性质的拆位思想问题吧,看到二进制问题就可以先去拆位处理了,我们去观察这个问题的每一位上是如何进行操作的,总共有三个数,共有八种情况,每一种情况都对应了a这一位上的数应该是多少,或者说是不存在的,然后拆位去看每一位上的操作即可

#include <bits/stdc++.h>
using namespace std;
#define int long long

int t, a, b, c, d;

void solve()
{
    cin >> b >> c >> d;
    a = 0;

    for (int i = 61; i >= 0; i--)
    {
        bool bitB = (b >> i) & 1;
        bool bitC = (c >> i) & 1;
        bool bitD = (d >> i) & 1;

        if (!bitB && !bitC && !bitD)
        {
            continue; 
        }
        else if (!bitB && !bitC && bitD)
        {
            a += (1LL << i); 
        }
        else if (bitB && !bitC && !bitD)
        {
            cout << -1 << "\n"; 
            return;
        }
        else if (bitB && !bitC && bitD)
        {
            continue; 
        }
        else if (!bitB && bitC && !bitD)
        {
            continue; 
        }
        else if (!bitB && bitC && bitD)
        {
            cout << -1 << "\n"; 
            return;
        }
        else if (bitB && bitC && !bitD)
        {
            a += (1LL << i); 
        }
        else if (bitB && bitC && bitD)
        {
            continue; 
        }
    }

    cout << a << "\n";
}

signed main()
{
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法闭关修炼百题计划(三)

减轻复习压力&#xff0c;一篇只有十题左右 1.反转链表II2.LRU缓存3.合并区间4.快速排序5.数字中的第k个最大元素6.归并排序7.每种字符至少取k个8.螺旋矩阵II9.旋转图像10.删除数组中重复的元素II 1.反转链表II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c…

洗车行软件系统有哪些 佳易王洗车店会员管理系统操作教程#洗车店会员软件试用版下载

一、前言 【试用版软件下载可点击本文章最下方官网卡片】 洗车行软件系统有哪些 佳易王洗车店会员管理系统操作教程#洗车店会员软件试用版下载 洗车管理软件应用是洗车业务的得力助手&#xff0c;实现会员管理及数据统计一体化&#xff0c;助力店铺高效、有序运营。 洗车项…

年薪96w!这才是运营人未来5年最好的就业方向!

运营人&#xff0c;终于被逼疯了&#xff01; 一个人一个部门&#xff01;文案、策划、拍摄、剪辑、运营、销售什么都做。企业利润为王&#xff0c;阅读量、粉丝量要是不能转化为业绩&#xff0c;注定拿不到高薪…… **活干了一大堆&#xff0c;一看工资8000块&#xff0c;**…

【黑马点评】 使用RabbitMQ实现消息队列——2.使用RabbitMQ监听秒杀下单

2 使用RabbitMQ实现消息队列 2.1 修改\hm-dianping\pom.xmlpom.xml文件 添加RabbitMQ的环境 <!-- RabbitMQ--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </depe…

从零开始,她如何为客户创建语义知识图谱?

在这篇文章中&#xff0c;Capgemini 的知识图谱负责人 Veronika Heimsbakk 分享了她为客户创建语义知识模型的方法。阅读本指南&#xff0c;了解她如何与客户合作&#xff0c;从头开始构建语义知识模型&#xff0c;并发现可以应用于您自己的语义建模项目的实践。 如何为客户构…

微积分-反函数6.5(指数增长和衰减)

在许多自然现象中&#xff0c;数量的增长或衰减与其大小成正比。例如&#xff0c;如果 y f ( t ) y f(t) yf(t) 表示在时间 t t t 时某种动物或细菌种群的个体数量&#xff0c;那么似乎可以合理地假设增长速率 f ’ ( t ) f’(t) f’(t) 与种群 f ( t ) f(t) f(t) 成正比…

在实际芯片里,电阻电容电感是怎么制作的

一、电阻 以前的半导体工艺中&#xff0c;使用图形化和掺杂后的硅制作电阻&#xff0c;电阻值的高低取决于长度、线宽、结深和掺杂浓度。现在一般都使用多晶硅制作IC芯片上的电阻&#xff0c;多晶硅的线宽高度、宽度和掺杂浓度决定了电阻值大小。 为什么用多晶硅做电阻呢&am…

【IO】多路转接Select

一、初识 select 系统提供 select 函数来实现多路复用输入/输出模型. select 系统调用是用来让我们的程序监视多个文件描述符的状态变化的;程序会停在 select 这里等待&#xff0c;直到被监视的文件描述符有一个或多个发生了状态改变; select 函数原型 C #include <sys/…

u盘拷贝文件管控如何实现?4个方法一举搞定,一文详解!100%纯干货,赶快码住!

数字化办公日益普及&#xff0c;U盘作为便携的数据存储设备&#xff0c;在文件传输和备份中扮演着重要角色。 然而&#xff0c;U盘的使用也带来了数据泄露的风险&#xff0c;如何有效管控U盘拷贝文件呢&#xff1f;u盘拷贝文件管控如何实现&#xff1f; 本文&#xff0c;将详细…

winforms基本操作-将datagridview内容保存为excel文件

title: winforms基本操作-将datagridview内容保存为excel文件 tags: [winforms, windows, datagridview] categories: [客户端, windows, winforms] 这里记录一下将winforms展示的datagridview&#xff0c;导出或保存为excel文件。 这里说一下环境、版本信息&#xff1a; win系…

在线教育系统开发:SpringBoot框架的实战应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

什么软件能指定usb端口禁用?五款电脑USB端口禁用软件!(热门分享)

什么软件能指定usb端口禁用&#xff1f; USB端口&#xff0c;作为电脑与外部设备连接的重要接口&#xff0c;其安全性日益受到企业的重视。 为了有效防止数据泄露和未经授权的设备接入&#xff0c;指定USB端口禁用成为了许多企业的迫切需求。 本文&#xff0c;将介绍五款热门…

京东云主机怎么用?使用京东云服务器建网站(图文教程)

京东云主机怎么用&#xff1f;非常简单&#xff0c;本文京东云服务器网jdyfwq.com使用以使用京东云服务器搭建WordPress博客网站为例&#xff0c;来详细说下京东云主机的使用方法。使用京东云服务器快速搭建WordPress网站教程&#xff0c;3分钟基于应用镜像一键搞定&#xff0c…

程序传入单片机的过程,以Avrdude为例分析

在市场上有各式各样的单片机&#xff0c;例如Arduino&#xff0c;51单片机&#xff0c;STM等。通常&#xff0c;我们都用其对应的IDE软件进行单片机的编程。这些软件既负责将程序代码转写成二进制代码&#xff0c;即机器语言&#xff0c;也负责将该二进制代码导入单片机。与此同…

YOLO11改进|卷积篇|引入空间通道重组卷积ScConv

目录 一、【SCConv】卷积1.1【SCConv】卷积介绍1.2【SCConv】核心代码 二、添加【SCConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SCConv】卷积 1.1【SCConv】卷积介绍 SCConv 模块提供了一种新的视角来看待CNNs的特征提取…

无人机企业必备运营合格证及甲级服务能力等级证书详解

无人机企业在运营过程中&#xff0c;需要取得一系列资质证书以确保其合法、安全、高效地开展业务。其中&#xff0c;运营合格证和甲级服务能力等级证书是两个重要的资质认证。以下是这两个证书的详细解析&#xff1a; 无人机企业运营合格证 无人机企业运营合格证是由国家相关…

10个令人惊叹的AI工具

AI 确实改变了游戏规则&#xff1b;它彻底改变了我们工作、创造和与技术互动的方式。虽然 ChatGPT、DALLE 和 Midjourney 等巨头占据了大部分头条新闻&#xff0c;但还有很多其他不为人知的 AI 工具和技术&#xff0c;大多数都同样令人惊叹。 以下是十种你可能没有听说过但绝对…

【AI知识点】正则化(Regularization)

正则化&#xff08;Regularization&#xff09; 是机器学习和统计学中的一种技术&#xff0c;用于防止模型过拟合。在训练模型时&#xff0c;模型可能会过度拟合训练数据&#xff0c;导致在新数据上的表现较差。正则化通过在优化过程中引入额外的约束或惩罚项&#xff0c;使模型…

python如何比较字符串

Python可使用cmp()方法来比较两个对象&#xff0c;相等返回 0 &#xff0c;前大于后&#xff0c;返回 1&#xff0c;小于返回 -1。 a "abc" b "abc" c "aba" d "abd" print cmp(a,b) print cmp(a,c) print cmp(a,d) //返回 0 1 …

pWnos1.0 靶机渗透 (Perl CGI 的反弹 shell 利用)

靶机介绍 来自 vulnhub 主机发现 ┌──(kali㉿kali)-[~/testPwnos1.0] …