题目大意:给定一个长度为 N 的序列,有 M 组询问,每组询问查询区间 [l,r] 内异或和等于给定常数 K 的区间组数。

题解:对于异或和问题,一般先进行前缀和处理,转化为两个点的的关系。因此,经过前缀和处理后,询问变成了在给定区间内,查询二元组 \((i,j)\) 满足 \(a[i]\oplus a[j]=k\) 的个数。从值域角度进行考虑,每次加入一个值时,将满足条件的值加入答案贡献即可,因此可以使用莫队处理。

代码如下

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pb push_back
  5. #define mp make_pair
  6. #define all(x) x.begin(),x.end()
  7. #define cls(a,b) memset(a,b,sizeof(a))
  8. using namespace std;
  9. typedef long long ll;
  10. typedef pair<int,int> P;
  11. const int dx[]={0,1,0,-1};
  12. const int dy[]={1,0,-1,0};
  13. const int mod=1e9+7;
  14. const int inf=0x3f3f3f3f;
  15. const int maxn=1e5+10;
  16. const double eps=1e-6;
  17. inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  18. inline ll sqr(ll x){return x*x;}
  19. inline ll fpow(ll a,ll b,ll c){ll ret=1%c;for(;b;b>>=1,a=a*a%c)if(b&1)ret=ret*a%c;return ret;}
  20. inline ll read(){
  21. ll x=0,f=1;char ch;
  22. do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
  23. do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
  24. return f*x;
  25. }
  26. /*------------------------------------------------------------*/
  27. int n,m,k,a[maxn];
  28. int cnt[maxn*10],l=1,r=0,tot;
  29. ll ans[maxn],now;
  30. struct query{int id,l,r,bl;}q[maxn];
  31. inline int get(int pos){return (pos-1)/tot+1;}
  32. bool cmp(const query &x,const query &y){
  33. return x.bl!=y.bl?x.bl<y.bl:(x.bl&1)?x.r<y.r:x.r>y.r;
  34. }
  35. void read_and_parse(){
  36. n=read(),m=read(),k=read(),tot=sqrt(n);
  37. for(int i=1;i<=n;i++)a[i]=read();
  38. for(int i=1;i<=n;i++)a[i]^=a[i-1];
  39. for(int i=1;i<=m;i++){
  40. int l=read(),r=read();
  41. q[i].id=i,q[i].l=l-1,q[i].r=r,q[i].bl=get(q[i].l);
  42. }
  43. sort(q+1,q+m+1,cmp);
  44. }
  45. void update(int pos,int f){
  46. if(f==1){
  47. now+=cnt[a[pos]^k];
  48. ++cnt[a[pos]];
  49. }else{
  50. --cnt[a[pos]];
  51. now-=cnt[a[pos]^k];
  52. }
  53. }
  54. void solve(){
  55. for(int i=1;i<=m;i++){
  56. while(r<q[i].r)update(++r,1);
  57. while(r>q[i].r)update(r--,-1);
  58. while(l<q[i].l)update(l++,-1);
  59. while(l>q[i].l)update(--l,1);
  60. ans[q[i].id]=now;
  61. }
  62. for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
  63. }
  64. int main(){
  65. read_and_parse();
  66. solve();
  67. return 0;
  68. }

【洛谷P4462】异或序列的更多相关文章

  1. 洛谷 2023 [AHOI2009]维护序列

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

  2. 洛谷 P3908 异或之和

    洛谷 P3908 异或之和 题目描述 求1⨁2⨁⋯⨁N 的值. A⨁B 即 AA, B 按位异或. 输入输出格式 输入格式: 1 个整数 N . 输出格式: 1 个整数,表示所求的值. 输入输出样例 ...

  3. 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)

    洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...

  4. 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP

    洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...

  5. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...

  6. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...

  7. 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)

    洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...

  8. 【洛谷3321_BZOJ3992】[SDOI2015]序列统计(原根_多项式)

    题目: 洛谷3321 分析: 一个转化思路比较神(典型?)的题-- 一个比较显然的\(O(n^3)\)暴力是用\(f[i][j]\)表示选了\(i\)个数,当前积在模\(m\)意义下为\(j\)的方案 ...

  9. 洛谷P4462 [CQOI2018]异或序列(莫队)

    题意 题目链接 Sol 一开始以为K每次都是给出的想了半天不会做. 然而发现读错题了维护个前缀异或和然后直接莫队搞就行,. #include<bits/stdc++.h> #define ...

随机推荐

  1. day 7-6 GIL,死锁,递归锁与信号量,Event,queue,

    摘要: 1.死锁与递归锁 2.信号量 3.Event 4.Timer 5.GIL 6.Queue 7.什么时候该用多线程和多进程 一. 死锁与递归锁 所谓死锁: 是指两个或两个以上的进程或线程在执行过 ...

  2. C# Note20: 制作延时改变显示的标题栏

    前言 在使用wpf构建一个窗体时,其中有这样一个功能,在保存数据或加载数据时,我们希望在改变标题栏的显示以标志当前保存成功的状态或者加载数据的名称信息,而且标题信息更新显示几秒后,再恢复到默认的状态. ...

  3. php 将数组转换网址URL参数

    $array =array ( 'id' =123, 'name' = 'dopost' );echo http_build_query( $array );//得到结果id=123name=dopo ...

  4. MySQL执行语句的顺序

    MySQL的语句一共分为11步,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有 ...

  5. Java多线程5:Synchronized锁机制

    一.前言 在多线程中,有时会出现多个线程对同一个对象的变量进行并发访问的情形,如果不做正确的同步处理,那么产生的后果就是“脏读”,也就是获取到的数据其实是被修改过的. 二.引入Synchronized ...

  6. python数据结构与算法第四天【代码执行时间测试模块】

    #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from timeit import Timer def foo(): ''' 使用append方式向列表添加 ...

  7. @Html自定义属性

    @Html.DropDownList("CardCode", (SelectList)ViewData["cardcodeselectlist"], " ...

  8. Windows & RabbitMQ:安装

    可以参考:在 Windows 上安装Rabbit MQ 指南 本文RabbitMQ版本为3.6.1 Step 1:安装Erlang Step 2:安装RabbitMQ Step 3:启用Managem ...

  9. POI Excel 单元格内容类型判断并取值

    个人用到的 String birthdayVal = null;                                                                     ...

  10. ExaWizards 2019

    AB:div 3 AB??? C:div 1 C???场内自闭的直接去看D.事实上是个傻逼题,注意到物品相对顺序不变,二分边界即可. #include<iostream> #include ...