6759: 异或序列

时间限制: 1 Sec  内存限制: 128 MB

题目描述

已知一个长度为n的整数数列a1,a2,…,an,给定查询参数l、r,问在al,al+1,…,ar区间内,有多少子序列满足异或和等于k。也就是说,对于所有的x,y(l≤x≤y≤r),满足ax⊕ax+1⊕⋯⊕ay=k的x,y有多少组。

输入

输入第一行为3个整数n,m,k。第二行为空格分开的n个整数,即a1,a2,…,an。接下来m行,每行两个整数lj,rj,代表一次查询。

输出

输出共m行,对应每个查询的计算结果。

样例输入

4 5 1
1 2 3 1
1 4
1 3
2 3
2 4
4 4

样例输出

4
2
1
2
1

提示

对于30%的数据,1≤n,m≤1000。
对于100%的数据,1≤n,m≤105,0≤k,ai≤105,1≤lj≤rj≤n。

来源/分类

重庆OI2018

看到多次区间查询,就想到了莫队算法,但是莫队中对于区间状态转移的处理却是需要斟酌。

题目已经很明显的提示了,异或异或,也许我们应该使用异或前缀和,(orz)

对于异或前缀和 我们知道 i and j 之间的异或和 == sum[j]^sum[i-1]

那么对于l 如果小于 Q.l-1,那么我们就先清除这位置的影响,然后下标++

如果大于Q.l-1,那就下标--,再加上这位置影响

我们要让求异或为k的组合数

sum[j] ^ sum[i] = k 即 sum[j] ^ k = sum[i]

用cnt 记录 区间内前缀和的数量变化

那么ans += val * (cnt[sum[j] ^ k])即这个点所造成的k组数影响

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<math.h>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 const int maxn = 1e5+5;
 8 int n,m,k;
 9 int block;
10 int sum[maxn];
11 int ans;
12 int tmp;
13 int cnt[maxn];
14
15 struct node
16 {
17     int l,r,id,ans;
18     friend bool operator < (const node &a,const node&b)
19     {
20         if(a.l / block != b.l / block)return a.l < b.l;
21         return a.r < b.r;
22     }
23     node(){}
24     node(int l,int r,int id):l(l),r(r),id(id){}
25 }Q[maxn];
26
27 bool cmp(node a,node b)
28 {
29     return a.id < b.id;
30 }
31
32 void revise(int x,int val)
33 {
34     cnt[sum[x]]+=val;
35     ans += val*cnt[sum[x]^k];
36 }
37 int main()
38 {
39     scanf("%d%d%d",&n,&m,&k);
40     block = sqrt(n);
41     for(int i=1;i<=n;i++)
42     {
43         scanf("%d",&tmp);
44         sum[i] = tmp ^ sum[i-1];
45     }
46     for(int i=1;i<=m;i++)
47     {
48         scanf("%d%d",&Q[i].l,&Q[i].r);
49         Q[i].id = i;
50     }
51     sort(Q+1,Q+m+1);
52     int l = 1,r = 0;
53     ans = 0;
54     for(int i=1;i<=m;i++)
55     {
56         while(l < Q[i].l - 1)revise(l,-1),l++;
57         while(l > Q[i].l - 1) l--,revise(l,1);
58         while(r < Q[i].r)r++,revise(r,1);
59         while(r > Q[i].r)revise(r,-1),r--;
60         Q[i].ans = ans;
61     }
62     sort(Q+1,Q+m+1,cmp);
63     for(int i=1;i<=m;i++)printf("%d\n",Q[i].ans);
64     return 0;
65 }

View Code

转载于:https://www.cnblogs.com/iwannabe/p/9539460.html

6759: 异或序列相关推荐

  1. [CQOI2018]异或序列

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

  2. Loj 2534 异或序列

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

  3. luogu4462 异或序列

    题目大意 给出n,m,k,有n个数的序列,m次询问一段区间,问异或和等于K的子区间的个数. 题解 本题一看就是莫队.但要解决该题需要以下性质: 定理: $$a\oplus b=c\Leftrighta ...

  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. 两个软件相互交换数据_面试需要知道的六种数据结构
  2. MySQL5.7.11免安装版的安装和配置以及解决MYSQL服务无法启动问题
  3. android activity使用,android,NativeActivity使用
  4. 虚幻4皮肤材质_虚幻4渲染编程(材质编辑器篇)【第六卷:各向异性材质amp;玻璃材质】...
  5. 微信小程序 引用其他js里的方法
  6. 精简DropDownList用法
  7. zk里面调用javascript方法
  8. html引用单文件组件,webpack入坑之旅(五)加载vue单文件组件_html/css_WEB-ITnose
  9. 让部署到服务器上的springboot项目持续运行(nohup)
  10. mysql hibernate 乱码_mysql hibernate 乱码
  11. WARNING:CPU :2 PID:593 at net/wireless/nl802.c:2883 nl80211_send_chandef+0x54/0x180
  12. 虚拟机下搭建一个dns服务器,虚拟机下DNS服务器配置.doc
  13. mysql怎么打开db文件_myMySQL数据库的db文件怎么打开? MySQL数据库使用教程
  14. 常用 Linux 软件汇总!很全,但不敢说最全
  15. python 使用 turtle库 画“皮卡丘”
  16. AllegroPCB里面设置好颜色,光绘文件artwork和其他板子相关参数怎么重复应用到其他板子里面
  17. 恒压板框过滤实验数据处理_求购二手板框压滤机现金回收 回收二手板框压滤机回收价格...
  18. NRFL2401学习
  19. 两层循环终止内层或外层循环的方法(break和continue的用法)
  20. 拯救者r720黑苹果_拯救级手游语音,大象声科助力联想拯救者电竞手机

热门文章

  1. 使用Eclipse 创建 搭建SpringBoot项目
  2. 基于vue的UI框架集锦(移动端+pc端)
  3. TCP Congestion Control
  4. java获取类名不包括路径
  5. js中,实现对键盘按键的监听:
  6. 初等数论及其应用——中国剩余定理
  7. 2016/06/22 中色启动筹码分析作业
  8. hibernate 映射四多对一双向映射
  9. matlab linspace
  10. JAVA Servlet API简介及接口与类的用法