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

题目链接:http://codeforces.com/problemset/problem/617/E

题目:

  给你a1 a2 a3 ··· an 个数,m次询问:在[L, R] 里面又多少中 [l, r] 使得 al xor al+1 xor ··· ar 为 k。

题解:

  本题只有区间查询没有区间修改,而且数据量不大(10w),所以可以用离线的方法解决。

  使用莫队算法来解决,就需要O(1)的修改[L, R+1] 、[L, R-1]、[L+1, R]、[L-1, R]。

  详细的莫队可以百度学一下。

  这里讲一下怎么样通过O(1)来修改

  1)我们需要求前缀xor。

  2)[L, R] -> [L, R+1]:这里添加了一个aR+1 , 就可以通过前缀xor T,所以我们需要找 T ^ k  H 的个数(因为H^T=K-> H=T^K)。

      如果H在前面出现过,比如(全部是前缀xor)1 2 1[加入]。这时xor 为1 ,我们当k为0, 那么 0^1 = 1的个数就为1。

      这里的1的数量有什么意义。如果我们要想 1 [2 1] 这一段的xor ,是不是应该  T3(1)xor T1(1) = 0 = k;

    [L, R] -> [L, R-1] : 这里是删除了一个a, num[TaR] --, 我们要求的是 k^ TaR 的个数 。

      1 2 1 1[删除], k = 0, 0^1 = 1 , 这个有2个1。这里2个的意思 1 [2 1 1] ( T4 xor T1 = 0)和 1 2 1 [1]  (T4 xor T3 = 0),因为删去了aR 所以aR 结尾的区间就要减去。

    [L, R] -> [L-1, R] : 这个是增加多一个 aL-1  。就是在[L-1, R] 这个里面找 [L-1, r(r<R)] 使得xor 为k , 所以就需要 k^((L-1)-1)。

    [L, R] -> [L+1, R] :这里是删除了 aL 。就是在 [L, r(r<R)] 找 xor 为 k 的 。T[r]^T[L-1] = k。

      num[0] = 1 。这里是应为一开始前缀异或为0 .

 

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <string>
  5 #include <algorithm>
  6 #include <cmath>
  7 #include <vector>
  8 #include <queue>
  9 #include <stack>
 10 #include <set>
 11 using namespace std;
 12 typedef long long LL;
 13 #define ms(a, b) memset(a, b, sizeof(a))
 14 #define pb push_back
 15 #define mp make_pair
 16 const int INF = 0x7fffffff;
 17 const int inf = 0x3f3f3f3f;
 18 const int mod = 1e9+7;
 19 const int maxn = 100000+10;
 20 int a[maxn];
 21 LL num[3000010];
 22 LL x[maxn];
 23 LL ans[maxn];
 24 struct Point
 25 {
 26     int l, r, id;
 27 }node[maxn];
 28 int unit, n, m, k;
 29 void init() {
 30     ms(a, 0);
 31     ms(ans, 0);
 32     ms(num, 0);
 33     ms(x, 0);
 34 }
 35 bool cmp(Point x1, Point x2)
 36 {
 37     if(x1.l/unit != x2.l/unit){
 38         return x1.l/unit < x2.l/unit;
 39     }
 40     else
 41         return x1.r < x2.r;
 42 }
 43 void work()
 44 {
 45     for(int i = 1;i<=n;i++)
 46         x[i] = x[i-1]^a[i];
 47
 48     int L, R;
 49     LL temp = 0;
 50     L = 1, R = 0;
 51     num[0]++;
 52     for(int i = 0;i<m;i++){
 53         while(R<node[i].r){
 54             R++;
 55             temp+=num[k^x[R]];
 56             num[x[R]]++;
 57         }
 58         while(R>node[i].r){
 59             num[x[R]]--;
 60             temp-=num[x[R]^k];
 61             R--;
 62         }
 63         while(L>node[i].l){
 64             L--;
 65             temp+=num[k^x[L-1]];
 66             num[x[L-1]]++;
 67         }
 68         while(L<node[i].l){
 69             num[x[L-1]]--;
 70             temp-=num[x[L-1]^k];
 71             L++;
 72         }
 73         ans[node[i].id] = temp;
 74     }
 75 }
 76 void solve() {
 77     scanf("%d%d%d", &n, &m, &k);
 78     unit = (int)sqrt(n);
 79     for(int i = 1;i<=n;i++) scanf("%d", &a[i]);
 80     for(int i = 0;i<m;i++){
 81         node[i].id = i;
 82         scanf("%d%d", &node[i].l, &node[i].r);
 83     }
 84     sort(node, node+m, cmp);
 85     work();
 86     for(int i = 0;i<m;i++){
 87         printf("%lld\n", ans[i]);
 88     }
 89 }
 90 int main() {
 91 #ifdef LOCAL
 92     freopen("input.txt", "r", stdin);
 93 //        freopen("output.txt", "w", stdout);
 94 #endif
 95 //    ios::sync_with_stdio(0);
 96 //    cin.tie(0);
 97
 98     init();
 99     solve();
100
101     return 0;
102 }

时间: 2024-10-29 19:12:05

codeforces 617 E. XOR and Favorite Number(莫队算法)的相关文章

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

E. XOR and Favorite Number 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

Codeforces 617 E. XOR and Favorite Number

题目链接:http://codeforces.com/problemset/problem/617/E 一看这种区间查询的题目,考虑一下莫队. 如何${O(1)}$的修改和查询呢? 令${f(i,j)}$表示区间${\left [ l,r \right ]}$内数字的异或和. 那么:${f(l,r)=f(1,r)~~xor~~f(1,l-1)=k}$ 记一下前缀异或和即可维护. 1 #include<iostream> 2 #include<cstdio> 3 #include&l

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 seconds memory limit per test 256 megabytes input standard input output standard output Bob has a favorite number k and ai of length n. Now he asks yo

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

E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard 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 pai

CodeFroce Round 340 div2 E XOR and Favorite Number【莫队算法】

题面: 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?

CodeForces - 86D 莫队算法

http://codeforces.com/problemset/problem/86/D 莫队算法就是调整查询的顺序,然后暴力求解. 每回可以通过现有区间解ans(l,r)得到区间(l+1,r),(l-1,r),(l,r+1),(l,r-1)的区间解. 调整方式http://blog.csdn.net/bossup/article/details/39236275 这题比那个还要简单,查询的是K^2*Z,很清楚就是莫队算法,然而做的时候没有学过,回来补题补到 关键是我一直没明白为什么重载小于号

[莫队算法 线段树 斐波那契 暴力] Codeforces 633H Fibonacci-ish II

题目大意:给出一个长度为n的数列a. 对于一个询问lj和rj.将a[lj]到a[rj]从小到大排序后并去重.设得到的新数列为b,长度为k,求F1*b1+F2*b2+F3*b3+...+Fk*bk.当中F为斐波那契数列.F1=F2=1.对每一个询问输出答案模m. 区间查询离线 用莫队算法 开棵权值线段树,然后用斐波那契的性质update F(n+m)=F(n+1)*F(m)+F(n)*F(m-1); #include<cstdio> #include<cstdlib> #includ

【莫队算法】【权值分块】poj2104 K-th Number / poj2761 Feed the dogs

先用莫队算法保证在询问之间转移的复杂度,每次转移都需要进行O(sqrt(m))次插入和删除,权值分块的插入/删除是O(1)的. 然后询问的时候用权值分块查询区间k小值,每次是O(sqrt(n))的. 所以总共的复杂度是O(m*(sqrt(n)+sqrt(m)))的. 常数极小. 别的按权值维护的数据结构无法做到O(1)地插入删除. poj2104 的输出优化 别忘了处理负数. 完爆主席树,这份代码目前在 poj2761 上 Rank1. Rank Run ID User Memory Time

D. Powerful array 离线+莫队算法 给定n个数,m次查询;每次查询[l,r]的权值; 权值计算方法:区间某个数x的个数cnt,那么贡献为cnt*cnt*x; 所有贡献和即为该区间的值;

D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input standard input output standard output An array of positive integers a1,?a2,?...,?an is given. Let us consider its arbitrary subarray al,?al?+?1...,?ar, where 1?