当前位置: 首页 > news >正文

洛谷 P2574 XOR的艺术/CF242E XOR on Segment 题解

1.XOR的艺术

题意

给定一个长度为 n n n的、只含有数字 0 , 1 0,1 0,1的字符串和两种操作。

对于每种操作,给定 o p , l , r op,l,r op,l,r

o p = 0 op=0 op=0表示将字符串的 [ l , r ] [l, r] [l,r]区间内的 0 0 0变成 1 1 1 1 1 1变成 0 0 0

o p = 1 op=1 op=1表示询问字符串的 [ l , r ] [l, r] [l,r]区间内有多少个字符 1 1 1

思路

一段区间中非 0 0 0 1 1 1,那么该区间中 1 1 1的个数,其实就是区间求和,考虑使用线段树解决这个问题。

对于 o p = 0 op=0 op=0这个取反操作,设区间左右端点分别为 l , r l,r l,r,原来的 1 1 1个数为 s u m sum sum;取反一次,原来 1 1 1的位置有 s u m sum sum处变成 0 0 0,而原来为 0 0 0的位置有 ( r − l + 1 ) − s u m (r-l+1)-sum (rl+1)sum处变成 1 1 1,相当于现在 1 1 1的个数 s u m ′ = ( r − l + 1 ) − s u m sum'=(r-l+1)-sum sum=(rl+1)sum

知道了怎么更新区间了就好办了,但是为了节省时间就要引入懒标记 t a g tag tag

可以令其表示区间要被处理的次数,在下次修改或查询时当次数为奇数时才 p u s h d o w n pushdown pushdown下放(因为翻转两次就相当于没反转)

也可以直接让 t a g = 0 tag=0 tag=0 1 1 1,来表示需不需要执行翻转操作,每次更新就异或一次 1 1 1

线段树就只需要维护区间和 s u m sum sum即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls u<<1
#define rs u<<1|1
const ll N=2e5+9;
ll n,m,a[N];
char c[N];
struct SegT
{struct node{ll sum,tag;}T[N<<4];void pushup(ll u){T[u].sum=T[ls].sum+T[rs].sum;}void pushdown(ll u,ll l,ll r){if(T[u].tag){ll mid=(l+r)>>1;T[ls].sum=(mid-l+1)-T[ls].sum;T[rs].sum=(r-mid)-T[rs].sum;}T[ls].tag^=T[u].tag;T[rs].tag^=T[u].tag;T[u].tag=0;}void build(ll u,ll l,ll r){if(l==r){T[u].sum=a[l];return;}ll mid=(l+r)>>1;build(ls,l,mid);build(rs,mid+1,r);pushup(u);}void modify(ll u,ll l,ll r,ll ql,ll qr){if(qr<l||r<ql)return;if(ql<=l&&r<=qr){T[u].sum=(r-l+1)-T[u].sum;T[u].tag^=1;return;}pushdown(u,l,r);ll mid=(l+r)>>1;if(ql<=mid)modify(ls,l,mid,ql,qr);if(qr>mid)modify(rs,mid+1,r,ql,qr);pushup(u);}ll query(ll u,ll l,ll r,ll ql,ll qr){if(qr<l||r<ql)return 0;if(ql<=l&&r<=qr)return T[u].sum;pushdown(u,l,r);ll mid=(l+r)>>1,ret=0;if(ql<=mid)ret+=query(ls,l,mid,ql,qr);if(qr>mid)ret+=query(rs,mid+1,r,ql,qr);return ret;}
}A;
int main()
{scanf("%lld%lld%s",&n,&m,c+1);for(int i=1;i<=n;i++)a[i]=c[i]-'0';A.build(1,1,n);while(m--){ll op,l,r;scanf("%lld%lld%lld",&op,&l,&r);if(op==0)A.modify(1,1,n,l,r);if(op==1)printf("%lld\n",A.query(1,1,n,l,r));}return 0;
}

2.XOR on Segment

题意

给定 n n n个数的序列 a a a m m m次操作,操作有两种:

对于每种操作,给定 o p , l , r op,l,r op,l,r

o p = 1 op=1 op=1表示要求区间 [ l , r ] [l,r] [l,r]内所有数的和

o p = 2 op=2 op=2时,给定 x x x,并将区间 [ l , r ] [l,r] [l,r]所有数异或上 x x x

1 ≤ n ≤ 1 0 5 , 1 ≤ m ≤ 5 × 1 0 4 , 1 ≤ x , a i ≤ 1 0 6 1\le n\le 10^5,\ 1\le m\le 5\times10^4,\ 1\le x,a_i\le 10^6 1n105, 1m5×104, 1x,ai106

思路

对比上一题,本题将 0 0 0 1 1 1的序列推广到 [ 1 , 1 0 6 ] [1,10^6] [1,106],大了不少。

但能否和上一题产生关联呢?

当然是可以的!可以考虑用 0 , 1 0,1 0,1表示序列中每个数的二进制,因为 1 ≤ a i ≤ 1 0 6 1\le a_i\le 10^6 1ai106,所以二进制最多有 ⌈ log ⁡ 2 1 0 6 ⌉ = 20 \left \lceil \log_2{10^6} \right \rceil =20 log2106=20位。可以开 20 20 20棵线段树来维护 20 20 20个进制位,做法和上一题大差不差了。

修改的时候如果 x x x与当前第 i i i位的“基底” 2 i 2^i 2i作且操作,即 x a n d 2 i = 0 x\ and\ 2^i =0 x and 2i=0时,那就无需对这一位更新,因为异或 0 0 0相当于不用异或。

最后预处理 2 2 2的幂,然后逐位相加就能得到查询的答案。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls u<<1
#define rs u<<1|1
const int N=1e5+9,M=20;
int n,m,a[N];
int _2[M];
void init()
{_2[0]=1;for(int i=1;i<M;i++)_2[i]=_2[i-1]*2;
}
struct SegT
{struct node{ll sum;int tag;}T[N<<2];void pushup(int u){T[u].sum=T[ls].sum+T[rs].sum;}void pushdown(int u,int l,int r){if(T[u].tag){int mid=(l+r)>>1;T[ls].sum=(mid-l+1)-T[ls].sum;T[rs].sum=(r-mid)-T[rs].sum;T[ls].tag^=T[u].tag;T[rs].tag^=T[u].tag;T[u].tag=0;}}void build(int u,int l,int r,int ws){if(l==r){T[u].sum=(ll)(a[l]&_2[ws]?1:0);return;}int mid=(l+r)>>1;build(ls,l,mid,ws);build(rs,mid+1,r,ws);pushup(u);}void modify(int u,int l,int r,int ql,int qr){if(qr<l||r<ql)return;if(ql<=l&&r<=qr){T[u].sum=(ll)(r-l+1)-T[u].sum;T[u].tag^=1;return;}pushdown(u,l,r);int mid=(l+r)>>1;if(ql<=mid)modify(ls,l,mid,ql,qr);if(qr>mid)modify(rs,mid+1,r,ql,qr);pushup(u);}ll query(int u,int l,int r,int ql,int qr){if(qr<l||r<ql)return 0;if(ql<=l&&r<=qr)return T[u].sum;pushdown(u,l,r);int mid=(l+r)>>1;ll ret=0;if(ql<=mid)ret+=(ll)query(ls,l,mid,ql,qr);if(qr>mid)ret+=(ll)query(rs,mid+1,r,ql,qr);return ret;}
}A[M];
int main()
{init();scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=0;i<M;i++)A[i].build(1,1,n,i);scanf("%d",&m);while(m--){int op,l,r;scanf("%d%d%d",&op,&l,&r);if(op==1){ll ans=0;for(int i=0;i<M;i++)ans+=1ll*_2[i]*A[i].query(1,1,n,l,r);printf("%lld\n",ans);}else {int x;scanf("%d",&x);for(int i=0;i<M;i++)if(x&_2[i])A[i].modify(1,1,n,l,r);}}return 0;
}

相关文章:

洛谷 P2574 XOR的艺术/CF242E XOR on Segment 题解

1.XOR的艺术 题意 给定一个长度为 n n n的、只含有数字 0 , 1 0,1 0,1的字符串和两种操作。 对于每种操作&#xff0c;给定 o p , l , r op,l,r op,l,r&#xff1a; o p 0 op0 op0表示将字符串的 [ l , r ] [l, r] [l,r]区间内的 0 0 0变成 1 1 1&#xff0c; 1 1 1变成 0 …...

包管理器-汇总介绍

包管理器是一种在操作系统或软件开发环境中用于自动化软件包&#xff08;程序、库等&#xff09;的安装、升级、配置和卸载等操作的工具。它能帮助用户更方便地管理软件及其依赖关系&#xff0c;以下是不同操作系统和开发环境中常见的包管理器介绍&#xff1a; 操作系统层面的…...

mysql系列8—Innodb的undolog

背景 本文涉及的内容较为底层&#xff0c;做了解即可&#xff0c;是以前学习《高性能mysql》和《mysql是怎样运行的》的笔记整理所得。 undolog设计的初始目的是保证事务的原子性。mysql的修改操作发生后&#xff0c;如果所在的事务未被提交&#xff0c;如mysql服务或者操作系统…...

静默安装OGG for MySQL微服务版本,高效开展数据同步和迁移

一、背景 本文从Oracle GoldenGate微服务版的概念和组件介绍开始&#xff0c;从零介绍了怎么开始安装GoldenGate 21c for Oracle微服务版本的软件及部署。当然了&#xff0c;微服务版除新功能外包含传统版所有的功能。 二、安装部署 &#xff08;一&#xff09;下载OGG for …...

【Golang 面试题】每日 3 题(五十五)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

PHP关键字入门指南:分类与功能全解析

如果你是刚接触PHP的新手,可能会对代码中那些“特殊单词”感到困惑。别担心!本文将用最通俗易懂的方式,带你认识PHP中的关键字——它们就像编程世界的“魔法咒语”,每个都有独特的作用。文末还附有代码示例,帮你快速上手! 一、什么是PHP关键字? PHP关键字是语言内置的特…...

消息中间件深度剖析:以 RabbitMQ 和 Kafka 为核心

在现代分布式系统和微服务架构的构建中&#xff0c;消息中间件作为一个不可或缺的组件&#xff0c;承担着系统间解耦、异步处理、流量削峰、数据传输等重要职能。尤其是在面临大规模并发、高可用性和可扩展性需求时&#xff0c;如何选择合适的消息中间件成为了开发者和架构师们…...

【万字详细教程】Linux to go——装在移动硬盘里的Linux系统(Ubuntu22.04)制作流程;一口气解决系统安装引导文件迁移显卡驱动安装等问题

Linux to go制作流程 0.写在前面 关于教程Why Linux to go&#xff1f;实际效果 1.准备工具2.制作步骤 下载系统镜像硬盘分区准备启动U盘安装系统重启完成驱动安装将系统启动引导程序迁移到移动硬盘上 3.可能出现的问题 3.1.U盘引导系统安装时出现崩溃3.2.不影响硬盘里本身已有…...

HCIA项目实践---OSPF的基本配置

9.5.12 OSPF的基本配置 &#xff08;所搭环境如上图所示&#xff09; A 先配置IP地址 (先进入路由器R1的0/0/0接口配置IP地址&#xff0c;再进入环回接口配置IP地址) &#xff08;配置R2路由器的0/0/0和0/0/1以及环回接口的IP地址&#xff09; &#xff08;置R3路由器的0/0/0接…...

Vue 自动配置表单 el-switch等不常用组件覆盖默认值问题

有自动解析表单的vue组件如下&#xff0c;其原理是调用一个配置表单定义的接口&#xff0c;然后再调用获取表单配置的接口并将配置的数据覆盖表单的默认值。其中el-switch的配置值没有覆盖默认值&#xff0c;分析其原因。 主页面如下&#xff1a; <template> <div cla…...

零基础购买阿里云服务器,XShell连接云服务器

目录 1.环境搭建方式 2. 使用云服务器 3.使用终端软件登录到Linux 4.使用XShell登录主机 5.连接失败的原因&#xff1a; 下一篇更新&#xff1a;Linux的基础指令以及如何Linux的环境搭建 1.环境搭建方式 主要有四种: 1.直接安装在物理机上&#xff0c;虽然Linux有图形化…...

【系统架构设计师】虚拟机体系结构风格

目录 1. 说明2. 解释器体系结构风格3. 规则系统体系结构风格4. 例题4.1 例题1 1. 说明 1.p263。2.虚拟机体系结构风格的基本思想是人为构建一个运行环境&#xff0c;在这个环境之上&#xff0c;可以解析与运行自定义的一些语言&#xff0c;这样来增加架构的灵活性。3.虚拟机体…...

C语言中qsort函数使用技巧

在C语言的标准库中&#xff0c; qsort 函数是一个强大的通用排序函数&#xff0c;它采用快速排序算法&#xff0c;能够高效地对各种数据类型的数组进行排序。掌握 qsort 函数的使用技巧&#xff0c;对于提升程序的效率和代码的简洁性至关重要。 一、qsort函数基本介绍 qsort 函…...

WPF的Prism框架的使用

安装Prism.DryIoc库&#xff1a; Prism的区域和模块化&#xff1a; 一个区域可以显示一个用户控件 一个模块就是一个项目&#xff0c;也就是一个类库 动态切换用户控件的案例&#xff1a; <Grid><Grid.RowDefinitions><RowDefinition Height"auto"…...

LeetCode每日精进:142.环形链表II

题目链接&#xff1a;142.环形链表II 题目描述&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环…...

CPP集群聊天服务器开发实践(五):nginx负载均衡配置

1 负载均衡器的原理与功能 单台Chatserver可以容纳大约两万台客户端同时在线聊天&#xff0c;为了提升并发量最直观的办法需要水平扩展服务器的数量&#xff0c;三台服务器可以容纳六万左右的客户端。 负载均衡器的作用&#xff1a; 把client的请求按照负载均衡算法分发到具体…...

easyexcel解析excel文件的时候报错

easyexcel解析xls文件的时候&#xff0c;报错Exception in thread "main" com.alibaba.excel.exception.ExcelAnalysisException: java.lang.NoClassDefFoundError: org/objectweb/asm/Type at com.alibaba.excel.analysis.ExcelAnalyserImpl.analysis(ExcelAnalyser…...

Android设备 网络安全检测

八、网络与安全机制 6.1 网络框架对比 volley&#xff1a; 功能 基于HttpUrlConnection;封装了UIL图片加载框架&#xff0c;支持图片加载;网络请求的排序、优先级处理缓存;多级别取消请求;Activity和生命周期的联动&#xff08;Activity结束生命周期同时取消所有网络请求 …...

word分栏使得最后一页内容自动平衡

word分栏使得最后一页内容自动平衡 Word中的分页符分节符 Word中的分页符与分节符统称为分隔符 【分页符】 是将一页内容分成两页, 但分离后的两页属于同一节;分页符用于强制在当前位置分页, 后续内容从下一页开始;分页符对应快捷键 Ctrl Enter ; 【分节符】 分节符用…...

完全免费稳定WebTerm网页版在线SSH连接,在线远程连接云服务器,可以控制背景,支持SFTP访问服务器文件。无需安装即可在线连接和管理服务器的SSH终端工具。支持跨平台设备。

目录 用途介绍 网页版SSH使用说明及教程 首次登录配置 设置中心介绍 ​编辑 SFTP功能 用途介绍 各位开发者在使用远程服务器时经常面临一个很致命的问题&#xff0c;就是当没有在使用自己电脑&#xff0c;远程服务器商家又没有提供在线的VNC连接&#xff0c;这时重新去安装…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...