红球进黑洞【线段树区间更新+二进制异或处理】【牛客小白月赛9-C】

2023-11-04

题目链接


  给你N个点,M次查询,问的是(一)、区间【l, r】的数的总和;(二)、把区间【l, r】上的所有点去异或(xor)一个数X。


  一开始用了点更新,然后T了,想了一会,最后在比赛结束前终于美滋滋的完成了AC,庆幸,我的想法是这样的,将每个点的值用一个另开的[22]位二进制来存。放心,22位是绝对够的,然后向上更新的是每一位的个数和。这样,就能保证线段树区间更新的速率了。


具体看一下代码(学院派还是很好懂的)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 100005;
int N, M, op, L, R, Xi;
ll tree[maxN<<2][25], lazy[maxN<<2], ans;
void pushup(int rt)
{
    for(int i=0; i<22; i++)
    {
        tree[rt][i] = tree[rt<<1][i] + tree[rt<<1|1][i];
    }
}
void buildTree(int rt, int l, int r)
{
    lazy[rt] = 0;
    if(l == r)
    {
        ll x;  scanf("%lld", &x);
        for(int i=0; i<22; i++)
        {
            if( ((x>>i)&1) ) tree[rt][i] = 1;
            else tree[rt][i] = 0;
        }
        return;
    }
    int mid = (l + r)>>1;
    buildTree(rt<<1, l, mid);
    buildTree(rt<<1|1, mid+1, r);
    pushup(rt);
}
void pushdown(int rt, int l, int r)
{
    int mid = (l + r)>>1;
    if(lazy[rt])
    {
        lazy[rt<<1|1] = lazy[rt<<1|1]^lazy[rt];
        lazy[rt<<1] = lazy[rt<<1]^lazy[rt];
        for(int i=0; i<22; i++)
        {
            int tmp = ( ((lazy[rt]>>i)&1) );
            if(tmp)
            {
                tree[rt<<1][i] = mid-l+1-tree[rt<<1][i];
                tree[rt<<1|1][i] = r-mid-tree[rt<<1|1][i];
            }
        }
        lazy[rt] = 0;
    }
}
void update(int rt, int l, int r, int ql, int qr, int val)
{
    int mid = (l + r)>>1;
    if(ql<=l && qr>=r)
    {
        lazy[rt] = (lazy[rt]^val);
        for(int i=0; i<22; i++)
        {
            int tmp = ( (val>>i)&1 );
            if(tmp == 1)
            {
                tree[rt][i] = r-l+1-tree[rt][i];
            }
        }
        return;
    }
    pushdown(rt, l, r);
    if(ql>mid) update(rt<<1|1, mid+1, r, ql, qr, val);
    else if(qr<=mid) update(rt<<1, l, mid, ql, qr, val);
    else
    {
        update(rt<<1|1, mid+1, r, mid+1, qr, val);
        update(rt<<1, l, mid, ql, mid, val);
    }
    pushup(rt);
}
void query(int rt, int l, int r, int ql, int qr)
{
    int mid = (l + r)>>1;
    if(ql<=l && qr>=r)
    {
        for(int i=0; i<22; i++)
        {
            ans += (ll)(1<<i)*tree[rt][i];
        }
        return;
    }
    pushdown(rt, l, r);
    if(ql>mid) query(rt<<1|1, mid+1, r, ql, qr);
    else if(qr<=mid) query(rt<<1, l, mid, ql, qr);
    else
    {
        query(rt<<1, l, mid, ql, mid);
        query(rt<<1|1, mid+1, r, mid+1, qr);
    }
}
int main()
{
    scanf("%d%d", &N, &M);
    buildTree(1, 1, N);
    while(M--)
    {
        scanf("%d", &op);
        if(op == 1)
        {
            scanf("%d%d", &L, &R);
            ans = 0;
            query(1, 1, N, L, R);
            printf("%lld\n", ans);
        }
        else
        {
            scanf("%d%d%d", &L, &R, &Xi);
            update(1, 1, N, L, R, Xi);
        }
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

红球进黑洞【线段树区间更新+二进制异或处理】【牛客小白月赛9-C】 的相关文章

随机推荐

  • webpack 学习(一)前端常用的模块化设计模式之commonJs

    前端常用模块化规范 commonJs 规范 AMD ES6 Module规范 commonJs 和AMD 的区别 commonJs加载模块是同步的 也就是说只有加载完成的才会执行后面的操作 由于Node主要用于服务器编程 模块文件一般都存在
  • 深入 AXI4 总线(二)架构

    五个独立通道 AXI4 总线的一大特征是它有 5 个独立的传输通道 这些通道都只支持单向传输 作为类比 SPI 总线有 2 条传输通道 MISO MOSI SPI 输入输出的数据 大路朝天 各走一条 而作为对比 IIC 协议则只有 SDA
  • 类EMD的“信号分解方法”及MATLAB实现(第三篇)——CEEMDAN

    来帮忙填坑了 今天接着之前讲过的EEMD和CEEMD 来介绍一下 类EMD 分解方法的第三篇 1 CEEMDAN 自适应噪声完备集合经验模态分解 的概念 CEEMDAN 1 Complete Ensemble Empirical Mode
  • 框架(Framework)

    框架 Framework 框架 Framework 是整个或部分系统的可重用设计 表现为一组抽象构件及构件实例间交互的方法 另一种定义认为 框架是可被应用开发者定制的应用骨架 前者是从应用方面而后者是从目的方面给出的定义 可以说 一个框架是
  • python grid函数_Python – matplotlib griddata的多处理器

    我在Python 3 4 2中运行了示例代码 具有numpy版本1 9 1和matplotlib版本1 4 2 在具有4个物理CPU的Macbook Pro上 即 与 虚拟 CPU相反 Mac硬件架构也是提供一些用例 import nump
  • 华为云存储空间图库占比太大_华为手机中常见的问题以及解决方法

    现在越来越多的人在用华为手机了 今天本文就总结了一些华为手机在使用中出现的一些问题 以及解决方法 希望能对你有所帮助 手机系统自带的播放器能否显示音乐的信息 华为手机中的音乐播放器是支持显示本地音乐文件的大小 音乐文件存储路径 歌手名称 专
  • Java连接GreenPlum

    1 postgres驱动 下载 https jdbc postgresql org download html 我下载的是 postgresql 42 2 4 jar URL String url jdbc postgresql host
  • 一种数据驱动的自动驾驶汽车前馈补偿器优化方法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 一个可靠的控制器对于自动驾驶汽车的安全和平
  • Vue Excel文件的下载和上传(formData)

    Vue Excel文件的下载和上传 formData 在本文中传给后台的数据为FormData 首先介绍Excel文件的上传和下载代码 HTML代码 其中引用了Element UI的button
  • 人工智能——衣服分类(大作业必备)

    官方网站 大作业系列传送门 文本分类 模仿VGG16的衣服分类 导入数据 指定名称 观察里面图片 预处理 建立模型 编译模型 开始训练 绘制曲线 模型评估 图形测试定义 验证结果 预测多张结果 预测单张结果 导入数据 tf keras da
  • laravel-admin整合wangEditor2及上传图片

    小伙伴说MD编辑器不好用 因为复制粘贴不方便 所以我换了一个编辑器整合 选择了老朋友wangEditor 下面为大家介绍怎么在laravel v6 9 laravel admin v1 7 wangEditor2的情况下上传图片 第一步 c
  • android sdk配置图文教程

    首先配置 java sdk 下载java sdk java sdk也有很多版本 问清项目版本 下载相对应的 然后配置环境变量 下图是我电脑下载的版本 下载好就就是配置环境变量了 配置java sdk 环境变量 右击我的电脑 属性 高级系统设
  • VUE element-ui 之table表格导出Excel功能封装(纯前端实现)

    需求 导出当前页面所有数据 步骤 下载所需依赖 npm install save xlsx file saver 引入依赖 这里我进行了封装 由于很多页面都需要导出excel功能 js文件中引入依赖 进行导出方法封装 import File
  • 简单的jsp+servlet+jdbc+mysql实现用户增删改查-一抹茶-csdn

    jsp servlet jdbc mysql实现用户增删改查 项目下载地址 里面包含了项目文件 jar bootstrap jquery sql 也可以联系957406675 QQ群获取下载 运行环境 jdk1 8 0 102 eclips
  • 操作系统课程设计 - 多线程模拟 - 时间片轮转法实现处理机调度

    此篇博客用于记录学习历程 仅供交流参考 一 课程设计题目及内容 题目 设计一个按照时间片轮转法实现处理机调度的程序 时间片轮转法实现处理机调度的程序设计提示如下 1 假设系统有n个进程 每个进程用一个进程控制块 PCB 来代表 进程控制块的
  • 如何使用css将多出范围的字变为...

    话不多说 上代码 呈一行效果 width 100px text overflow ellipsis 将文本溢出显示为 white space nowrap 强制显示为一行 overflow hidden 溢出隐藏 呈多行效果 width 1
  • Golang开发项目目录简介以及目录结构设置规范

    一 Golang项目简单介绍 Golang简单的目录结构如下 其中 bin用来存放经过go bulid后的可执行文件 pkg存放编译后的go module 而src就存放我们项目的代码 二 三种常用目录结构 1 适合个人开发者 2 流行的目
  • 大数据组件-kafka(基础篇)

    大数据组件 kafka 基础篇 Kafka简介 Kafka是什么 Kafka的应用场景 Kafka的架构组成 Kafka的主要竞争力 Kafka简介 Kafka是什么 Kafka是一个消息队列 存储消息的队列中间件 可以存储消息进队列中 也
  • 关于CMake生成包含PCL库和CGAL库的工程时出现“无法解析的外部符号”的错误

    前言 博主之前安装了PCL 1 8 0库 教程链接 PCL 1 8 0 AllInOne VS2013 Win8 X64 安装配置及部分问题解决方法 和CGAL库 教程链接 在Win8 VS2013中配置CGAL库 最近需要把两个库用在同一
  • 红球进黑洞【线段树区间更新+二进制异或处理】【牛客小白月赛9-C】

    题目链接 给你N个点 M次查询 问的是 一 区间 l r 的数的总和 二 把区间 l r 上的所有点去异或 xor 一个数X 一开始用了点更新 然后T了 想了一会 最后在比赛结束前终于美滋滋的完成了AC 庆幸 我的想法是这样的 将每个点的值