简要题面

维护一个数据结构,支持单点修改,询问区间所有子区间的异或和的异或和 .

做法

首先,题目要求所有子区间的异或和的异或和,发现每个元素异或两次就变成 \(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]异或橙子 题解的更多相关文章

  1. 洛谷 P6225 [eJOI2019]异或橙子 (树状数组)

    题意:有\(n\)个数,起始值均为\(0\),进行\(q\)次操作,每次输入三个数,如果第一个数为\(1\),则将第\(i\)个数修改为\(j\),如果为\(2\),则求区间\([l,r]\)内的所有 ...

  2. 洛谷P5283 & LOJ3048:[十二省联考2019]异或粽子——题解

    https://www.luogu.org/problemnew/show/P5283 https://loj.ac/problem/3048 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子 ...

  3. BZOJ3261:最大异或和——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3261 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.A x:添加 ...

  4. BZOJ5301:[CQOI2018]异或序列——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5301 https://www.luogu.org/problemnew/show/P4462 已知 ...

  5. 2016ACM-ICPC Qingdao Online青岛网络赛题解

    TonyFang+Sps+我=5/12 滚了个大粗 2016年9月21日16:42:36 10题完工辣 01 题意:求形同的数中大于n的最小值 题解:预处理所有的(5194个),在这里面二分 #inc ...

  6. HDU 5650 异或

    so easy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. AcWing:143. 最大异或对(01字典树 + 位运算 + 异或性质)

    在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N. 第二行输入N个整数A1A1-ANAN. 输出格式 输出一 ...

  8. BZOJ3687:bitset STL

    [bzoj3687][FJ2014集训]简单题 2014年9月14日1,8212 [题目描述]小呆开始研究集合论了,他提出了关于一个数集四个问题:1. 子集的异或和的算术和.2. 子集的异或和的异或和 ...

  9. 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 ...

随机推荐

  1. 用简单的 Node.js 后台程序浅析 HTTP 请求与响应

    用简单的 Node.js 后台程序浅析 HTTP 请求与响应 本文写于 2020 年 1 月 18 日 我们来看两种方式发送 HTTP 请求,一种呢,是命令行的 curl 命令:一种呢是直接在浏览器的 ...

  2. nodejs + typescript + koa + eslint + typescript eslint + prettier + webstorm

    ESLint 安装 yarn add -D eslint 生成配置文件 yarn eslint --init cli 选项 How would you like to use ESLint? To c ...

  3. 面试突击49:说一下 JUC 中的 Exchange 交换器?

    Exchange(交换器)顾名思义,它是用来实现两个线程间的数据交换的,它诞生于 JDK 1.5,它有两个核心方法: exchange(V x):等待另一个线程到达此交换点,然后将对象传输给另一个线程 ...

  4. c# SendInput模拟输入字符和按键

    介绍: 该程序本意是为了在彩六里打中文用的,现整理出来供大家复制粘贴.(源程序已开源至GitHub - 彩六中文输入) 主要使用SendInput函数,与c语言中用法一致.(部分代码来自网络) 命名空 ...

  5. 关于Linux添加字体

    安装字体命令 yum -y install fontconfig 查看已经安装的字体 fc-list # 查看已经已经安装的中文字体 fc-list :lang=zh 在字体目录下创建新的目录或者使用 ...

  6. Spring Cloud OpenFeign 的 5 个优化小技巧!

    OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件.它的出现就是为了替代已经进入停更维护状态的 Feign(Netflix Feign),同时它也是 Spring 官方的 ...

  7. 为什么Java有了synchronized之后还造了Lock锁这个轮子?

    众所周知,synchronized和Lock锁是java并发变成中两大利器,可以用来解决线程安全的问题.但是为什么Java有了synchronized之后还是提供了Lock接口这个api,难道仅仅只是 ...

  8. 缓存&PWA实践

    缓存&PWA 实践 一.背景 从上一篇<前端动画实现与原理分析>,我们从 Performance 进行动画的性能分析,并根据 Performance 分析来优化动画.但,前端不仅仅 ...

  9. 【HEOI2014】大工程<虚树>

    虚树 我们每天都用心思索着,这究竟是为了什么呢?我想我也不知道,只是觉得如果人不思考问题就很无聊. 我觉得虚树不是什么数据结构,就是一种技巧或者工具.它能把树中\(k\)个关键点以\(O(klogk) ...

  10. 前端3JS1

    内容概要 溢出属性 定位属性 z-index JavaScript简介 变量与注释 数据类型 内容详情 溢出属性 # 文本内容超出了标签的最大范围 overflow: hidden; 接隐藏文本内容 ...