补题链接:Here

算法涉及:位运算,DP

这道题想了很久但实在没想什么巧妙的解法,暴力的代码就不放,这里引用Kur1su 的思路

异或问题优先考虑二进制位,对于这个问题,我们需要考虑偶数长度的区间,那么先对 \([L, R]\) 做处理,因为如果 \(L,R\) 是奇数其实加一/减一没有区别。然后处理一下前缀异或和, 因为我们有性质 \(sum[l, r] = sum[r] \oplus sum[l - 1]\)。最后我们要找到哪些是有贡献的,我们考虑枚举右端点,如果当前点的异或是 1,那么需要在前面找异或为 0 的点才有贡献,反之如果当前点的异或是 0,那么要在前面找异或为 1 的点才有贡献,此外,奇数下标要找奇数下标,偶数下标要找偶数下标,才能构成偶数长度区间。

 所以我们可以用 \(dp[i][j]\) 维护前面符合条件的状态数,第一维表示当前位为 \(0/1,\) 第二维表示当前下标为 奇/偶的状态数,直接计算贡献即可。

using ll = long long;
const int N = 1e6 + 10, mod = 1e9 + 7; int a[N]; void solve() {
int n, l, r; cin >> n >> l >> r;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
a[i] ^= a[i - 1];
}
if (l & 1) l++; // 保证区间为偶数长度
if (r & 1) r--; // 保证区间为偶数长度
if (l > r) { cout << 0; return ;}
ll ans = 0;
for (int i = 0; i < 32; ++i) { // 二进制运算
ll p = (1ll << i);
ll dp[2][2] = {0};
ll num = 0;
for (int j = l; j <= n; ++j) {
dp[(a[j - l] >> i) & 1][(j - l) & 1]++;
num += dp[((a[j] >> i) & 1) ^ 1][j & 1];
num %= mod;
if (j >= r)dp[(a[j - r] >> i) & 1][(j - r) & 1]--;
}
ans += num * p % mod;
ans %= mod;
}
cout << ans;
}

【每日一题】36. 小AA的数列 (二进制DP)的更多相关文章

  1. 【ACM算法竞赛日常训练】DAY16【奇♂妙拆分】【区区区间间间】【小AA的数列】数学 | 位运算 | 前缀和

    DAY16共3题: 奇♂妙拆分(简单数学) 区区区间间间(单调栈) 小AA的数列(位运算dp) 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️ ...

  2. Wannafly挑战赛4 B,小AA的数列

    题意:求子区间异或和,要求区间长度在l到r之间,并且为偶数 题解:对于每一位算贡献,可以分奇偶来记录,计算的时候只加上奇偶性相同的就保证了为偶数,从大于l的点开始每次++,从大于r的点每次--,记录二 ...

  3. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  4. CISP/CISA 每日一题 18

    CISSP 每日一题(答)What is the purpose of an access review and audit? Checkto ensure that users do not hav ...

  5. CISP/CISA 每日一题 六

    CISA 每日一题(答) 采用电子数据交换 EDI 的好处: 1.较少的书面工作: 2.较少的信息交换错误: 3.改善了数据库到数据库.公司到公司的信息流: 4.没有多余的数据重新键入: 5.较少的通 ...

  6. 【剑指Offer】简单部分每日五题 - Day 1

    今天开始更新leetcode上<剑指Offer>的题解,先从简单难度开始.预计按下列顺序更新: 简单难度:每日5题 中等难度:每日3题 困难难度:每日1题 17 - 打印从1到最大的n位数 ...

  7. 【JavaScript】Leetcode每日一题-平方数之和

    [JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...

  8. [LeetCode每日一题]80. 删除有序数组中的重复项 II

    [LeetCode每日一题]80. 删除有序数组中的重复项 II 问题 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使用额外 ...

  9. 【python】Leetcode每日一题-最大数

    [python]Leetcode每日一题-最大数 [题目描述] 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数. 注意:输出结果可能非常大,所以你需要返回一个 ...

  10. 【python】Leetcode每日一题-丑数2

    [python]Leetcode每日一题-丑数2 [题目描述] 给你一个整数 n ,请你找出并返回第 n 个 丑数 . 丑数 就是只包含质因数 2.3 和/或 5 的正整数. 示例1: 输入:n = ...

随机推荐

  1. 思科4331 语音网关配置, cisco 4331 router 配置文件

    GW01#cisco_ROUTER01#cisco_ROUTER01#sh clocisco_ROUTER01#cisco_ROUTER01#cisco_ROUTER01#cisco_ROUTER01 ...

  2. 【Android】实现连接SQLite并尝试进行增删改查

  3. IDEA:自动生成方法注释并添加 @param 参数(Java+Kotlin)

    在用 Java 或 Kotlin 编写方法时建议编写完善的注释,包含每个参数的意义和返回的内容,下面介绍在 IDEA 中自动生成方法注释的技巧. 第二张图按照图片填写就好了 ③(注意是*不是/*) * ...

  4. AutoCAD ObjectARX 二次开发(2020版)--1,下载和部署开发环境--

    教程说明: 本教程为2019年10月开始编撰,使用CAD官方最新版本的软件和库.对旧版本仍有参考价值. 本教程中使用的各种软件版本为官方指定匹配版本. 本教程需要你拥有编程基础,对于普通编程常识不再敷 ...

  5. Go笔记(5)-String详解

    String详解 Go中的字符串是一个字节的切片,可以通过将其内容封装在双引号中来创建字符串,Go中的字符串Unicode兼容的,并且是UTF-8编码,字符串是一些字节的集合 (1)创建字符串 str ...

  6. [ARC156D] Xor Sum 5

    Problem Statement You are given a sequence of $N$ non-negative integers $A=(A_1,A_2,\dots,A_N)$ and ...

  7. 开发期间flask运行方式(1.x和2.x区别)

    1.x使用app.run(参数) 可以使用debug=True控制处于什么模式. app.run(host="127.0.0.1", port=5000, debug=True) ...

  8. 浅谈android的activity

    说道activity,大家可以说是熟悉的不能再熟悉,首先,先来个镇楼图, 个人觉得谷歌的这张图,比别的什么生命周期图都好;说下各个生命周期注意的: 1:onstart()时,activity可见; 2 ...

  9. Odoo Windows系统下部署方法

    Windows 系统下 Odoo 环境搭建流程 ① 安装python2.7 安装完成后 在命令行(cmd)输入python 如果不出现内部错误提示则表示环境配置成功    当出现错误时要设置环境变量 ...

  10. 将微服务注册到nacos中

    将微服务注册到nacos中将微服务注册到nacos中 首先修改pom文件,引入nacos依赖,名为spring-cloud-starter-nacos-discovery <dependency ...