题目大意

给出n,m,k,有n个数的序列,m次询问一段区间,问异或和等于K的子区间的个数。

题解

本题一看就是莫队。但要解决该题需要以下性质:

定理:

$$a\oplus b=c\Leftrightarrow a\oplus c=b\Leftrightarrow b\oplus c=a$$

推论:

$$\oplus_{i=l}^r A_i= \oplus_{i=1}^r A_i \oplus \oplus_{i-1}^{l-1}A_i$$

因此,我们对每个节点维护它的前缀和。比如说,如果右方加入一个节点,因为右方r的前缀和异或左面l的前缀和的结果表示的就是[l+1,r]的异或和。此时增加的满足条件的子区间的个数,根据定理,便是当前区间中前缀和的值异或上新加入的节点的前缀和的值等于K的点的数量。这就可以用莫队的桶来维护了。

#define _DEBUG#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;const int MAX_N = 100010;
int K;
int BASE;struct CaptainMo
{int N, OpCnt, Sum;int PrefixValCnt[MAX_N];struct Data{int CurVal, Prefix;}_datas[MAX_N];struct Query{int L, R;int Ans;Query *This;Query():This(this){}bool operator < (const Query& a)const{return L / BASE == a.L / BASE ? R < a.R : L / BASE < a.L / BASE;}}_qs[MAX_N], temp[MAX_N];void InRange(Data cur){Sum += PrefixValCnt[cur.Prefix ^ K];PrefixValCnt[cur.Prefix]++;}void OutRange(Data cur){Sum -= PrefixValCnt[cur.Prefix ^ K];PrefixValCnt[cur.Prefix]--;}void Init(){for(int i = 1; i <= OpCnt; i++)_qs[i].L--;for(int i = 1; i <= N; i++)_datas[i].Prefix = _datas[i - 1].Prefix ^ _datas[i].CurVal;BASE = sqrt(N);memcpy(temp, _qs, sizeof(_qs));sort(temp + 1, temp + OpCnt + 1);}void Proceed(){int l = 0, r = 0;Sum = 0;PrefixValCnt[0] = 1;for(int i = 1; i <= OpCnt; i++){while(r > temp[i].R)OutRange(_datas[r--]);while(r < temp[i].R)InRange(_datas[++r]);while(l < temp[i].L)OutRange(_datas[l++]);while(l > temp[i].L)InRange(_datas[--l]);temp[i].This->Ans = Sum;}}
}g;int main()
{scanf("%d%d%d", &g.N, &g.OpCnt, &K);for(int i = 1; i <= g.N; i++)scanf("%d", &g._datas[i].CurVal);for(int i = 1; i <= g.OpCnt; i++)scanf("%d%d", &g._qs[i].L, &g._qs[i].R);g.Init();g.Proceed();for(int i = 1; i <= g.OpCnt; i++)printf("%d\n", g._qs[i].Ans);return 0;
}

  

转载于:https://www.cnblogs.com/headboy2002/p/9219452.html

luogu4462 异或序列相关推荐

  1. [CQOI2018]异或序列

    [CQOI2018]异或序列 题意: 给定1个整数K,离线询问[l,r]中有多少子区间xor和=K. 题解: 异或有个重要的性质:它的逆运算就是自身 我们维护该数列的前缀异或和a[x],表示1到x的区 ...

  2. 6759: 异或序列

    6759: 异或序列 时间限制: 1 Sec  内存限制: 128 MB 题目描述 已知一个长度为n的整数数列a1,a2,-,an,给定查询参数l.r,问在al,al+1,-,ar区间内,有多少子序列 ...

  3. Loj 2534 异或序列

    Loj 2534 异或序列 考虑莫队离线处理.每加一个数,直接询问 \(a[x]\oplus k\) 的前/后缀数目即可,减同理. 利用异或的优秀性质,可以维护异或前缀和,容易做到每次 \(O(1)\ ...

  4. [CQOI2018] 异或序列

    题目链接:戳我 哈哈哈我竟然秒切了省选题 莫队+异或. 考虑异或的性质,一个数同时异或两次等于没有进行操作.那么我们设a[i]为前i个数的异或和,显然对于一个区间\([l,now]\),\(a[l-1 ...

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

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

  6. 【Luogu】P4462异或序列(莫队)

    题目链接 观察什么时候x到y之间那一段可以被统计 xorsum[x-1]^xorsum[y]=k xorsum[x-1]=xorsum[y]^k||xorsum[y]=xorsum[x-1]^k 莫队 ...

  7. 【LOJ】#2534. 「CQOI2018」异或序列

    题解 每个数都处理成前缀和,就相当于问\([l - 1,r]\)有几个数对\(x,y\),\(sum[x] ^ sum[y] = k\) 直接莫队即可 代码 #include <bits/std ...

  8. 洛谷 P4551 最长异或路径

    题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...

  9. 01tire+洛谷P4551 最长异或路径

    题目: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入格式 第一行一个整数NN,表示点数. 接下来 ...

最新文章

  1. 改变Error tip的背景色.
  2. PAT1052---------初步了解正则表达式
  3. 自制单选多选日历文本框文本域控件
  4. oracle 中表示字符串使用单引号
  5. 学习MSCKF笔记——后端、状态预测、状态扩增、状态更新
  6. springboot实现增量备份_SpringBoot canal数据同步解决方案
  7. Magicodes.IE已支持导出Word、Pdf和Html
  8. LeetCode MySQL 1212. 查询球队积分
  9. 数据归一化处理方法_科研常用的实验数据分析与处理方法
  10. boost.asio mysql_boost asio学习笔记
  11. 轻松使用EasyRecovery恢复丢失照片
  12. 资源分配博弈之纳什均衡和斯塔克尔伯格模型
  13. java 排队_JAVA实现排队论
  14. 卸载 Oracle 19c
  15. bandizip关闭自动更新提示的方法步骤
  16. OSChina 周四乱弹 —— 这个腿就有我来守护了
  17. Java Swing教程
  18. 【弘成基】运用资料整理
  19. Mac如何通过bootcamp(启动转换助理)安装Windows10系统?附教程和下载
  20. 【HTCVR】VRTK插件功能

热门文章

  1. Java 基础——类和对象
  2. Shell 脚本知识回顾 (六) —— Shell 函数
  3. C语言日志操作类实例
  4. vue-cli3中的vue.config.js配置
  5. React开发(166):ant design form 设置值
  6. 前端学习(3305):函数组件usermemo和usercallback
  7. 前端学习(3283):立即执行函数二
  8. [html] 谈谈你对input元素中readonly和disabled属性的理解
  9. [html] js放在html的<body>和<head>有什么区别?
  10. [vue] 如何在子组件中访问父组件的实例?