题目链接:点击查看

题目大意:给出一个由n个数组成的数列,现在给出m组询问,每次询问包含一个l和一个r,要求回答在闭区间[l,r]中有多少组(i,j)满足[i,j]闭区间内的所有数的异或和等于k

题目分析:一看数据范围暴力肯定是不能做的,而且m给的也很大,还是离线操作,所以我们可以考虑用莫队来处理这个问题,二话不说就直接把板子贴过来了,现在的问题就是编写一下add和del这两个函数了

因为要求区间异或和,我们不妨在输入的时候就顺便把异或和维护一下,要求[l,r]之间的异或和,答案就是a[r]^a[l-1],注意一下这里的l-1,我一开始没想那么多,当成l做的,调试的时候都快自闭了。。

下面我们设计add和del函数,当我们要加入或删除pos位置数的时候,只需要找一下当前区间内有多少个值为pos^k的数即可,因为这些数都可以满足上面提到的式子,从而满足区间异或和的结果等于k,这样我们就好做了,只需要维护一个cnt记录一下每个值出现的次数即可,因为k的上限给到了1e6,根据异或的性质,答案肯定不可能超过二进制中的最高位,所以我们直接开一个2e6的cnt数组维护即可,这里需要注意一下,当前加入或删除的数,当k=0的时候,顺序对答案是有贡献的,所以在add函数里我们需要先计算贡献再将其自增,在del函数里我们需要先将其自减再计算贡献

然后就是cnt数组了,我一开始用的无序map,因为懒得算那么多东西,但最后发现无序map虽然时间复杂度几乎都是O(1)级别的,但对于这个题目还是跑了1.5秒,换成数组之后直接下降到了300毫秒,这个时间开销还是比较客观的,所以以后能用数组就用数组吧,尽量别用stl

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int size,n,m,k,a[N];LL ans[N];LL cnt[N*20];struct query
{int l,r,id;bool operator<(const query& a)const{if(l/size!=a.l/size)return l<a.l;else if((l/size)&1)return r<a.r;elsereturn r>a.r;}
}q[N];LL add(int pos)
{LL ans=cnt[a[pos]^k];//先计算贡献cnt[a[pos]]++;//再自增return ans;
}LL del(int pos)
{cnt[a[pos]]--;//先自减LL ans=cnt[a[pos]^k];//再计算贡献return -ans;
}void solve()
{int l=1,r=0;LL sum=0;for(int i=1;i<=m;i++){int ql=q[i].l;int qr=q[i].r;while(l<ql)sum+=del(l++);while(l>ql)sum+=add(--l);while(r<qr)sum+=add(++r);while(r>qr)sum+=del(r--);ans[q[i].id]=sum;}
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);scanf("%d%d%d",&n,&m,&k);size=sqrt(n);for(int i=1;i<=n;i++){scanf("%d",a+i);a[i]^=a[i-1];}for(int i=1;i<=m;i++){scanf("%d%d",&q[i].l,&q[i].r);q[i].l--;//注意这里,让l自减,达到区间变为[l-1,r]的目的q[i].id=i;}sort(q+1,q+1+m);solve();for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);return 0;
}

CodeForces - 617E XOR and Favorite Number(莫队)相关推荐

  1. codeforces 617E XOR and Favorite Number 莫队

    https://vjudge.net/problem/CodeForces-617E 题目大意:给nnn个数,mmm个询问,以及一个数kkk,每次询问要输出[l,r][l,r][l,r]内满足a[i] ...

  2. CodeForces - 617E XOR and Favorite Number (莫队+前缀和)

    Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is g ...

  3. CodeForces -617E XOR and Favorite Number(莫队)

    题目链接:点击这里 题目大意: 给定一个长度为 nnn 的序列 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​ ,再给出一个数字 kkk , mmm 组询问每组询 ...

  4. Codeforces 617E XOR and Favorite Number

    Discription Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Eac ...

  5. 莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

    一.理解 我的理解就是巧妙的暴力,利用双指针以及分块思想,巧妙的移动双指针,时间复杂度可以达到O(NlogN). 强推博客:写的又好又全.链接 二.套路 1.普通莫队 [1]核心代码 bool cmp ...

  6. Codeforces617E XOR and Favorite Number (普通莫队)

    题目链接: XOR and Favorite Number 2021.11.11更新了解题思路和代码 大致题意 给定一个长度为nnn的序列aaa, 和一个固定的数值kkk. 有mmm次询问, 每次询问 ...

  7. XOR and Favorite Number CF340E 莫队算法

    题目链接 题意:求给定询问区间[L,R]问有多少连续区间异或值等k,多次询问可以离线. a[i]^a[i+1]^a[i+2]^a[n]=(a[1]^a[2]^a[3]^...^a[i-1])^(a[1 ...

  8. CodeForces 617 E. XOR and Favorite Number

    题目链接: CodeForces 617 E. XOR and Favorite Number 题目描述: 给出n个数,m次查询,每次查询在区间[l, r]里面有多少对(i, j),满足ai ^ ai ...

  9. CF 617E 莫队

    CF 617E 题目链接: http://codeforces.com/problemset/problem/617/E 题意: 问[L,R]区间内,有多少个子区间,它们里元素的异或和为k. 思路: ...

最新文章

  1. 剑指Offer Ⅱ 001. 整数除法(力扣剑指Offer专项突击版——整数_1)
  2. 激战服务器位置,如何选服务器 《激战2》服务器设置讲解
  3. 微信小程序支付宝小程序合并二维码
  4. Radius认证协议(六)报文属性
  5. matlab细胞计数并求目标区域求面积
  6. 三维激光扫描后处理软件_青出于蓝 尽锋芒——非白三维发布蓝激光手持三维扫描仪...
  7. postman设置域名_Postman中文文档——设置
  8. 基于小波分析和机器学习的时间序列分析与识别
  9. 基于Hadoop豆瓣电影数据分析(综合实验)
  10. Oracle数据库基础教程
  11. 智能匹配 — 百度SEM
  12. Sentinel 极简入门
  13. 专利发明人是子公司的员工,专利申请人是母公司名称,在职称评审时这个专利对子公司员工算不算成果
  14. tidb和tbase的聚合函数算法
  15. 第23节 软件构件技术和软件体系结构
  16. 微信h5支付python版
  17. 听力测试软件电脑版,磨耳英语听力电脑版
  18. 纽约时报订阅_在家创新:《纽约时报》的创客周
  19. uniapp+Echarts微信小程序实现中国地图
  20. 老旧asp.net网站搬家导致的反编译实例1

热门文章

  1. SpringSecurity集中式整合之加入jsp
  2. SpringSecurity权限控制之异常处理方式一
  3. Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景
  4. 模拟CA机构制作CA机构证书
  5. Nacos配置中心-多配置文件加载
  6. Hive的安装-Mysql安装
  7. jvm_垃圾收集算法讲解(二)
  8. redis(15)--复制
  9. Java Pattern类的用法详解(正则表达式)
  10. gtest 测试java_LangTest