Time Limit: 2000 ms   Memory Limit: 256 MB

Description

  给定一个含有n个整数的序列 a1, a2,..., an.

  定义 f(x,x) = a[x], f(x,y) = a[x] xor a[x + 1] xor ... xor a[y] (y > x).

  本题设有m组询问,每组询问含有两个参数 (l, r) 。对于每组询问,你需要回答有多少个二元组 (x, y) 满足 l <= x <= y <= r 并且 f(x, y) = k.

Input

  第一行有3个整数, n, m, k(1 <= n <= 100000, 1 <= m <= 100000, 0 <= k < 10^6).
  第二行共有 n 个非负整数代表整个序列,每个整数均不超过 10^6.
  接下来m行,每行两个整数 (li, ri), li <= ri

Output

  对于每组询问,输出一行表示有多少满足上述条件的二元组。

Sample Input

Sample Output

5 2 1
1 0 1 1 0
1 2
2 5

2

4

Hint 

  对于10%的数据,$n, m \leq 500$

  对于30%的数据,$n, m \leq 3000$

  对于50%的数据,$n, m \leq 30000$

  对于100%的数据,$n, m \leq 100000$


题解:

  一看范围就知道是标准$n\sqrt{n}$莫队啊,是我今天感冒脑抽了想不出这么简单的处理吗......

  

  $[l,r]$异或起来的值刚好等于$k$,维护异或前缀和$a$后,等价于判断$a_{l-1}\hat{} a_{r}$是否等于$k$。

  那么用莫队在这个异或前缀和数组上爬。

  维护莫队中统计每种值出现次数的数组$cnt$,$cnt_i$表示值为$i$的有多少。

  这样一来,加入一位$x$对莫队的影响就是$ans+=cnt_{a[x]\hat{} k}$,删去一位对莫队的影响就是$ans-=cnt_{a[x]\hat{} k}$

  当然还要维护$cnt$,加入时先统计影响,再将$cnt_{a[x]}++$;删除时先从$cnt$里抹掉:$cnt_{a[x]}--$,再统计影响。

Tips:

  1.原本$[l,r]$的询问,转换后最大要考虑到$[l-1,r]$,所以把询问的左端点都-1.

  2.异或后值可能大于1000000,需多开一倍。


 #include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=;
int n,m,k,di,a[N],cnt[];
ll now,out[N];
struct Query{
int l,r,id;
friend bool operator < (Query x,Query y){
x.l++; y.l++;
if(x.l/di!=y.l/di) return x.l/di<y.l/di;
return x.r<y.r;
}
}q[N];
void add(int x){
now+=cnt[a[x]^k];
cnt[a[x]]++;
}
void dec(int x){
cnt[a[x]]--;
now-=cnt[a[x]^k];
}
int main(){
scanf("%d%d%d",&n,&m,&k);
di=(int)sqrt(n);
for(int i=,x;i<=n;i++){
scanf("%d",&x);
a[i]=a[i-]^x;
}
for(int i=;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].l--; q[i].id=i;
}
sort(q+,q++m);
int l=,r=;
cnt[a[]]=;
for(int i=;i<=m;i++){
while(r<q[i].r) add(++r);
while(r>q[i].r) dec(r--);
while(l<q[i].l) dec(l++);
while(l>q[i].l) add(--l);
out[q[i].id]=now;
}
for(int i=;i<=m;i++) printf("%lld\n",out[i]);
return ;
}

奇妙代码

XOR (莫队)的更多相关文章

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

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

  2. Codeforeces 617E XOR and Favorite Number(莫队+小技巧)

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

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

    E. XOR and Favorite Number 题目连接: http://www.codeforces.com/contest/617/problem/E Descriptionww.co Bo ...

  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. CodeForces - 617E XOR and Favorite Number 莫队算法

    https://vjudge.net/problem/CodeForces-617E 题意,给你n个数ax,m个询问Ly,Ry,  问LR内有几对i,j,使得ai^...^ aj =k. 题解:第一道 ...

  6. CODEFORCES 340 XOR and Favorite Number 莫队模板题

    原来我直接学的是假的莫队 原题: Bob has a favorite number k and ai of length n. Now he asks you to answer m queries ...

  7. XOR Queries(莫队+trie)

    题目链接: XOR Queries 给出一个长度为nn的数组CC,回答mm个形式为(L, R, A, B)(L,R,A,B)的询问,含义为存在多少个不同的数组下标k \in [L, R]k∈[L,R] ...

  8. 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 ...

  9. codeforces 617E E. XOR and Favorite Number(莫队算法)

    题目链接: E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes i ...

随机推荐

  1. freemarker中值比较的写法

    因为freemarker中不能使用<.>的方式进行值的比较,大于使用gt,小于使用lt.所以集合大于0判断,如下: <#if students?size gt 0><#i ...

  2. YourSQLDba介绍

    YourSQLDba介绍 YourSQLDba是一个法国人写的程序,它是由一系列T-SQL存储过程构成的脚本文件.可以理解成一个组件或安装包,从而简化了在Mircorsoft SQL Server 2 ...

  3. AM调制的FPGA实现

    一.说明: 功能:AM调制 平台:Vivado 2016.4 和 Matlab R2017a 二.原理: 1. AM调制原理 AM已调信号的时域表达式: 已调信号的频域表达式: 本质上AM调制就是频谱 ...

  4. 【转】GPS静态观测网的设计指标

     GPS网的设计指标是指导GPS网设计量化因子,是评价GPS网设计优劣的数值标准.评价GPS网设计的优劣主要从以下三个因素考虑:1.质量(包括精度和可靠性):2.效率:3.费用. 一.GPS网设计的精 ...

  5. 【转】GPS定位原理

    一.距离测定原理 1.伪距测量 伪距测量是利用全球卫星定位系统进行导航定位的最基本的方法,其基本原理是:在某一瞬间利用GPS接收机同时测定至少四颗卫星的伪距,根据已知的卫星位置 和伪距观测值,采用距离 ...

  6. print,printf,println

    1.print,打印你要打印的东西. 2.printf,可以定义要打印数据的格式,弄个%d,%f之类的.而print不行. 3.println, 会在打印完内容后换行. println和print的差 ...

  7. 使用命令行生成jar包

    测试用类 public class Hello { public static void main(String[] args) { System.out.println("hello wo ...

  8. 手把手的SpringBoot教程,SpringBoot创建web项目(一)

    1.引子 大家好,在接下里的半个多小时,我会给大家详细的介绍SpringBoot的基本使用,相信学完这门课程以后,你会对SpringBoot有一个清晰的认识,并且能够运用这门比较新颖的技术开发一些小程 ...

  9. 初识Python装饰器

    python中,一切皆对象.做为面向对象开发中非常重要的一个环节,函数有着无可替代的作用. 函数可以作为对象赋值给一个变量,可以作为元素添加到集合对象中,可以作为参数值传递给其它函数,还可以当做函数的 ...

  10. python中的线程

    1.线程的创建 1.1 通过thread类直接创建 import threading import time def foo(n): time.sleep(n) print("foo fun ...