• [1669] xor的难题

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • 最近Alex学长有个问题被困扰了很久,就是有同学给他n个数,然后给你m个查询,然后每个查询给你l和r(左下标和右下标),然后问你每个查询l到r之间数字的xor值。(al ^ ... ^ ar)。

  • 输入
  • 输入t组数据,下一行输入n (1 <=n <=10^5)和m (1 <=m <= 10^4),第三行输入n个数字ai(0 <=ai <= 10^8),第四行输入m个询问l和r(1 <=l <=r <= n)。
  • 输出
  • 每个询问输出区间xor值的答案。
  • 样例输入
  • 1
    3 2
    0 1 2
    1 2
    3 3
  • 样例输出
  • 1
    2

    呃呃呃树状数组果然效果出众,从暴力800+ms变成了200+ms,学长深不可测,再感谢下阙神的指导,不然还不知道如何将树状数组扩展成异或形式求和。

    主要问题就是这个树状数组如何构建:

    首先建立一个一维(二维暂时没做到)的数组,作为树状数组的主体,然后运用add函数进行构建树状数组(每一个端点值附着在上面),然后用另一个getsum函数进行求和Sum[1~index]。当然一个区间和 Sum[L,R]=Sum[r]-Sum[l-1]。至此,一个树状数组普通求和就可以顺利进行了,那么异或求和例如an^an+1^......^am如何求和?通过阙神指导和之前的记忆,先把add和getsum中所有关于val(下标+号千万别动)的加号改为^号,然后最后答案的Sum[r]-Sum[l-1]中减号改为^号。

    代码:

  • #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<sstream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<deque>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<map>
    using namespace std;
    const int n = 100009;
    int tree[n];
    void add(int k, int val)
    {
    while (k <= n)
    {
    tree[k] ^= val; //加号改^号
    k += k & -k; //这里是下标的操作,不能动
    }
    }
    int getsum(int k)
    {
    int sum = 0;
    while (k)
    {
    sum ^= tree[k]; //加号改^号
    k -= k & -k; /
    }
    return sum;
    }
    int main(void)
    {
    int i, j, s, m, l, r, t, g;
    scanf("%d", &t);
    while (t--)
    {
    memset(tree, 0, sizeof(tree));
    scanf("%d%d", &g, &m);
    for (i = 1; i <= g; i++)
    {
    scanf("%d", &s);
    add(i, s); //枝点更新(附着)
    }
    for (i = 0; i < m; i++)
    {
    scanf("%d%d", &l, &r);
    printf("%d\n", getsum(r)^getsum(l - 1)); //减号改^号
    }
    }
    return 0;
    }

NOJ——1669xor的难题(详细的树状数组扩展—异或求和)的更多相关文章

  1. 树状数组区间加法&区间求和操作

    树状数组区间加法&区间求和操作 一般的树状数组解决区间加&单点询问并不复杂 但是要解决区间求和... 我们假设原数组是\(\{a_i\}\),差分数组\(\{d_i=a_i-a_{i- ...

  2. POJ 2155 Matrix(二维树状数组+区间更新单点求和)

    题意:给你一个n*n的全0矩阵,每次有两个操作: C x1 y1 x2 y2:将(x1,y1)到(x2,y2)的矩阵全部值求反 Q x y:求出(x,y)位置的值 树状数组标准是求单点更新区间求和,但 ...

  3. 【树状数组区间修改区间求和】codevs 1082 线段树练习 3

    http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...

  4. caioj1097: [视频]树状数组1(快速求和计算) cdq分治入门

    这题虽然是个树状数组,但是也可以用cdq分治做啊~~,这个就是一个浅显的二维偏序的应用? cdq分治和普通的分治有什么区别? 举个栗子:有4个小朋友,你请他们吃饭,假如你分治搞,就会分成很多子问题—— ...

  5. POJ3928Ping pong[树状数组 仿逆序对]

    Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3109   Accepted: 1148 Descrip ...

  6. HDU1541--Stars(树状数组)

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  7. 【BZOJ3132】【TYVJ1716】上帝造题的七分钟 二维树状数组

    题目大意 维护一个\(n\times m\)的矩阵,有两种操作: \(1~x_1~y_1~x_2~y_2~v\):把\((a,b),(c,d)\)为顶点的矩形区域内的所有数字加上\(v\). \(2~ ...

  8. BZOJ 3132(上帝造题的七分钟-树状数组求和+2D逆求和数组)

    3132: 上帝造题的七分钟 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 46  Solved: 18[Submit][Status][Discus ...

  9. BZOJ3132 上帝造题的七分钟 【二维树状数组】

    题目 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的 ...

随机推荐

  1. ueditor1_3_6 一点问题记录

    文件:getRemoteImage.php 第49行: if ( !in_array( $fileType , $config[ 'allowFiles' ] ) || stristr( $heads ...

  2. CodeForces 52C Circular RMQ (线段树)

    线段树区间更新维护最小值...记得下放标记... 如果线段树上的一个完整区间被修改,那么最小值和最大值增加相应的值后不变, 会改变是因为一部分改变而另外一部分没有改变所以维护一下就好. 询问的时候也要 ...

  3. self & this 上下文

    对象:指向对象的首地址: 函数:代表了函数运行的主要上下文: 内部:在类的内部使用. self Within the body of a class method, self refers to th ...

  4. Ubuntu编译Android源码过程中的空间不足解决方法

    Android源码一般几十G,就拿Android5.0来说,下载下来大概也有44G左右,和编译产生的文件以及Ubuntu系统占用的空间加起来,源码双倍的空间都不够有.编译源码前能分配足够的空间再好不过 ...

  5. session添加登录次数限制

    session 中设置了生存期,20分钟,输入密码错误次数保存到session 中,过一段时间自动解除: //登陆的用户名或者密码出错次数 int n = 0; if(logintimes == nu ...

  6. iOS与JS相互传值与交互

    JavaScriptCore是webkit的一个重要组成部分,主要是对JS进行解析和提供执行环境.iOS7后苹果在iPhone平台推出,极大的方便了我们对js的操作.我们可以脱离webview直接运行 ...

  7. Diff Two Arrays-freecodecamp算法题目

    Diff Two Arrays(比较两个数组) 1.要求 比较两个数组,然后返回一个新数组 该数组的元素为两个给定数组中所有独有的数组元素.换言之,返回两个数组的差异. 2.思路 定义一个新数组变量, ...

  8. 【two pointers 细节题】cf1041dD. Glider

    像这样细节老是打挂不行啊…… A plane is flying at a constant height of hh meters above the ground surface. Let's c ...

  9. MySQL 自学笔记_Union(组合查询)

    1. Union查询简介 组合查询:有时在使用select语句进行数据查询时,想要将多个select语句在一个查询结果中输出,此时就需要使用Union关键字. Union的使用方法:用union将多个 ...

  10. centos7安装pgsql及操作命令

    1.下载所需要的数据库版本https://yum.postgresql.org/repopackages.php 2.安装数据库版本包 yum install -y https://download. ...