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

拆位的引入

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

我们该如何去处理,首先肯定是会想到暴力的思路,第一层循环遍历左端点,第二层循环去遍历右端点,第三层循环去遍历区间内所有值的异或和,然后累加,时间复杂度为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 longint 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.xdnf.cn/news/1555757.html

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

相关文章

SpringBoot在线教育平台:设计与实现的深度解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

654、最大二叉树

1、题目描述 . - 力扣&#xff08;LeetCode&#xff09; 其实就是给定了一个所谓"最大二叉树"的规则&#xff0c;让我们去构建二叉树。 以 nums [3,2,1,6,0,5] 为例&#xff0c;规则如下&#xff1a; (1)找出其中的最大值6将其作为根节点&#xff0c;6前面的是左子…

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

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

C++ 算法学习——7.4.1 优化算法——双指针

双指针法&#xff08;Two Pointers&#xff09;是一种常用的算法技巧&#xff0c;通常用于解决数组或链表中的问题。这种技巧通过维护两个指针&#xff0c;通常分别指向数组或链表的不同位置&#xff0c;来协同解决问题。双指针法一般有两种类型&#xff1a;快慢指针和左右指针…

什么是transformer大模型,答案就在这里

Transformer大模型是一种在自然语言处理&#xff08;NLP&#xff09;领域中广泛使用的模型&#xff0c;其详细数据与分析可以从以下几个方面进行阐述&#xff1a; 1. 模型架构 Transformer模型本质上是一个Encoder-Decoder架构。编码组件由多层编码器&#xff08;Encoder&…

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第3关---浦语提示词工程实践

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV1cU411S7iV/ 课程文档&#xff1a; https://github.com/InternLM/Tutorial/tree/camp3/docs/L1/Prompt 关…

还在“卷”长度?长文本模型真的基于上下文进行回复吗?

近年来&#xff0c;随着长文本模型&#xff08;Long-context Model, LCM&#xff09;技术的突飞猛进&#xff0c;处理长上下文的能力已成为各大语言模型&#xff08;Large Language Model, LLM&#xff09;的核心竞争力&#xff0c;也是各大技术厂商争夺的焦点。截至2023年12月…

RAG再总结之如何使大模型更好使用外部数据:四个不同层级及查询-文档对齐策略

我们来看看RAG进展。《Retrieval Augmented Generation (RAG) and Beyond: A Comprehensive Survey on How to Make your LLMs use External Data More Wisely》(https://arxiv.org/abs/2409.14924)&#xff0c;主要讨论了如何使大型语言模型&#xff08;LLMs&#xff09;更明智…

Redis中BitMap实现签到与统计连续签到功能

服务层代码 //签到Overridepublic Result sign() {//1.获取当前登录的用户Long userId UserHolder.getUser().getId();//获取日期LocalDateTime now LocalDateTime.now();//拼接keyString keySuffix now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String …

实例分割、语义分割和 SAM(Segment Anything Model)

实例分割、语义分割和 SAM&#xff08;Segment Anything Model&#xff09; 都是图像处理中的重要技术&#xff0c;它们的目标是通过分割图像中的不同对象或区域来帮助识别和分析图像&#xff0c;但它们的工作方式和适用场景各有不同。 1. 语义分割&#xff08;Semantic Segme…

一款基于 Java 的可视化 HTTP API 接口快速开发框架,干掉 CRUD,效率爆炸(带私活源码)

平常我们经常需要编写 API&#xff0c;但其实常常只是一些简单的增删改查&#xff0c;写这些代码非常枯燥无趣。 今天给大家带来的是一款基于 Java 的可视化 HTTP API 接口快速开发框架&#xff0c;通过 UI 界面编写接口&#xff0c;无需定义 Controller、Service、Dao 等 Jav…

Bolt.new:终极自动化编程工具

兄弟们&#xff0c;终极写代码工具来了—— Bolt.new&#xff01;全方位的编程支持&#xff1a; StackBlitz 推出了 Bolt․new&#xff0c;这是一款结合了 AI 与 WebContainers 技术的强大开发平台&#xff0c;允许用户快速搭建并开发各种类型的全栈应用。 它的主要特点是无需…

内网靶场 | 渗透攻击红队内网域渗透靶场-1(Metasploit)零基础入门到精通,收藏这一篇就够了

“ 和昨天的文章同一套靶场&#xff0c;这次主要使用的是Kali Linux以及Metasploit来打靶场&#xff0c;熟悉一下MSF在内网渗透中的使用&#xff0c;仅供学习参考&#xff0c;大佬勿喷。本期文章靶场来自公众号&#xff1a;渗透攻击红队。” 靶场下载地址&#xff1a;https://…

展锐平台WIFI国家码信道总结

展锐平台WIFI国家码信道总结 1.下载wireless-regdb wireless-regdb是一个开源的工程,编译它会生成regulatory.bin文件,这实际上是一个加密后的数据库,它记录各个国家可用的无线频段。 可从下面的网站上下载最新的regdb库: https://git.kernel.org/pub/scm/linux/kernel…

【无人水面艇路径跟随控制2】(C++)USV代码阅读: SetOfLos 类的从路径点和里程计信息中计算期望航向

【无人水面艇路径跟随控制2】&#xff08;C&#xff09;USV代码阅读&#xff1a; SetOfLos 类的从路径点和里程计信息中计算期望航向 写在最前面set_of_los.cpp小结详细解释头文件包含命名空间构造函数和析构函数设置参数函数获取航向函数 &#x1f308;你好呀&#xff01;我是…

热门:AI变现,看看谁在默默赚大钱?

在这个愈发依赖AI的时代&#xff0c;找到属于自己的盈利方式愈发重要。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 总的来说&#xff0c;利用AI进行盈利的方式主要有三种&#xff1a;技术型、流量型和内容型。 每种方式都根植于AI的特性&#xff0c;但同时也需要特定…

重庆数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂

重庆作为西南地区的重要工业基地&#xff0c;正积极探索和实践数字孪生、工业互联网及可视化技术在智能制造领域的深度融合&#xff0c;致力于打造新型工业化智能制造工厂&#xff0c;为制造业的高质量发展注入强劲动力。 在重庆的智能制造工厂中&#xff0c;数字孪生技术被广…

Pytorch基础:网络层

文章目录 1.卷积层-Convolution Layers1.1 1d/2d/3d卷积1.2卷积--nn.Conv2d1.3转置卷积(实现上采样) 2.池化层3.线性层—Linear Layer4.激活函数层—Activate Layer 1.卷积层-Convolution Layers 卷积运算:卷积运算在输入信号(图像)上滑动,相应位置上进行乘加. 卷积核:又称过滤…

感知机及其实践

说明 感知机是SVM(support vector machine,支持向量机)的基础&#xff0c;更是机器学习的基础。本文的目的在于把感知机的相关概念捋清楚&#xff0c;并基于感知机做最基本的线性可分的二分类实践。 有关机器学习的一些基础概念&#xff0c;读者可以参考本专栏的第一篇博文[4]&…

AI大模型有哪些,收藏起来防踩坑

大模型是指具有数千万甚至数亿参数的深度学习模型&#xff0c;通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能&#xff0c;能够处理更加复杂的任务和数据。以下是对大模型的详细数据与分析&#xff1…