简要题面

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

做法

首先,题目要求所有子区间的异或和的异或和,发现每个元素异或两次就变成 \(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. 隔离这几天开发了一个带控制台的OAuth2授权服务器分享给大家

    停更这些天,业余时间和粉丝群的几个大佬合作写了一个基于Spring Authorization Server的OAuth2授权服务器的管理控制台项目Id Server,我觉得这个项目能够大大降低OAu ...

  2. 并发编程系列之Lock锁可重入性与公平性

    一.相似之处:Lock锁 vs Synchronized 代码块 Lock锁是一种类似于synchronized 同步代码块的线程同步机制.从Java 5开始java.util.concurrent. ...

  3. 2022年5月11日,NBMiner发布了41.3版本,在内核中加入了100%LHR解锁器,从此NVIDIA的显卡再无锁卡一说

           2022年5月11日,NBMiner发布NBMiner_41.3版本,主要提升了稳定性.         2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核 ...

  4. 771. Jewels and Stones - LeetCode

    Question 771. Jewels and Stones Solution 题目大意:两个字符串J和S,其中J中每个字符不同,求S中包含有J中字符的个数,重复的也算 思路:Set记录字符串J中的 ...

  5. CSS基础学习(一)

    1.设置背景颜色:background-color 例:background-color:#d0e4fe;或background-color:blue; 2.字体颜色·:color 例:color:r ...

  6. TyepScript学习

    前提 JS缺陷 (1)变量频繁变换类型,类型不明确难以维护 TS定义 (1)定义 以JavaScript为基础构建的语音,一个JavaScript的超集,扩展js添加了类型, 可以在任何支持js的平台 ...

  7. ML第5周学习小结

    本周收获 总结一下本周学习内容: 1.学习了<深入浅出Pandas>的第五章:Pandas高级操作的两个内容 数据迭代 函数应用 我的博客链接: pandas:数据迭代.函数应用 2.&l ...

  8. JavaScript中的??和?.和??=操作符

    JS中两种不常使用但挺实用的操作符:??和?. 一起来了解并学会使用它们吧: 空值合并操作符:?? 只有当操作符左侧为null或undefined时才会返回操作符右侧的值,否则返回左侧的值. eg: ...

  9. C++ 炼气期之基本结构语法中的底层逻辑

    1. 前言 从语言的分类角度而言,C++是一种非常特殊的存在.属于高级语言范畴,但又具有低级语言的直接访问硬件的能力,这也成就了C++语言的另类性,因保留有其原始特性,其语法并不象其它高级语言一样易理 ...

  10. JS:||运算符

    ||逻辑运算符 ||这个符号在开发中 往往是优化的代码最常用的js符号: 当用||连接语句时,回将前后语句变为Boolean类型,再进行运算: 1.当||前面条件为false,不管后面是true/fa ...