Codeforces617E【莫队算法+前缀异或】
题意:
给出一系列数,对每个查询区间,计算有多少个子区间异或为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【莫队算法+前缀异或】的更多相关文章
- 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 ...
- Codeforces617 E . XOR and Favorite Number(莫队算法)
XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...
- Codeforces 617E XOR and Favorite Number(莫队算法)
题目大概说给一个序列,多次询问区间异或和为k的连续子序列有多少个. 莫队算法,利用异或的性质,通过前缀和求区间和,先处理出序列各个前缀和,然后每次区间转移时维护i以及i-1前缀和为某数的个数并增加或减 ...
- XOR and Favorite Number(莫队算法+分块)
E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- B 洛谷 P3604 美好的每一天 [莫队算法]
题目背景 时间限制3s,空间限制162MB 素晴らしき日々 我们的情人,不过是随便借个名字,用幻想吹出来的肥皂泡,把信拿去吧,你可以使假戏成真.我本来是无病呻吟,漫无目的的吐露爱情---现在这些漂泊不 ...
- 「知识学习&日常训练」莫队算法(一)(Codeforce Round #340 Div.2 E)
题意 (CodeForces 617E) 已知一个长度为\(n\)的整数数列\(a[1],a[2],-,a[n]\),给定查询参数\(l,r\),问\([l,r]\)内,有多少连续子段满足异或和等于\ ...
- CF 617E【莫队求区间异或和】
E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- 莫队算法初识~~CodeForces - 617E
E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- 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 ...
随机推荐
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器
参考: 1,使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(一)http://blog.csdn.net/xdwyyan/article/details/4319 ...
- importlib模块 反射字符串的对象
通过 importlib模块 反射字符串的对象 Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux ...
- 《机器学习实战》学习笔记第七章 —— AdaBoost元算法
主要内容: 一.提升方法与AdaBoost算法的简介 二.AdaBoost算法 三.代码解释 一.提升方法与AdaBoost算法的简介 1.提升方法:从弱学习算法出发,反复学习,得到一系列弱分类器(又 ...
- blog首页视图
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 django 是如何处理 http 请求 ...
- matlab之mean()函数
mean(A,1):沿着第一维(列)求平均值: mean(A,2):沿着第二维(行)求平均值: 举例: Z=[1 2 3;4 5 6]; >> mean(Z,1) ans = 2.5000 ...
- Android sdk 搭建
下载安装 http://pan.baidu.com/wap/share/home?uk=67915989&third=0 搭建Android环境时,无论使用的Eclipse还是Android ...
- 【HDU 4807】Lunch Time 最小费用最大流
题意 在一个有向图当中,现在每一条边带有一个容量,现在有K个人在起点,需要到终点去吃饭,询问这K个人最后一个人到达食堂的最小时间是多少 贴一篇题解:http://blog.csdn.net/u0137 ...
- Ubuntu16.04上安装arm-linux-gcc4.4.3
一.首先下载arm-linux-gcc-4.4.3.tar.gz安装包,安装包地址: http://www.cr173.com/soft/42654.html 二.解压安装包: sudo tar -z ...
- poj1011 Sticks[剪枝题]
https://vjudge.net/problem/POJ-1011 此题很重要.★★★ 很欢(e)乐(xin)的一道搜索剪枝题..poj数据还是太水了,我后来想不出来剪枝方法了,就加了句掐了时间语 ...
- 转学习LINUX的建议
作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下.在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会).C语言要学到什 ...