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

来源:互联网 发布:收据软件 编辑:程序博客网 时间:2024/06/02 05:30

E. XOR and Favorite Number
time limit per test4 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
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, …, aj is equal to k.

Input
The first line of the input contains integers n, m 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.

题意:给你一个序列,K次询问,每次给出一个L,R;询问,从L到R之间有多少个子区间满足异或和为K;

分析:题目给的1e6,但是实际异或操作会超过1e6。区间暴力问题,莫队!
Ans和flag注意使用long long int。

时间复杂度:O(n^1.5)

学习资料参考于:bilibili 莫队算法 卿学姐。

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<iomanip>#include<algorithm>using namespace std;#define ll long long intconst int maxn = 1 << 20;int a[maxn]; int n, m, k;ll ans[maxn], flag[maxn];int pos[maxn];struct node {    int l, r;    int id;}Q[maxn];bool cmp(node a, node b) {    if (pos[a.l] == pos[b.l])        return a.r < b.r;    return pos[a.l] < pos[b.l];}int L = 1, R = 0;ll Ans = 0;void add(int x) {    Ans += flag[a[x] ^ k];    flag[a[x]]++;}void del(int x) {    flag[a[x]]--;    Ans -= flag[a[x] ^ k];}int main(){    scanf("%d%d%d", &n, &m, &k);    int sz = sqrt(n);    for (int i = 1; i <= n; i++) {        scanf("%d", &a[i]);        a[i] = a[i] ^ a[i - 1];        pos[i] = i / sz;    }    for (int i = 1; i <= m; i++) { //离线操作        scanf("%d%d", &Q[i].l, &Q[i].r);        Q[i].id = i;    }    sort(Q + 1, Q + 1 + m, cmp);    flag[0] = 1;    for (int i = 1; i <= m; i++) {        while (L < Q[i].l) {            del(L - 1);            L++;        }        while (L > Q[i].l) {            L--;            add(L - 1);        }        while (R < Q[i].r) {            R++;            add(R);        }        while (R > Q[i].r) {            del(R);            R--;        }        ans[Q[i].id] = Ans;    }    for (int i = 1; i <= m; i++) {        printf("%lld\n", ans[i]);    }    return 0;}
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一支耳朵有点聋怎么办 80岁老人耳朵聋怎么办 被nlp课程洗脑了怎么办 手上张了个鸡眼怎么办 手上长了个鸡眼怎么办 6岁儿童手指脱皮怎么办 手指骨折后关节僵硬怎么办 手指外伤后关节肿大僵硬怎么办 胳膊骨折了手肿怎么办 耳朵被肘了耳鸣怎么办 耳朵鼓膜外显的怎么办 耳膜破了怎么办为好 耳朵的鼓膜破了怎么办 被打耳鼓膜穿孔怎么办 两只耳朵嗡嗡响怎么办 耳朵长了个脓包怎么办 胸一个大一个小怎么办 把耳朵掏出血了怎么办 掏耳朵戳出血了怎么办 耳朵戳伤流血了怎么办 耳朵挖破出血了怎么办 耳朵让耳屎堵了怎么办 手被牙齿划破了怎么办 耳朵掏伤了很痛怎么办 掏伤耳朵发炎了怎么办 耳朵被掏发炎了怎么办 打的耳洞化脓了怎么办 打了耳洞流脓了怎么办 打了耳洞发炎怎么办 打了耳洞化脓了怎么办 3岁宝宝耳朵流脓怎么办 耳朵里面是湿的怎么办 耳朵里天天很痒怎么办 身上长湿疹很痒怎么办 嗓子干疼耳朵痒怎么办 上火了耳朵嗡嗡响怎么办 太阳凹颧骨外扩怎么办 4岁儿童脊柱侧弯怎么办 瘦的人得多囊怎么办 智齿刚长出来该怎么办 宝宝耳朵睡尖了怎么办