首页 > 其他分享 >【W的AC企划 - 第五期】位运算 (Bitmasks)

【W的AC企划 - 第五期】位运算 (Bitmasks)

时间:2023-08-06 23:55:51浏览次数:48  
标签:AC Bitmasks 运算 val int 异或 企划 rm bit

往期浏览

第六期 - 树上分治

位运算

讲解

常见的位运算为:与、或、异或这三种。

运算 运算符、数学符号表示 解释
&and 同1出1
|or 有1出1
异或 ^、\(\bigoplus\)、xor 不同出1

这一块的内容比较散乱,以海量刷题为首要学习方向,同时需要收集一些常用结论。

常用结论

  1. 对于给定的 \(X\) 和序列 \([a_1,a_2,\dots,a_n]\) ,有:\({X=(X {\rm and} a_1) {\rm or} (X {\rm and} a_2) {\rm or} \dots {\rm or} (X {\rm and} a_n)}\) 。
    原理是 $ {\rm and} $ 意味着取交集,$ {\rm or} $ 意味着取子集。

题单

  1. 牛客小白月赛49C - 圣:考察了常用结论;
  2. abc147_d - Xor Sum 4:基础拆位操作;
  3. abc117_d - XXOR:基础拆位操作,与上一题几乎一致;
  4. arc098_b - Xor Sum 2:考察了异或的常用性质。

部分题解

题单第二题 abc147_d - Xor Sum 4

题意:给定长度为 \(N\) 的序列 \(A\) ,计算 \(\displaystyle \sum_{i=1}^{N-1}\sum_{j=i+1}^{N}(A_i \oplus A_j)\) 。

单纯位运算。拆位,对于每一位而言,只有 \(0\) 和 \(1\) 相互组合才能产生贡献,所以每一位的贡献即为 \(0\) 和 \(1\) 的乘积: \(cnt_0 \cdot cnt_1 \cdot 2^i\) 。

坑:别忘了取模。

signed main() {
    int n;
    cin >> n;
    
    vector<int> bit(60);
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        
        bitset<60> val = x;
        for (int j = 0; j < 60; j++) {
            bit[j] += val[j];
        }
    }
    
    Z ans;
    for (int i = 0; i < 60; i++) {
        ans += (Z)bit[i] * (Z)(n - bit[i]) * (Z)(1LL << i);
    }
    cout << ans << endl;
}

题单第三题 abc117_d - XXOR

题意:给定长度为 \(N\) 的序列 \(A\) ,在 \([1,K]\) 范围内取一个 \(X\) ,使得 \(\displaystyle \sum_{i=1}^{N}(A_i \oplus X)\) 最大。

单纯位运算。和上一题差不多的思路,略难一点。首先每一位的贡献还是 \(0\) 和 \(1\) 的乘积,从高位到低位遍历,判断 \(X\) 的这一位为 \(0\) 合适还是为 \(1\) 合适(即判断 \(cnt_1\) 是否大于 \(cnt_0\) );若为 \(1\) 合适,判断是否会超过 \(K\) 的限制。

坑:数据比较弱,一开始多加了个排序的贪心,结果就WA了一个点。

signed main() {
    int n, k;
    cin >> n >> k;
    
    vector<int> bit(40);
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        
        bitset<40> val = x;
        for (int j = 0; j < 40; j++) {
            bit[j] += val[j];
        }
    }
    
    int X = 0, ans = 0;
    for (int i = 39; i >= 0; i--) {
        if (n - bit[i] > bit[i] && X + (1LL << i) <= k) {
            X += (1LL << i);
            ans += (n - bit[i]) * (1LL << i);
        } else {
            ans += bit[i] * (1LL << i);
        }
    }
    cout << ans << endl;
}

题单第四题 arc098_b - Xor Sum 2

题意:给定长度为 \(N\) 的序列 \(A\) ,求解区间 \([l,r]\) 的数量,使得 \(a_l,a_{l+1},\dots a_{r-1},a_r\) 的异或和等于和。

位运算+尺取+暴力,也有双指针、二分解。由于位运算满足 \(x\oplus x\oplus x=0\) ,符合尺取性质,所以直接暴力即可。

如果用二分或者双指针解,可能需要用到:如果两个元素的某一位均为 \(1\) ,那么其异或和一定小于和,所以我们需要寻找这样的一个区间,对于每一位均满足这一位为 \(1\) 的元素数量不超过一个。

signed main() {
    int n;
    cin >> n;
    
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    
    int ans = 0, val = 0;
    for (int l = 1, r = 0; l <= n; l++) {
        while (r + 1 <= n && (val ^ a[r + 1]) == val + a[r + 1]) {
            r++;
            val ^= a[r];
        }
        ans += r - l + 1;
        val ^= a[l];
    }
    cout << ans << endl;
}

标签:AC,Bitmasks,运算,val,int,异或,企划,rm,bit
From: https://www.cnblogs.com/WIDA/p/17547678.html

相关文章

  • 【W的AC企划 - 第六期】树上分治
    往期浏览树上分治点分治讲解每次选取树的重心进行递归分治,中阶算法,大部分模板不需要理解,但是每一题都需要对维护函数进行修改。复杂度\(\mathcalO(N\logN)\)。个人封装由于需要进行一定程度的修改,不符合结构体封装的原则,故没有使用结构体。introot=0,MaxTree=1e1......
  • nacos系列:spring cloud使用nacos实现配置管理和服务发现
    目录版本说明创建项目版本说明IDEA:2021.3Maven:3.6.3Jdk:17Spring-Boot:2.6.13Spring-Cloud:2021.0.5Spring-Cloud-Alibaba:2021.0.5.0创建项目1、选择SpringInitalizr2、选择需要安装的版本和依赖3、修改pom文件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns......
  • 华为datacom-HCIA学习之路
    华为datacom-HCIA华为datacom-HCIA11.第四弹51.1.OSPF认证51.1.1.基于接口认证51.1.1.1.接口认证更优先61.1.1.2.[R2]interfaceg0/0/161.1.1.3.[R2-g0/0/1]ospfauthentication-modesimplehuawei61.1.1.3.1.明文认证61.1.1.4.[R2-g0/0/1]ospfauthentication-mo......
  • traceroute nslookup dig用法
    traceroutenslookupdig用法1,traceroute路由追踪格式:tracerouteIP地址[root@localhost~]#traceroute192.168.1.200tracerouteto192.168.1.200(192.168.1.200),30hopsmax,60bytepackets1 192.168.1.200(192.168.1.200) 0.417ms!X 0.293ms!X 0.178......
  • 【Nacos篇】Nacos基本操作及配置
    官方文档:https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html前置条件:SpringCloud脚手架单机模式下的Nacos控制台:<dependencies><!--Registry注册中心相关--><dependency><groupId>com.alibaba.cloud</group......
  • nacos系列:简介和安装
    目录版本选择安装windows安装centos安装mysql方式存储官网:https://nacos.iogithub:https://github.com/alibaba/nacos或https://kgithub.com/nacos-group/nacos-examplesgitee:https://gitee.com/mirrors/Nacosnacos示例:https://kgithub.com/nacos-group/nacos-examples下载......
  • Oracle 11g Windows迁移至linux方案
    1.前言根据迁移规范要求,特编写xxx数据库迁移至linux环境操作方案。2.方案描述2.1环境描述源库数据量为20T,操作系统为WindowsServer200864bit,数据库版本为oracle11.2.0.1,目标库操作系统为Linuxredhat7.6,数据库版本为11.2.0.4。详细信息如下:源端数据库:业务系统  数据库 I......
  • 为react项目添加开发/提交规范(前端工程化、eslint、prettier、husky、commitlint、sty
    因历史遗留原因,接手的项目没有代码提醒/格式化,包括eslint、pretttier,也没有commit提交校验,如husky、commitlint、stylelint,与其期待自己或者同事的代码写得完美无缺,不如通过一些工具来进行规范和约束。eslinteslint是一个代码校验工具,用来规范项目代码风格。初始化通过n......
  • 【腾讯云Cloud Studio实战训练营】React 快速构建点餐页面
    前言:CloudStudio是一个在线的云集成开发环境(IDE),可以让开发人员在浏览器中轻松地开发、测试、调试和部署应用程序。它提供了基于云的计算资源和工具,例如代码编辑器、编译器、调试器、版本控制系统和项目管理工具等,使开发人员可以在任何地点使用任何设备进行开发,而不需要在本地安装......
  • 使用Activate和Select方法选中单元格的异同
    尽管使用Activate方法和Select方法都能选中指定的单元格区域,但这两种方法并不完全相同。例如,选中A1:F5单元格区域后,再分别用两种方法选中B5单元格,我们可得: 选中单元格区域后,再使用Activate方法激活该区域里的一个单元格,该区域依然呈选中状态,只改变活动单元格为激活的单元格。如......