[eJOI2019]异或橙子 题解
简要题面
维护一个数据结构,支持单点修改,询问区间所有子区间的异或和的异或和 .
做法
首先,题目要求所有子区间的异或和的异或和,发现每个元素异或两次就变成 \(0\),所以考虑统计每个元素出现的次数
把区间覆盖元素改成由元素枚举区间,若区间为 \([l,r]\),元素为 \(a_i\),那么能覆盖到它的就有 \((l-i+1)(r-i+1)\) 个区间(枚举左右端点),即它出现了 \((l-i+1)(r-i+1)\) 次
不难发现 \(i\) 有贡献当且仅当 \((l-i+1)(r-i+1)\) 为奇数,即 \(l-i+1,r-i+1\) 均为奇数 . 易见 \(l,r,i\) 奇偶性相同 .
维护两个树状数组作奇数位和偶数位即可维护(因为 \(i\) 和 \(l,r\) 奇偶性相同)
比较方便的办法是令没有的位赋为 \(0\)
注意单点修改 \(a_i\gets k\) 等价于 \(a_i\gets a_i\oplus(a_i\oplus k)\),其中 \(\oplus\) 是异或 .
代码
using namespace std;
typedef long long ll;
const int N=2e5+500;
int n,m,arr[N];
template<typename T>
struct BIT
{
private:
T s[N];
inline T lowbit(T x){return x&-x;}
public:
inline T query(T x)
{
T ans=0;
while (x){ans^=s[x]; x-=lowbit(x);}
return ans;
}
inline T query(T l,T r){return query(r)^query(l-1);}
inline void change(int x,T now){if (x) while (x<=n){s[x]^=now; x+=lowbit(x);}}
};
BIT<ll> A,B;
// A 偶数
// B 奇数
void change(int idx,int a)
{
if (idx&1) B.change(idx,a^arr[idx]);
else A.change(idx,a^arr[idx]);
}
ll query(int l,int r)
{
if ((l-r)&1) return 0;
if (l&1) return B.query(l,r);
else return A.query(l,r);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1,x;i<=n;i++) scanf("%d",&x),change(i,x),arr[i]=x;
int opt,x,y;
while (m--)
{
scanf("%d%d%d",&opt,&x,&y);
if (opt==1) change(x,y),arr[x]=y;
else printf("%lld\n",query(x,y));
}
return 0;
}
[eJOI2019]异或橙子 题解的更多相关文章
- 洛谷 P6225 [eJOI2019]异或橙子 (树状数组)
题意:有\(n\)个数,起始值均为\(0\),进行\(q\)次操作,每次输入三个数,如果第一个数为\(1\),则将第\(i\)个数修改为\(j\),如果为\(2\),则求区间\([l,r]\)内的所有 ...
- 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解
https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...
- BZOJ3261:最大异或和——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3261 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.A x:添加 ...
- BZOJ5301:[CQOI2018]异或序列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5301 https://www.luogu.org/problemnew/show/P4462 已知 ...
- 2016ACM-ICPC Qingdao Online青岛网络赛题解
TonyFang+Sps+我=5/12 滚了个大粗 2016年9月21日16:42:36 10题完工辣 01 题意:求形同的数中大于n的最小值 题解:预处理所有的(5194个),在这里面二分 #inc ...
- HDU 5650 异或
so easy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- AcWing:143. 最大异或对(01字典树 + 位运算 + 异或性质)
在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N. 第二行输入N个整数A1A1-ANAN. 输出格式 输出一 ...
- BZOJ3687:bitset STL
[bzoj3687][FJ2014集训]简单题 2014年9月14日1,8212 [题目描述]小呆开始研究集合论了,他提出了关于一个数集四个问题:1. 子集的异或和的算术和.2. 子集的异或和的异或和 ...
- Codeforces Round #365 (Div. 2) D 树状数组+离线处理
D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...
随机推荐
- 购物车+ATM项目(图形化)
项目下载 项目目录结构 运行效果 seetings.py import logging import logging.config # 定义日志输出格式 开始 import os standard_f ...
- 分布式下Session一致性架构举例
一.问题及方案 见这篇文章:分布式下Session一致性问题 二.分布式环境搭建: 系统环境 [root@centos7 ~]# cat /etc/redhat-release CentOS Linu ...
- 好客租房27-state的基本使用
5.1state的基本使用 状态:数据 是组件内部的私有数据 只能再组件内部使用 state的值是对象 表示一个组件中可以有多个数据 获取数据 this.state //导入react imp ...
- 125_Power BI 中 DAX 的性能测试
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 最近在看DAX"圣经"第二版<The Definitive Guide to DAX ...
- 随笔总结:8086CPU的栈顶超界问题
我们学习编程都知道栈的超界限问题是非常严重的问题,他可能会覆盖掉其他数据,并且我们不知道这个数据是我们自己保存的用于其他用途的数据还是系统的数据,这样常常容易引发一连串的问题. 在学习汇编的时候,我们 ...
- C++从静态类型到单例模式
目录 1. 概述 2. 详论 2.1. 静态类型 2.1.1. 静态方法成员 2.1.2. 静态数据成员 2.2. 单例模式 2.2.1. 实现 2.2.2. 问题 3. 参考 1. 概述 很多的知识 ...
- C++:接送旅客
接送旅客 时间限制:1.00sec 内存限制:128MB 题目描述: 现在,你是一家酒店的员工,你需要帮助这家酒店的旅客运送行李离开酒店.现在,你送顶层开始往下移动,为了减少电梯移动的距 ...
- SmartIDE v0.1.18 已经发布 - 助力阿里国产IDE OpenSumi 插件安装提速10倍、Dapr和Jupyter支持、CLI k8s支持
SmartIDE v0.1.18 (cli build 3538) 已经发布,在过去的Sprint 18中,我们集中精力推进对 k8s 远程工作区 的支持,同时继续扩展SmartIDE对不同技术栈的支 ...
- Cent OS8.0 及以上版本安装禅道教程
Cent OS8系统下安装禅道需要搭建环境如下:httpd ,mariadb , php7.2 再运行禅道 一,环境说明: 运行环境推荐使用 Apache + PHP(7.0/7.1/7.2版本) + ...
- MCDF实验2
目录 接口的使用 仿真的结束 类的例化和类的成员 接口的使用 问题1.1:可以看到之前的实验 channel initiator 发送的数据例如 valid 和 data 与时钟 clk 均在同 ...