【算法新题】TJOI2017-异或和

题目内容

原题链接

给定一个长度为 n n n 的整数数组 a a a ,问所有子数组和的异或和是多少。

数据范围

1 ≤ n ≤ 1 0 5 1\leq n\leq 10^5 1n105
∑ a i ≤ 1 0 6 \sum a_i\leq 10^6 ai106

题解

基本思路

本题是 ARC092D - Two Sequences 的同类型题,ARC092D 中是两个数和的异或和,而本题是两个数差的异或和。

子数组的和,自然会想到前缀和,考虑 p r e i pre_i prei p r e j pre_j prej j < i j<i j<i ,那么子数组 a j + 1 , a j + 2 , ⋯ , a i a_{j+1},a_{j+2},\cdots,a_i aj+1,aj+2,,ai 的和为 p r e i − p r e j pre_i-pre_j preiprej

考虑减法的特性,先考虑低位,低位不够了会向高位借位。

考虑和的第 k k k 位, x = p r e i m o d 2 k + 1 , y = p r e j m o d 2 k + 1 x=pre_i\bmod 2^{k+1},y=pre_j\bmod 2^{k+1} x=preimod2k+1,y=prejmod2k+1

  • x ≥ y x\geq y xy ,考虑 x − y x-y xy 的第 k k k 位是否为 1 1 1
  • x < y x<y x<y ,因为 p r e i ≥ p r e j pre_i\geq pre_j preiprej ,所以可以将 2 k + 1 2^{k+1} 2k+1 添加到 x x x
    判断 x + 2 k + 1 − y x+2^{k+1}-y x+2k+1y 的第 k k k 位是否为 1 1 1

这样的做法需要枚举 i i i j j j ,时间复杂度是 O ( n 2 ) O(n^2) O(n2) ,考虑如何优化。

优化

我们需要枚举 i i i 的同时,找到所有满足条件的 j j j

k = 2 k=2 k=2 为例,区间和为 [ 010 0 2 , 011 1 2 ] [0100_2,0111_2] [01002,01112] 以及 [ 110 0 2 , 111 1 2 ] [1100_2,1111_2] [11002,11112] 的区间是满足条件的。

  • [ 010 0 2 , 011 1 2 ] [0100_2,0111_2] [01002,01112] 对应的 p r e j pre_j prej 范围是 [ x − 011 1 2 , x − 010 0 2 ] [x-0111_2,x-0100_2] [x01112,x01002]
  • [ 110 0 2 , 111 1 2 ] [1100_2,1111_2] [11002,11112] 对应的 p r e j pre_j prej 范围是 [ x − 111 1 2 , x − 110 0 2 ] [x-1111_2,x-1100_2] [x11112,x11002]

显然这些区间都不能为负数,所以我们需要额外判断,对于 p r e i ≥ 2 k + 1 pre_i\geq 2^{k+1} prei2k+1 x x x ,就给他们加上 2 k + 1 2^{k+1} 2k+1

用树状数组来维护区间内数的个数。

时间复杂度: O ( 20 n × log ⁡ 1 0 6 ) O(20n\times \log 10^6) O(20n×log106) ,其中 20 20 20 是值域对应的二进制数的最大位数, log ⁡ 1 0 6 \log 10^6 log106 是树状数组单次操作的复杂度。

代码

#include <bits/stdc++.h>
using namespace std;const int N = 100010;
const int MAX = 1000010;
const int BIT = 20;int a[N];
int pre[N];
int tr[MAX];void update(int p, int x, int limit) {p += 1;while (p <= limit) {tr[p] += x;p += p & -p;}
}int query(int p) {p += 1;int res = 0;while (p > 0) {res += tr[p];p -= p & -p;}return res;
};int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;for (int i = 0; i < n; ++i) {cin >> a[i];pre[i + 1] = pre[i] + a[i];}int ans = 0;for (int k = 0; k < BIT; ++k) {int mod = 1 << (k + 1);int mask = mod - 1;int limit = min(MAX - 1, mod);update(0, 1, limit);int cnt = 0;for (int i = 1; i <= n; ++i) {int cur = pre[i] & mask;if (pre[i] >= mod) {cur += mod;}// L 是最小值,R 是最大值// cur 需要大于等于最小值,int L = 1 << k, R = (1 << (k + 1)) - 1;if (cur >= L) {int maxv = cur - L;int minv = max(0, cur - R);cnt ^= query(maxv) - query(minv - 1) & 1;L = 3 << k, R = (1 << (k + 2)) - 1;if (cur >= L) {maxv = cur - L;minv = max(0, cur - R);cnt ^= query(maxv) - query(minv - 1) & 1;}}update(pre[i] & mask, 1, limit);}if (cnt) ans |= 1 << k;memset(tr, 0, sizeof(int) * (limit + 1));}cout << ans << "\n";return 0;
}

一样的题,更大的数据范围

灵茶八题 - 子数组 +w^

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

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

相关文章

深拷贝与浅拷贝

首先深拷贝与浅拷贝 只针对Object 和Array这样的引用数据类型 所以基本数据类型不用考虑了 等号赋值 基本数据类型 对于基本数据类型&#xff0c;就会创建一个新的变量&#xff0c;并将原变量的值复制给新变量。 这是基于变量是存储在栈内存中的特点。简单来说&#xff0c;等…

分享三个国内可用的免费GPT-AI网站

AIchatOS国内的不需要梯子 AItianhu同上 国内百度的文心一言一样非常优秀

订阅《复现SCI文章系列教程》

写在前面 《小杜生信笔记》准备开启新的订阅专栏**《复现期刊文章系列教程》&#xff0c;本专栏小杜会寻找一些自己感兴趣的文章进行复现&#xff08;不说百分之百的复现&#xff0c;但是也会百分之八十进行复现&#xff09;。本期刊的教程代码会全部进行公开&#xff08;通过订…

数据结构:顺序表

SeqList.h #pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h>typedef int SLDataType; //#define NULL 0typedef struct SeqList {SLDataType* a;int size;//顺序表中存储的有效元素的个数int capacity;//空间的大小 }SL;void SLInit(…

jupyterlab开发环境最佳构建方式

文章目录 背景jupyterlab环境构建运行虚拟环境构建以及kernel映射验证总结 背景 从jupyter notebook切换到了jupyter lab. 这里记录一下本地环境的最佳构建方式. jupyter lab 安装在jupyterlab-local的anaconda 虚拟环境中.建立多个其他虚拟环境安装各种python包实现环境隔离,…

一文了解亚马逊云科技适用于 Amazon Lightsail 的托管数据库

Amazon Lightsail 是亚马逊云科技提供的一种易上手使用、月度价格经济实惠&#xff0c;并包括了计算实例、容器、存储、数据库的虚拟专用服务器。在创建时可以进行业务蓝图选择&#xff0c;可选择包含多种操作系统&#xff08;Linux/Windows 等&#xff09;或操作系统加上典型应…

数智化基建:HOOPS技术在基建中可行性作用分析

自改革开放以来&#xff0c;我们一直致力于基础设施建设的发展。这个过程中&#xff0c;基础设施已经取得了显著的成就&#xff0c;从高速公路到高铁&#xff0c;再到大型机场和港口。然而&#xff0c;如今基建行业正面临一个新的挑战&#xff1a;数智化转型。在这个转型的过程…

Dockerfile 修改文件角色容量变大

需求&#xff1a; 在使用dockerfile 编写镜像的时候copy 了文件&#xff0c;然后又修改了文件的 owner 发现镜像变大了期望不要变大 进程&#xff1a; dockerfile 来创建的镜像是根据命令一行一行叠加的大小于是这边将copy 的命令改成 run 并且将权限的修改也放在同一行not …

Python并发执行(未完待续)

python的多进程执行 多进程实现方式一 from multiprocessing import Processdef func1(name):print("测试 %s 多进程" %name)if __name__ "__main__":process_list []for i in range(5):p Process(target func1, args (Python, ))p.start()process_…

【高阶数据结构】红黑树(C++实现)

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C进阶 ⭐代码仓库&#xff1a;C进阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

Qt中事件的处理

鼠标事件 鼠标事件常用以下几个接口来处理 // 鼠标按下 void mousePressEvent(QMouseEvent *event); // 鼠标释放 void mouseReleaseEvent(QMouseEvent *event); // 鼠标双击 void mouseDoubleClickEvent(QMouseEvent *event)

Flink状态

8.1 Flink中的状态 8.1.1 概述 状态的分类 1&#xff09;托管状态&#xff08;Managed State&#xff09;和原始状态&#xff08;Raw State&#xff09; Flink的状态有两种&#xff1a;托管状态&#xff08;Managed State&#xff09;和原始状态&#xff08;Raw State&#…

Zookeeper-集群介绍与核心理论

Zookeeper集群 4.Zookeeper集群4.1) 介绍4.2) 核心理论 4.Zookeeper集群 4.1) 介绍 Leader选举&#xff1a; Serverid&#xff1a;服务器ID。比如有三台服务器&#xff0c;编号分别是1,2,3。编号越大在选择算法中的权重越大。Zxid&#xff1a;数据ID。服务器中存放的最大数据…

Java面试题整理面向对象

一、面向对象的特性有哪些方面 1、抽象&#xff1a;抽象是将一类对象的共同特征总结出来构造成类的过程&#xff0c;包括数据抽象和行为抽象两方面。抽象只关注抽象对象有哪些属性和行为&#xff0c;并不关心这些行为的细节是什么。 2、封装&#xff1a;通常认为封装是把数据和…

idea中导入eclipse项目后没显示src文件

因为没有导入modules 选择import module 选择整个项目 选择eclipse 一直下一步就行 这样就出来了

【挑战开发100个项目 | 1. C语言学生管理系统】

本项目是一个简易的学生信息管理系统&#xff0c;用户可以通过命令行界面完成学生信息的增加、删除、修改、查询、排序和列表展示等功能。数据以txt文件形式存储&#xff0c;实现了数据持久化。项目采用模块化设计&#xff0c;具有较好的可读性和扩展性。适用于初学者学习c语言…

JDK21新特性 有序集合

有序集合 描述常用有序集合体系LinkedHashMapLinkedHashSetLinkedBlockingDequeArrayDeque 三级目录 描述 Java集合体系中&#xff0c;原来就有有序集合实现&#xff0c;但是没有规范支持有序操作的接口。 JDK21 新增了两个接口 SequencedCollection&#xff0c;SequencedMa…

知识图谱:信息抽取简易流程

目录 一、标注训练数据 二、训练数据模型 三、实现NER 一、标注训练数据 使用工具:Brat ## BRAT安装 0、安装条件 (1)运行于Linux系统 (2)brat(v1.3p1)仅支持python2版本运行使用,否则会报错 File "standalone.py", line 257except SystemExit, sts:^Syn…

HTML+VUE+element-ui通过点击不同按钮展现不同页面

完整源码可以私聊我&#xff0c;需要一点点费用~ 页面展示 方案一 方案二 代码解释 方案一&#xff1a;使用v-show 这种方案只适合有两种页面 现在form表单中设置好要展现的页面名&#xff08;此处的url没有作用不用管&#xff09; 通过一个两个for循环分别将form表单填入…

PWN环境搭建

虚拟机Ubuntu安装 工具&#xff1a;Vmware 16 以及 Ubuntu 18或20 来源&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 虚拟机安装流程 安装很简单&#xff0c;按照提示一步步来即可 处理器可以多给一些&#xff0c;我给了8个&#xff0c;内核数量不…