Loj 2534 异或序列

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

很久没写莫队了.有一个小细节开始写错了:如果 \(a.belong\) 是根据 \(a.l\) 算出的,排序时的第二关键字就选取 \(a.r\) ,否则会被卡到 \(O(n^2)\) .

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline int read()
{
int x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
const int MAXN=1e5+10,N=2e5;
struct query{
int l,r,bel;
int ans,id;
}q[MAXN];
bool cmp1(query a,query b)
{
if(a.bel!=b.bel)
return a.bel<b.bel;
if(a.r!=b.r)
return a.r<b.r;
return a.l<b.l;
}
bool cmp2(query a,query b)
{
return a.id<b.id;
}
int n,m,k;
int ans=0;
int a[MAXN],pre[MAXN],cnt[MAXN<<1];
void Add(int x)
{
ans+=cnt[k^pre[x]];
++cnt[pre[x]];
}
void Remove(int x)
{
--cnt[pre[x]];
ans-=cnt[k^pre[x]];
}
int main()
{
n=read(),m=read(),k=read();
int bsiz=sqrt(n);
for(int i=1;i<=n;++i)
a[i]=read(),pre[i]=pre[i-1]^a[i];
for(int i=1;i<=m;++i)
{
q[i].l=read(),q[i].r=read();
q[i].bel=(q[i].l-1)/bsiz;
q[i].id=i;
}
sort(q+1,q+1+m,cmp1);
int L=1,R=0;
for(int i=1;i<=m;++i)
{
int l=q[i].l,r=q[i].r;
while(L<l-1)
Remove(L++);
while(L>l-1)
Add(--L);
while(R<r)
Add(++R);
while(R>r)
Remove(R--);
q[i].ans=ans;
}
sort(q+1,q+1+m,cmp2);
for(int i=1;i<=m;++i)
printf("%d\n",q[i].ans);
return 0;
}

Loj 2534 异或序列的更多相关文章

  1. bzoj 5301: [Cqoi2018]异或序列 (莫队算法)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5301 题面; 5301: [Cqoi2018]异或序列 Time Limit: 10 Sec ...

  2. 「luogu4462」[CQOI2018] 异或序列

    「luogu4462」[CQOI2018]异或序列 一句话题意 输入 \(n\) 个数,给定\(k\),共 \(m\) 组询问,输出第 \(i\) 组询问 \(l_i\) \(r_i\) 中有多少个连 ...

  3. P3917 异或序列

    P3917 异或序列暴力前缀异或枚举每一个区间,再求和,60分.正解:按每一位来做对于区间[l,r],如果它对答案有贡献,区间中1的个数一定是奇数,可以按每一位取(1<<i)的前缀和,q[ ...

  4. bzoj 5301 [Cqoi2018]异或序列 莫队

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 204  Solved: 155[Submit][Status ...

  5. BZOJ5301: [Cqoi2018]异或序列(莫队)

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 400  Solved: 291[Submit][Status ...

  6. 【BZOJ5301】【CQOI2018】异或序列(莫队)

    [BZOJ5301][CQOI2018]异或序列(莫队) 题面 BZOJ 洛谷 Description 已知一个长度为 n 的整数数列 a[1],a[2],-,a[n] ,给定查询参数 l.r ,问在 ...

  7. [bzoj5301][Cqoi2018]异或序列_莫队

    异或序列 bzoj-5301 Cqoi-2018 题目大意:题目链接. 注释:略. 想法: 由于a^a=0这个性质,我们将所有的数变成异或前缀和. 所求就变成了求所有的$l_i\le x<y\l ...

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

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

  9. BZOJ_5301_[Cqoi2018]异或序列&&CF617E_莫队

    Description 已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l.r ,问在 [l,r] 区间内,有多少连续子 序列满足异或和等于 k . 也就是说,对于所 ...

随机推荐

  1. arm-linux-gcc安装使用教程

    arm-linux-gcc如何下载安装2(转) [转]ubuntu下交叉编译环境构建(arm-linux-gcc-3.4.1.tar.bz2 ) 2009-03-03 10:05 1.下载arm-li ...

  2. Location对象常用知识

    产品终于上线,后期主要是优化了.在开发过程中用到了很多location对象的知识,趁现在有时间先整理一下. Location 对象存储在 Window 对象的 Location 属性中,可通过wind ...

  3. mysql数据库建表

    主键的问题: 简单的id递加.不过在实习的时候,因为id递增的问题,导致一个项目最后好像产生了严重的问题.所以递增适合小型项目,对我们的项目来说90%足够可以用的. 一些限制: 一般就非空就行,唯一的 ...

  4. The tilde ( ~ ) operator in JavaScript

    From the JavaScript Reference on MDC, ~ (Bitwise NOT) Performs the NOT operator on each bit. NOT a y ...

  5. UVALive - 6709树套树

    题意:给你一个矩阵,q次操作,每次查询长宽l的矩阵最大值a和最小值b,然后把中间点换成floor((a+b)/2), 解法:暴力可过,建n颗线段树暴力更新,但是正解应该是树套树,树套树需要注意的是当建 ...

  6. MySQLdb和PIL安装

    最近将个人博客部署到树莓派上海真是颇费周折,尤其是在MySQLdb和PIL的安装上 MySQLdb 先说Windows吧(比较简单) 直接pip安装即可或者下载编译版更方便:http://source ...

  7. [Android]如何减小APK的大小

    能不引用的外部包就不用,删除没用的图片.xml,优化代码去掉没用的部分,能异步下载的资源就运行时从网络上下载.

  8. iOS笔记杂记

    Google Mobile Ads SDK更新至7.2.1不能编译,添加依赖库QuartzCore.framework后正常编译 imageName会把image缓存到手机内存里,不适合大量图片浏览会 ...

  9. CUDA库函数module management

    http://horacio9573.no-ip.org/cuda/group__CUDA__MODULE_ga52be009b0d4045811b30c965e1cb2cf.html

  10. The disadvantage for manager has a part-time job as a trainer

    At present, most companies with in-house trainers take the development model of "full-time trai ...