• [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. UVA 1153 Keep the Customer Satisfied 顾客是上帝(贪心)

    因为每增加一个订单,时间是会增加的,所以先按截止时间d排序, 这样的话无论是删除一个订单,或者增加订单,都不会影响已经选好的订单. 然后维护一个已经选好的订单的大根堆(优先队列),如果当前无法选择的话 ...

  2. Kunernetes集群架构与组件

    架构如图: master节点:主要是集群控制面板的功能,来管理整个集群,包括全局的角色,调度,都是在master节点进行控制 有三个组件: API Server:  是 k8s提供的一个统一入口,它是 ...

  3. 解除phpMyAdmin导入大型MySQL数据库文件大小限制

    phpMyAdmin 导入大型数据库文件大小限制配置… 1. 修改 php.ini 文件中下列3项的值: upload_max_filesize, memory_limit 和 post_max_si ...

  4. Beta冲刺(周五)

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1 这个作业要求在哪里 https://edu.cnblo ...

  5. c++ 调用php

    int _System(const char * cmd, std::string& strRet) { FILE * fp; char * p = NULL; ; if ((fp = _po ...

  6. stack与heap、new的内存分配、static对象。(effective c++ 04)

    阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象."不同编译单元内定义的non-local static对象". 了解一下.    目录 sta ...

  7. Linux菜鸟起飞之路【十】进程管理

    一.基本概念 进程:程序的一次动态执行 守护进程:在后台运行并提供系统服务的进程 僵尸进程:完成了生命周期但却依然留在进程表中的进程,我们称之为 “僵尸进程” 父进程:指已创建一个或多个子进程的进程. ...

  8. Python入门基本语法

      Python入门 以下主要讲述Python的一些基础语法,包含行的缩进在python中的重要意义,python中常见的保留字和引号的使用,如何实现单行注释和多行注释. print("he ...

  9. Python9-事件及队列-day37

    信号量 from multiprocessing import Process from multiprocessing import Semaphore import time import ran ...

  10. solr配置中文分词器

    配置IK分词器 在/opt/solr-7.7.1/server/solr-webapp/webapp/WEB-INF/lib目录中加入IK分词器的jar包 在/opt/solr-7.7.1/serve ...