传送门

题意:给出一个长度为$N$的非负整数序列,求其中所有连续区间的区间和的异或值。$N \leq 10^5$,所有元素之和$\leq 10^6$


设序列的前缀和为$s_i$,特殊地,$s_0=0$

因为最后答案是一个异或值,所以我们考虑按位计算答案,也就是计算所有区间和中某一位上的$1$的个数。

考虑区间$[j+1,i]$在第$t$位上是否产生贡献,假设$s_i$的第$0$到$t-1$位的数字为$x$,$s_j$的第$0$到$t-1$位的数字为$y$,分类讨论:

①如果$s_i$的第$t$位为$1$,则$s_j$要么$t$位为$0$且$y<x$,要么$t$位为$1$且$y>x$

②如果$s_i$第$t$位为$0$,情况与上面相反。

可以发现不论什么情况,会产生贡献的$s_j$在$0-t$位上的取值表现为一段区间。于是使用树状数组维护这一段区间,每一次计算$s_i$对应的答案,然后把$s_i \text{& (1 << t) - 1}$丢入树状数组即可。复杂度$O(nlognlog10^6)$

 #include<bits/stdc++.h>
 using namespace std;

 inline int read(){
     ;
     char c = getchar();
     while(!isdigit(c))
         c = getchar();
     while(isdigit(c)){
         a = (a << ) + (a << ) + (c ^ ');
         c = getchar();
     }
     return a;
 }

 const int MAXN = 1e5 , MAXM = 2e6;
 ];
 ] , N;

 inline int lowbit(int now){
     return now & -now;
 }

 inline void add(int now){
     now++;
     while(now < MAXM){
         treeNum[now]++;
         now += lowbit(now);
     }
 }

 inline int getSum(int now){
     now++;
     ;
     while(now){
         sum += treeNum[now];
         now -= lowbit(now);
     }
     return sum;
 }

 int main(){
     N = read();
     ;
      ; i <= N ; i++)
         num[i] = read() + num[i - ];
      ; i <  ; i++){
         memset(treeNum ,  , sizeof(treeNum));
         ;
          ; j <= N ; j++){
              << i))
                 cnt = (cnt + getSum(( << i + ) - ) - getSum(num[j] & ( << i + ) - ) + getSum(num[j] & ( << i) - )) & ;
             else
                 cnt = (cnt + getSum(((num[j] & ( << i) - ) |  << i)) - getSum(num[j] & ( << i) - )) & ;
             add(num[j] & ( << i + ) - );
         }
         ans += cnt * ( << i);
     }
     cout << ans;
     ;
 }

Luogu3760 TJOI2017 异或和 树状数组的更多相关文章

  1. BZOJ.4888.[TJOI2017]异或和(树状数组)

    BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...

  2. [BZOJ4888][TJOI2017]异或和(树状数组)

    题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...

  3. 【Foreign】异色弧 [树状数组]

    异色弧 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 8 1 ...

  4. P5057 [CQOI2006]简单题 前缀异或差分/树状数组

    好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...

  5. 洛谷 P6225 [eJOI2019]异或橙子 (树状数组)

    题意:有\(n\)个数,起始值均为\(0\),进行\(q\)次操作,每次输入三个数,如果第一个数为\(1\),则将第\(i\)个数修改为\(j\),如果为\(2\),则求区间\([l,r]\)内的所有 ...

  6. [CSP-S模拟测试]:异或(树状数组+LCA)

    题目传送门(内部题21) 输入格式 第一行一个字符串$str$,表示数据类型.第二行一个正整数$k$,表示集合$K$的大小,保证$k>1$.接下来$k$行每行$k$个数,第$i$行第$j$个数表 ...

  7. 【BZOJ4888】[TJOI2017]异或和(树状数组)

    [BZOJ4888][TJOI2017]异或和(树状数组) 题面 BZOJ 洛谷 题解 考虑每个位置上的答案,分类讨论这一位是否存在一,值域树状数组维护即可. #include<iostream ...

  8. BZOJ4888 [Tjoi2017]异或和 【树状数组】

    题目链接 BZOJ4888 题解 要求所有连续异或和,转化为任意两个前缀和相减 要求最后的异或和,转化为求每一位\(1\)的出现次数 所以我们只需要对每一个\(i\)快速求出\(sum[i] - su ...

  9. BZOJ4888 [Tjoi2017]异或和 FFT或树状数组+二进制拆位

    题面 戳这里 简要题解 做法一 因为所有数的和才100w,所以我们可以直接求出所有区间和. 直接把前缀和存到一个权值数组,再倒着存一遍,大力卷积一波. 这样做在bzoj目前还过不了,但是luogu开O ...

随机推荐

  1. HTTP协议web开发知识点

    HTTP协议 HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数 ...

  2. IDEA项目搭建八——使用MybatisPlus简化数据库交互

    一.MybatisPlus简化数据库交互 我们使用Mybatis发现需要在mapper.xml中写很多重复的简单CRUD(增删改查),使用MybatisPlus可以大大简化这部分代码,官方文档http ...

  3. Spark Word2Vec算法代码实现

    1 import com.hankcs.hanlp.tokenizer.NLPTokenizer import org.apache.hadoop.io.{LongWritable, Text} im ...

  4. [20180705]关于hash join 2.txt

    [20180705]关于hash join 2.txt --//昨天优化sql语句,执行计划hash join right sna,加入一个约束设置XX字段not null,逻辑读从上万下降到50.- ...

  5. python第六十天-----RabbitMQ

    RabbitMQ消息队列:默认为消息轮循模式,按client端启动是顺序接收 server端 import pika connection = pika.BlockingConnection(pika ...

  6. Spring 12 种 常用注解!

    1.声明bean的注解 @Component 组件,没有明确的角色 @Service 在业务逻辑层使用(service层) @Repository 在数据访问层使用(dao层) @Controller ...

  7. 高通 sensor 从native到HAL

    app注册传感器监听 Android Sensor Framework 的整体架构如下图所示: 前几篇sensor相关的文章介绍了sensor的hal的知识,以press_sensor实时显示气压坐标 ...

  8. ws协议的配置

    server { listen 80; server_name 域名或IP; rewrite ^(.*)$ https://$host$1 permanent; } server { listen 4 ...

  9. Win10更换电脑,又不想重装系统的解决方法

    问题描述: 在公司因为两年前用的i3的电脑很卡,然后想换i5的电脑,但是又不想重装系统,因为安装的东西太多了,重装很麻烦 Windows to go介绍: Windows To Go是Windows ...

  10. creo5.0安装教程(图文详解)

    PTC公司最近发布了Creo 5.0正式版 ,作为最具其革命性的新一代产品设计软件,其所提供专业的二维和三维设计设计,能帮助企业和公司进行产品生命周期管理(PLM)和制定服务管理解决方案.Creo5. ...