zoukankan      html  css  js  c++  java
  • CodeForces-617E XOR And Favorite Numbers(莫队)

    Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pair li and ri and asks you to count the number of pairs of integers i and j, such that l ≤ i ≤ j ≤ r and the xor of the numbers ai, ai + 1, ..., ajis equal to k.

    Input

    The first line of the input contains integers nm and k (1 ≤ n, m ≤ 100 000, 0 ≤ k ≤ 1 000 000) — the length of the array, the number of queries and Bob's favorite number respectively.

    The second line contains n integers ai (0 ≤ ai ≤ 1 000 000) — Bob's array.

    Then m lines follow. The i-th line contains integers li and ri (1 ≤ li ≤ ri ≤ n) — the parameters of the i-th query.

    Output

    Print m lines, answer the queries in the order they appear in the input.

    Examples

    Input
    6 2 3
    1 2 1 1 0 3
    1 6
    3 5
    Output
    7
    0
    Input
    5 3 1
    1 1 1 1 1
    1 5
    2 4
    1 3
    Output
    9
    4
    4

    Note

    In the first sample the suitable pairs of i and j for the first query are: (1, 2), (1, 4), (1, 5), (2, 3), (3, 6), (5, 6), (6, 6). Not a single of these pairs is suitable for the second query.

    In the second sample xor equals 1 for all subarrays of an odd length.

    题解:首先要知道 a^b=c 等价于 a=c^b;   我们用a[i]记录前I个数的异或和,然后离线处理所有区间(对于所有区间我们按L所在块为第一排序,该询问的r为第二排序,对所有询问区间排序);

    对于新增加的一个数我们加上前区间异或等于k^s的数的个数,然后更新一下异或为s的数量,对于一个需要去掉的数,我需要先新更新这个数的数量,然后减去k^s的数量即可;

    离线跑一遍,

    参考代码为:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<algorithm>
     6 #define LL long long
     7 using namespace std;
     8 const int Max = 1100000;
     9 const int MAXM = 1<<22;
    10 struct Point
    11 {
    12     int L ,R,Id;
    13 } a[Max];
    14 
    15 LL sum[Max],ans[Max],k;
    16 int n,m,L,R;
    17 LL cnt[MAXM],ant;
    18 bool cmp(Point b,Point c)
    19 {
    20     return b.L/400==c.L/400? b.R<c.R:b.L<c.L;
    21 }
    22 void Dec(LL s) 
    23 {
    24     --cnt[s];
    25     ant-=cnt[s^k];
    26 }
    27 void Inc(LL s)
    28 {
    29     ant += cnt[s^k];
    30     cnt[s]++;
    31 }
    32 int main()
    33 {
    34     scanf("%d %d %lld",&n,&m,&k);
    35     LL data;
    36     for(int i=1;i<=n;i++) scanf("%lld",&sum[i]),sum[i]^=sum[i-1];    
    37     for(int i=1;i<=m;i++) scanf("%d %d",&a[i].L,&a[i].R),a[i].Id = i,a[i].L--;
    38     sort(a+1,a+m+1,cmp);
    39     L=0,R=0,cnt[0]=1,ant=0;
    40     for(int i=1;i<=m;i++)
    41     {
    42         while(R<a[i].R) Inc(sum[++R]);
    43         while(R>a[i].R) Dec(sum[R--]);      
    44         while(L<a[i].L) Dec(sum[L++]);       
    45         while(L>a[i].L) Inc(sum[--L]);        
    46         ans[a[i].Id]=ant;
    47     }
    48     for(int i=1;i<=m;i++) printf("%lld
    ",ans[i]);
    49     return 0;
    50 }
    View Code
  • 相关阅读:
    解决request.getRemoteAddr()获取的值为0:0:0:0:0:0:0:1这个小问题
    百度编辑器
    java程序中输出console的日志到文本
    收集常用的.net开源项目
    Html Agility Pack基础类介绍及运用
    HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦
    HTML WEB 和HTML Agility Pack结合
    HtmlWeb类
    简单方便统一封装的傻瓜式GET/POST库AliasNet正式公布~开源喽~
    HtmlAgilityPack.dll的使用 获取HTMLid
  • 原文地址:https://www.cnblogs.com/csushl/p/9503179.html
Copyright © 2011-2022 走看看