cf 242 E XOR on Segment

Raptor码(一):2007RFC5053标准编解码学习 RFC 5053 标准 阅读详情

E XOR on Segment

题目大意

在这里插入图片描述

主要思路

由于异或和求和并没有什么性质

通常处理异或的两种方式一种为做前缀和,显然与本题没什么关系

另一种就是拆位

我们考虑讲每一位的状态作为一颗线段树,线段树维护的就是n个数每个数的第i位是1还是0

有两种操作

  • 第一种求和,我们在线段树中对每一位1的个数求和乘2的多少次方就是这一位上的和,把l~r区间的所有位的和加起来即可
  • 第二种对l~r区间异或x,我们也将x拆位,对于每一位而言
    • 如果是0,则对l~r区间的数没有影响
    • 如果是1,那么区间内所有0将变成1,所有1将变成0,也就是1和0的个数互换

于是我们线段树维护每一位上所有区间中1的个数,懒标记为改区间异或1的次数

更具体的细节看代码

AC代码
#include <bits/stdc++.h>

using namespace std;
#define debug(a) cout << #a << " = " << a << endl;
#define x first
#define y second
typedef long long ll;
const int N = 100001, mod = 1e9+7;

struct node
{
    int l, r;
    ll sum, lazy;//维护1的个数,和懒标记:区间异或1的次数
}tr[21][N * 4];

int n, m, a[N];

void pushup(int t, int u)
{
    tr[t][u].sum = tr[t][u << 1].sum + tr[t][u << 1 | 1].sum;
}

void pushdown(int t, int u)
{
    if(tr[t][u].lazy)//如果有懒标记
    {
        tr[t][u << 1 | 1].lazy += tr[t][u].lazy;
        tr[t][u << 1].lazy += tr[t][u].lazy;
        if(tr[t][u].lazy % 2)//如果父节点的异或1的次数为奇数时子节点才需修改
        {
            tr[t][u << 1].sum = (tr[t][u << 1].r - tr[t][u << 1].l + 1) - tr[t][u << 1].sum;
            tr[t][u << 1 | 1].sum = (tr[t][u << 1 | 1].r - tr[t][u << 1 | 1].l + 1) - tr[t][u << 1 | 1].sum;
        }
        tr[t][u].lazy = 0;//清空
    }
}

void build(int t, int u, int l, int r)
{
    tr[t][u].l = l, tr[t][u].r = r;
    if(l == r) tr[t][u].sum = (a[l] >> t) & 1;
    else
    {
        int mid = l + r >> 1;
        build(t, u << 1, l, mid), build(t, u << 1 | 1, mid + 1, r);
        pushup(t, u);
    }
}

int query(int t, int u, int l, int r)
{
    if(l <= tr[t][u].l && r >= tr[t][u].r) return tr[t][u].sum;
    else
    {
        pushdown(t, u);
        int mid = tr[t][u].l + tr[t][u].r >> 1;
        int res = 0;
        if(l <= mid) res += query(t, u << 1, l, r);
        if(r > mid) res += query(t, u << 1 | 1, l, r);
        return res;
    }
}

void modify(int t, int u, int l, int r)
{
    if(l <= tr[t][u].l && r >= tr[t][u].r)
    {
        tr[t][u].lazy++;
        tr[t][u].sum = (tr[t][u].r - tr[t][u].l + 1) - tr[t][u].sum;//因为只有异或1才会修改,所以一定修改sum
    }
    else
    {
        pushdown(t, u);
        int mid = tr[t][u].l + tr[t][u].r >> 1;
        if(l <= mid) modify(t, u << 1, l, r);
        if(r > mid) modify(t, u << 1 | 1, l, r);
        pushup(t, u);
    }
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    cin >> m;
    
    for(int i = 0; i < 21; i++)//每一位建立线段树
    {
        build(i, 1, 1, n);
    }
    
    while(m--)
    {
        int t, l, r;
        cin >> t >> l >> r;
        if(t == 1)
        {
            ll ans = 0;
            for(int i = 0; i < 21; i++)
            {
                ans += ((ll)query(i, 1, l, r) << i);//查询每一位l~r中1的个数再乘2的i次方就是这一位的和
            }
            cout << ans << endl;
        }
        else
        {
            int x;
            cin >> x;
            for(int i = 0; i < 21; i++)
            {
                if((x >> i) & 1)//如果是1再修改当前位
                {
                    modify(i, 1, l, r);
                }
            }
        }
    }
    return 0;
}
K210视觉项目上位机避坑指南:解决C#解析ESP8266 TCP图像流的乱码、卡顿与连接中断 本文详细解析了K210与ESP8266在视觉项目中的上位机开发问题,重点解决TCP图像流解析中的乱码、卡顿与连接中断问题。通过自定义协议、JPEG流重组、TCP连接优化等实战技巧,提升系统稳定性和性能,适用于嵌入式视觉开发者和C#上位机程序员。 阅读详情

相关推荐

手把手教你用STM32F103的IO口模拟XY2-100协议驱动数字振镜(附Keil O3优化代码)

本文详细介绍了如何使用STM32F103的IO口模拟XY2-100协议驱动数字振镜,包括协议解析、偶校验算法、寄存器级优化及Keil O3编译下的性能调优。通过硬件配置、核心代码实现和优化技巧,帮助开发者实现高速二维偏转控制,适用于工业激光雕刻和精密定位系统。

weixin_42527401的博客 261

CF242E XOR on Segment(线段树)

题目 给定一个长为n(n<=105n(n<=10^5n(n<=105)的数组 数组里的数不超过10610^6106 有两种操作: 1:求sum[l,r]sum[l,r]sum[l,r] 2:对[l,r][l,r][l,r]中的所有数和xxx异或 题解 线段树很可写的亚子。 一般线段树区间修改的时候采用懒标记的方式,而对于xorxorxor这种操作,懒标记是行不通的的。 那么我们...

MILLOPE的博客 375

Claude Code 完整使用教程(2026最新版)

《Claude Code 完整使用教程(2026最新版)》摘要: Claude Code 是 Anthropic 公司推出的智能编程工具,通过自然语言对话实现代码编写、调试和重构。本教程基于 v2.1.101 版本,涵盖安装配置、核心功能及最新特性。主要内容包括: 多平台安装方式(macOS/Linux/Windows) 桌面应用专属功能如并行会话、定时任务和语音模式 模型选择指南(Sonnet/Opus/Haiku) 快速入门示例:5分钟创建Node.js项目 核心功能:代码读写、命令执行、Git集成等

程序猿_三产 2万+

CF 242E XOR on Segment(二维线段树)

XOR on Segment time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output You've got an array a, consisting of n integers a1, a2, 

WEYuLi的专栏 1075

从零到一:Abaqus与Matlab联合仿真的自动化流程构建指南

本文详细介绍了如何构建Abaqus与Matlab联合仿真的自动化流程,涵盖基础架构设计、关键接口技术实现、结果提取与处理技术以及高级参数化优化流程。通过Python脚本作为桥梁,实现数据传递和任务控制,帮助工程师提升仿真效率。特别强调了版本兼容性、异常处理和性能监控等实用技巧。

weixin_29090089的博客 612

⭐️白嫖的阿里云认证⭐️ 【真题&参考答案】:大模型Clouder认证:利用大模型提升内容生产能力

【摘要】真题「大模型Clouder认证:利用大模型提升内容生产能力」

davidkorhenn的博客 1934

CF 242E XOR on Segment 【线段树】

两种操作: 1、求区间和 2、对区间上的每一个数进行异或(xor)运算 直接维护区间和的话区间更新无法进行,所以,要维护的信息是区间内按位和(即每个二进制位出现的次数),那么进行xor运算的时候,只需要进行0 和 1的转换就可以了。 这样的话,就是一个基本线段树+延迟操作+维护各个二进制位信息。 #include #include using namespace st

智障 1766

【推荐100个unity插件】unity实现交互式火焰 —— Ignis

Ignis是一款Unity互动式消防系统插件,可轻松将物体转换为可燃物。支持固体、植被、蒙皮网格和地形树木等多种对象类型,提供火焰蔓延、熄灭等效果。安装需通过Unity Package Manager添加Visual Effects Graph,并按照指引转换目标物体材质。使用盒型碰撞体或网格计算燃烧区域,可自定义火焰参数和视觉效果。内置多种转换选项,如Flammable Vegetation、Flammable Skinned Mesh等,适用于不同场景需求。注意使用前需备份材质和地形数据,并提供性能优化

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2240

CF-242E XOR on Segment [线段树]

题目链接 题意:有n个数,m个操作。操作有两种,操作1是查询 [l, r] 的区间和,操作2是将区间 [l, r] 的每一位异或x。 思路:按二进制位建树,每个节点用于统计1的个数,添加懒惰标记,记录该节点是否异或,同时需要异或是就用该节点的区间长度减去1的个数更新 感想:线段树真神奇 #include <bits/stdc++.h> const int maxn = 100...

jizhihong的博客 278

【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10

【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10

WW、forever的博客 1569

广东省低应变题库

11.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,采用低应变法对混凝土预制桩进行检测时,地基基础设计等级为甲级的桩基工程抽检桩数不应少于总桩数的30%,其余桩基工程抽检桩数不应少于总桩数的20%,且不得少于10根;16.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,当对某桩的桩身完整性判定为III类时,可认为该桩不满足验收条件,不用进一步确定该桩桩身缺陷对桩身结构承载力的影响程度。2.地基基础检测所用计量器具均应在检定(校准、验证)的有效期内,性能符合相关技术要求。

ZShy001238的博客 320

CF242E XOR on Segment【题解】线段树按位维护

题面:https://www.luogu.org/problem/CF242E 因为XOR的lazy tag不可以叠加。 所以就弄得比较麻烦。 需要把每个数二进制拆分。 也把lazy tag二进制拆分。 0异或一个数还是那个数,1异或一个数就是取反。 所以遇见tag的第i位为1的时候就用总数减去现在的这位为1的个数。 然后所有都用线段树维护就行了。 代码如下: #i...

dazhishu2366的博客 210

ArcMap|时空地理加权回归(GTWR)

ArcGIS的GTWR插件下载地址:https://www.researchgate.net/publication/329518786_GTWR_ADDIN_Valid_till_Dec_31_2022 更详细的操作参考: https://www.bilibili.com/video/BV1fR4y1M7xB?spm_id_from=333.999.0.0 https://blog.youkuaiyun.com/weixin_40008135/article/details/112693520 双击“GTWR_Be

个人学习笔记 1万+

CF242E XOR on Segment

这题其实真的不难,而且氵一道 2000 的在洛谷上紫色的题目真的很爽。 这题一上来很容易想到线段树,也就是加法乘法变成了异或,直接维护 xor 不大容易,因为异或的区间和不可以累加,所以这个想法肯定是不行的。 但是注意到这是位运算 xor,它一个很重要的性质就是每一位相互独立,而我们的每一位的每次修改无非就是取反,求和,十分好做,于是对于每个整数,考虑转化成这样的问题,也就是把每一位拆开而已,于是我们可以开大约 log⁡2(106)\log_2(10^6)log2​(106) 个维护 01 求和的线段树,所

m0_59024001的博客 281

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

[CF242E]XOR on Segment

Codeforces 数据结构

YveH 697

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

CF 242E XOR on Segment

题目链接:http://codeforces.com/problemset/problem/242/E 题目大意: 给定一个长为n(n 1:求sum[l,r];       2:对[l,r]中的所有数和x异或 题目思路: 一看题目,摆明了是成段更新的线段树,但是异或不符合分配律的( (a+b)^x != a^x+b^x ) ,但是我们知道异或对于一个数上的二进制表达式的

Go.To.AC的专栏 708

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【题解】 CF242E XOR on Segment

\(Description:\) 要智慧的我们帮助可爱的小小迪,设计一个数据结构支持区间求和,区间异或修改 \(Sample\) \(Input:\) 5 4 10 3 13 7 6 1 2 4 2 1 3 3 1 2 4 1 3 3 2 2 5 5 1 1 5 \(Sample\) \(Output:\) 26 22 0 34 对于每一个数x考虑把他拆开,拆成二进制,用\(log_2...

weixin_33698823的博客 131

(线段树、异或拆位)洛谷 P2574 XOR的艺术/CF242E XOR on Segment 题解

给定一个长度为n的、只含有数字01的字符串和两种操作。对于每种操作,给定oplrop0表示将字符串的lr区间内的0变成11变成0。op1表示询问字符串的lr区间内有多少个字符1。

m0_60506105的博客 1169

CF242E XOR on Segment 线段树

Link 线段树 2000 题意 给定长度为 nnn 的序列,两种操作 1.求区间 [L,R][L, R][L,R] 的和。 2.将区间 [L,R][L, R][L,R] 中的每个元素异或上 xxx。 思路 cnt[p][i] 表示 ppp 节点所管辖的数中的二进制的第 iii 位为1的个数。 易得操作一即为∑\sum∑ cnt[p][i]*(1<<i)。 考虑操作2,注意到如序列{0, 1, 1},若xor1,则变为{1, 0, 0},否则不变。 也就是说若 xxx 在二进制下某位为1,则区间

Strezia的博客 258

CF242E XOR on Segment(线段树加二进制拆分)

洛谷题目链接https://www.luogu.com.cn/problem/CF242E 题目大意 :给你一个长度为n的序列a,有两种操作 1 对[l,r]区间求和; 2 对[l,r]区间的每一个数异或上x; 解析 :标准的线段树区间求和以及区间修改,首先异或的一个性质,你对一个区间异或上n个数,无论先后顺序,最后结果都一样,因此很容易想到直接用一个懒标记来存要异或的数字,不到迫不得已不下推。问题的关键在于,懒标记如何下推,以及区间如何更新,如果你单纯那数字来进行操作,显然行不通,因为a^c+b.

qq_35769414的博客 338

Solution:CF242E(XOR on Segment)

分块过拆位线段树(

Unnamed_Cube的博客 387

「CF242E」XOR on Segment 解题报告

题面 长度为\(n\)的数列,现有两种操作: 1、区间异或操作 2、区间求和操作 对于每个查询,输出答案 思路: 线段树+二进制拆位 线段树区间修改一般使用的都是懒标记的方法,但是对于异或,懒标记的方法显然是行不通的,于是就考虑二进制拆位 主要的思路就是将一个数,拆成若干个二进制位,然后对于异或操作,就转换成了每一位上的异或操作 分类讨论一下: 1、当\(x\)的第\(i\)位为\(1\)时,\(...

weixin_30360497的博客 110

CF 242E (XOR ON SEGMENT)线段树维护区间异或,求和

题意: 一个定长的数组,然后他有两个操作; ①查询区间 【L,R】的区间和。 ②一个更下新操作,对区间【L,R】内的数分别与一个固定的值X做异或操作,结果作为这个位置的新的值。 思路: 异或操作是在二进制的基础上进行的,所以我们开20棵线段树,每一颗线段树 去维护一个二进制位的1个数。 至于为什么存1的个数,我们来看看一个例子。 例如,一个数组有四个数字,1到4分别为5,6,7,8; 他们的 二进...

laaahu的博客 1143

2.CF242E XOR on Segment 线段树维护区间反转

要求实现区间求和,区间异或 对每个二进制位维护一棵线段树,实现区间异或可以通过对该位求补集大小实现

HeartFireY的博客 461

CF242E XOR on Segment (线段树+二进制拆位)

题目大意 涉及区间内的异或,我们可以把每个数看成二进制,由于1e6<2^20 ,所以最多有二十位 。 用二十棵线段树维护二进制下的20位。 每棵线段树涉及的操作就是区间求合 区间翻转啦。 #include<bits/stdc++.h> using namespace std; #define ll long long const int maxn = 1e5+7; const ll inf = 34359738370; int tree[maxn<<2][21],tag[ma

矮纸斜行闲作草 345

CF 242E-XOR on Segment(线段树区间处理+二进制)

Description You've got an array a, consisting of n integers a1, a2, ..., an. You are allowed to perform two operations on this array: Calculate the sum of current array elements on the segment

Halo 1067
上一篇: Codeforces Round #746 (Div. 2)
下一篇: Educational Codeforces Round 115 (Rated for Div. 2)
zhbbbb!
博客等级 码龄7年 43粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值