当前位置: 首页 > 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;这时重新去安装…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...