题意:

给出一系列数,对每个查询区间,计算有多少个子区间异或为k。

思路:

可以先预处理异或前缀,一个区间[L,R]的异或值=sum[R]^sum[L-1];

如果当前区间是[a,b],加一个右端点b+1,那么这个b+1的贡献就是[a,b]区间内有多少个sum[x]=sum[b+1]^k

那么我们可以每次记录num[sum[x]]即num[sum[b+1]^k],并记录num[sum[b+1]]++,同理左区间。

那么我们就可以使用莫队算法。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=2e6+10;
int sum[N],pos[100010];
LL num[N];
int n,m,k,x;
struct asd{
int left,right,id;
LL res;
}e[100010];
bool cmp(asd x,asd y)
{
if(pos[x.left]==pos[y.left]) return x.right<y.right;
return pos[x.left]<pos[y.left];
}
LL ans; //答案遵守ans先加,再变;先变,ans再减;
void solve()
{
sort(e,e+m,cmp);
ans=0;
memset(num,0,sizeof(num));
int L=0,R=0;
for(int i=0;i<m;i++)
{
while(L<e[i].left-1) //当他在区间左边,他要减去他产生右端
{
num[sum[L]]--; //先变
ans-=num[sum[L]^k]; //答案再减
L++;
}
while(L>=e[i].left) //当他在区间右边,他要加上他右端
{
L--;
ans+=num[sum[L]^k]; //先加答案
num[sum[L]]++; //再变
}
while(R<=e[i].right) //小于,要加左边
{
ans+=num[sum[R]^k]; //先加答案
num[sum[R]]++; //再变
R++;
}
while(R>e[i].right+1) //大,要减左
{
R--;
num[sum[R]]--; //先变
ans-=num[sum[R]^k]; //再减答案
}
e[e[i].id].res=ans;
}
for(int i=0;i<m;i++)
printf("%lld\n",e[i].res);
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
sum[0]=0;
int block=(int)sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
sum[i]=sum[i-1]^x;
pos[i]=(i-1)/block+1;
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&e[i].left,&e[i].right);
e[i].id=i;
}
solve();
return 0;
}
/*
6 2 3
1 2 1 1 0 3
1 6
3 5
5 3 1
1 1 1 1 1
1 5
2 4
1 3
*/

Codeforces617E【莫队算法+前缀异或】的更多相关文章

  1. Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 【莫队算法 + 异或和前缀和的巧妙】

    任意门:http://codeforces.com/problemset/problem/617/E E. XOR and Favorite Number time limit per test 4 ...

  2. Codeforces617 E . XOR and Favorite Number(莫队算法)

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

  3. Codeforces 617E XOR and Favorite Number(莫队算法)

    题目大概说给一个序列,多次询问区间异或和为k的连续子序列有多少个. 莫队算法,利用异或的性质,通过前缀和求区间和,先处理出序列各个前缀和,然后每次区间转移时维护i以及i-1前缀和为某数的个数并增加或减 ...

  4. XOR and Favorite Number(莫队算法+分块)

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  5. B 洛谷 P3604 美好的每一天 [莫队算法]

    题目背景 时间限制3s,空间限制162MB 素晴らしき日々 我们的情人,不过是随便借个名字,用幻想吹出来的肥皂泡,把信拿去吧,你可以使假戏成真.我本来是无病呻吟,漫无目的的吐露爱情---现在这些漂泊不 ...

  6. 「知识学习&日常训练」莫队算法(一)(Codeforce Round #340 Div.2 E)

    题意 (CodeForces 617E) 已知一个长度为\(n\)的整数数列\(a[1],a[2],-,a[n]\),给定查询参数\(l,r\),问\([l,r]\)内,有多少连续子段满足异或和等于\ ...

  7. CF 617E【莫队求区间异或和】

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  8. 莫队算法初识~~CodeForces - 617E

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  9. Codeforces Round #340 (Div. 2) E. XOR and Favorite Number —— 莫队算法

    题目链接:http://codeforces.com/problemset/problem/617/E E. XOR and Favorite Number time limit per test 4 ...

随机推荐

  1. 流畅的python学习笔记:第十三章:重载运算符__add__,__iadd__,__radd__,__mul__,__rmul__,__neg__,__eq__,__invert__,__pos__

    在前面第十章以及第一章的时候介绍了Vector对象的运算符重载.第十三章专门介绍运算符重载.这里我们看几个之前没讲过的运算符__neg__,__pos__,__invert__ class Vecto ...

  2. 您使用的是不受支持的命令行标记 chrome

    检查 chrome://flags/#extensions-on-chrome-urls 是否开启 开启了的话就关掉检查 启动chrome的快捷方式是否在目标后有额外的参数 有就删了 在浏览器中输入c ...

  3. HTML——列表的相关知识

    核心知识点: 1.无序列表: ul>li 2.有序列表:ol>li 3.标题列表:dl(标签)>dt(标题)>dd(选项) 4.表格:table>thead(>tr ...

  4. 微信小程序开发:学习笔记[2]——WXML模板

    微信小程序开发:学习笔记[2]——WXML模板 快速开始 介绍 WXML 全称是 WeiXin Markup Language,是小程序框架设计的一套标签语言,结合小程序的基础组件.事件系统,可以构建 ...

  5. BeginPaint和GetDC有什么区别

    windows编程问题 第一种情况显示出来的字很正常. case WM_PAINT: gdc = BeginPaint (hwnd, &ps); TextOut (gdc, 0, 0, s, ...

  6. react-native 支持 gif 图片

    只需要在android/app/build.gradle中的dependencies字段中添加: compile 'com.facebook.fresco:animated-gif:0.13.0' 然 ...

  7. SDUT 2133 数据结构实验之栈三:后缀式求值

    数据结构实验之栈三:后缀式求值 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的后缀表示式(基本操作数都是 ...

  8. oracle数据库如何备份一张表

    --用户名:tms--创建表ts_dictionary的备份create table ts_dictionary_20160715 as select * from ts_dictionary; 补充 ...

  9. smokeping 出现的问题

    Global symbol "%Config" requires explicit package name at /usr/lib64/perl5/lib.pm line 10. ...

  10. matlab的一个疑问?

    把逻辑值放入一个已知矩阵,为啥结果是:真就取矩阵的值,假就不取值? K>> aaaa=randi(10,10,2) aaaa = 6 3 10 4 6 7 5 2 6 3 8 2 1 2 ...