2024百度之星第二场-小度的01串

补题链接: 码蹄集

一道经典线段树板子题。

区间修改01置换,区间查询子串权值。

唯一区别,权值要求的是相邻字符都不同所需修改的最小字符个数。

我们在线段树节点上分别维护当前连续区间:

奇数位是0的个数(j0),奇数位是1的个数(j1)。

偶数位是0的个数(o0),偶数位是1的个数(o1)。

以及当前区间的答案ans,是否往子区间延迟lazy。

考虑如何通过维护的信息进行pushup。

如图所示:

黑色三角:表示虚线左右子区间各自的奇数位置

红色三角:表示合并后奇数位置。

当左区间是奇数时,黑色三角=红色三角

要想变成10间断,要不变成101010...,要不变成0101010....

令 ls是左区间,rs是右区间。

如果变成101010,那就是ans=tr[ls].j0+tr[ls].o1+tr[rs].j0+tr[rs].o1

如果变成010101,那就是ans=总长度-(tr[ls].j0+tr[ls].o1+tr[rs].j0+tr[rs].o1)

取个max就行。

但当左区间不是奇数,黑色三角!=红色三角

如果变成101010,那就是ans=tr[ls].j0+tr[ls].o1+tr[rs].j1+tr[rs].o0

如果变成010101,那就是ans=总长度-(tr[ls].j0+tr[ls].o1+tr[rs].j1+tr[rs].o0)

到这里我们就解决了从子区间到大区间的pushup问题,代码如下所示。
 

void pushup(int p){int len=tr[p].r-tr[p].l+1;int lenls=tr[ls].r-tr[ls].l+1;if (lenls&1){int sum=tr[ls].j0+tr[ls].o1+tr[rs].j1+tr[rs].o0;tr[p].ans=min(sum,len-sum);tr[p].j0=tr[ls].j0+tr[rs].o0;tr[p].j1=tr[ls].j1+tr[rs].o1;tr[p].o0=tr[ls].o0+tr[rs].j0;tr[p].o1=tr[ls].o1+tr[rs].j1;}else{int sum=tr[ls].j0+tr[ls].o1+tr[rs].j0+tr[rs].o1;tr[p].ans=min(sum,len-sum);tr[p].j0=tr[ls].j0+tr[rs].j0;tr[p].j1=tr[ls].j1+tr[rs].j1;tr[p].o0=tr[ls].o0+tr[rs].o0;tr[p].o1=tr[ls].o1+tr[rs].o1;}
}

pushdown问题,其实比较常规,就是01置换,异或一下就行,代码如下所示。

void pushdown(int p){tr[ls].laz=tr[ls].laz^tr[p].laz;tr[rs].laz=tr[rs].laz^tr[p].laz;swap(tr[ls].j0,tr[ls].j1);swap(tr[ls].o0,tr[ls].o1);swap(tr[rs].j0,tr[rs].j1);swap(tr[rs].o0,tr[rs].o1);tr[p].laz=0;
}

当我们维护的东西不只是ans的时候,query需要返回一个结构体,因为当查询的x,y在左右区间都有的时候,需要向上手动合并。

全部问题解决完后,完整代码如下所示。 

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
#define ls p<<1
#define rs p<<1|1
struct tree{int l,r;int j0,j1,o0,o1;int laz,ans;
}tr[N];
char s[N];
int n,q;
void pushup(int p){int len=tr[p].r-tr[p].l+1;int lenls=tr[ls].r-tr[ls].l+1;if (lenls&1){int sum=tr[ls].j0+tr[ls].o1+tr[rs].j1+tr[rs].o0;tr[p].ans=min(sum,len-sum);tr[p].j0=tr[ls].j0+tr[rs].o0;tr[p].j1=tr[ls].j1+tr[rs].o1;tr[p].o0=tr[ls].o0+tr[rs].j0;tr[p].o1=tr[ls].o1+tr[rs].j1;}else{int sum=tr[ls].j0+tr[ls].o1+tr[rs].j0+tr[rs].o1;tr[p].ans=min(sum,len-sum);tr[p].j0=tr[ls].j0+tr[rs].j0;tr[p].j1=tr[ls].j1+tr[rs].j1;tr[p].o0=tr[ls].o0+tr[rs].o0;tr[p].o1=tr[ls].o1+tr[rs].o1;}
}
void pushdown(int p){tr[ls].laz=tr[ls].laz^tr[p].laz;tr[rs].laz=tr[rs].laz^tr[p].laz;swap(tr[ls].j0,tr[ls].j1);swap(tr[ls].o0,tr[ls].o1);swap(tr[rs].j0,tr[rs].j1);swap(tr[rs].o0,tr[rs].o1);tr[p].laz=0;
}
void build(int p,int l,int r){tr[p].l=l;tr[p].r=r;tr[p].laz=0;if (l==r){tr[p].j0=0;tr[p].j1=0;if (s[l]=='0') tr[p].j0=1;else if (s[l]=='1') tr[p].j1=1;			tr[p].ans=0;return;}int mid=(l+r)>>1;build(ls,l,mid);build(rs,mid+1,r);pushup(p);
}
void update(int p,int x,int y){int l=tr[p].l,r=tr[p].r;if (x<=l&&r<=y){tr[p].laz=tr[p].laz^1;swap(tr[p].j0,tr[p].j1);swap(tr[p].o0,tr[p].o1);return;}if (tr[p].laz) pushdown(p);int mid=(l+r)>>1;if (x<=mid) update(ls,x,y);if (y>mid) update(rs,x,y);pushup(p);
}
tree query(int p,int x,int y){int l=tr[p].l,r=tr[p].r;if (x<=l&&r<=y){return tr[p];}if (tr[p].laz) pushdown(p);int mid=(l+r)>>1;if (y<=mid) return query(ls,x,y);else if (x>mid) return query(rs,x,y);else{struct tree T,a,b;a=query(ls,x,y);b=query(rs,x,y);T.l=a.l;T.r=b.r;int len=T.r-T.l+1;int lenls=a.r-a.l+1;if (lenls&1){int sum=a.j0+a.o1+b.j1+b.o0;T.ans=min(sum,len-sum);T.j0=a.j0+b.o0;T.j1=a.j1+b.o1;T.o0=a.o0+b.j0;T.o1=a.o1+b.j1;}else{int sum=a.j0+a.o1+b.j0+b.o1;T.ans=min(sum,len-sum);T.j0=a.j0+b.j0;T.j1=a.j1+b.j1;T.o0=a.o0+b.o0;T.o1=a.o1+b.o1;}return T;}
}
void co(){for (int i=1;i<=9;i++){cout<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].laz<<" "<<tr[i].ans<<"||";cout<<"S:";for (int j=1;j<=n;j++){cout<<s[j];}cout<<"\n";cout<<"奇数 0:"<<tr[i].j0<<"| 1:"<<tr[i].j1<<"|||";cout<<"偶数 0:"<<tr[i].o0<<"| 1:"<<tr[i].o1<<"\n";}
}
void work(){cin>>n>>q;for (int i=1;i<=n;i++) cin>>s[i];build(1,1,n);for (int i=1;i<=q;i++){int t,l,r;cin>>t>>l>>r;if (t==1) update(1,l,r);else cout<<query(1,l,r).ans<<"\n";	}
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);work();return 0;
} 
/*
10101
000
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python和tkinter实现的字母记忆配对游戏

Python和tkinter实现的字母记忆配对游戏 因为这个小游戏用到了tkinter&#xff0c;先简要介绍一下它。tkinter是Python的标准GUI(图形用户界面)库&#xff0c;它提供了一种简单而强大的方式来创建图形界面应用程序。它提供了创建基本图形界面所需的所有工具&#xff0c;同时保…

OSI七层模型TCP/IP四层面试高频考点

OSI七层模型&TCP/IP四层&面试高频考点 1 OSI七层模型 1. 物理层&#xff1a;透明地传输比特流 在物理媒介上传输原始比特流&#xff0c;定义了连接主机的硬件设备和传输媒介的规范。它确保比特流能够在网络中准确地传输&#xff0c;例如通过以太网、光纤和无线电波等媒…

什么是有效的电子签名?PDF电子签名怎样具备法律效力?

电子签名逐渐成为商务文书和法律文件中不可或缺的一部分。《电子签名法》自2005年4月1日起施行&#xff0c;这一立法是中国信息化法律的重要里程碑&#xff0c;为电子签名应用奠定了法律基础。电子签名不仅仅是一种技术手段&#xff0c;更是一种法律认可的签名形式。那么究竟什…

Python私教张大鹏 PyWebIO通过事件回调实现表格的编辑和删除功能

从上面可以看出&#xff0c;PyWebIO把交互分成了输入和输出两部分&#xff1a;输入函数为阻塞式调用&#xff0c;会在用户浏览器上显示一个表单&#xff0c;在用户提交表单之前输入函数将不会返回&#xff1b;输出函数将内容实时输出至浏览器。这种交互方式和控制台程序是一致的…

学习TTS遇到的问题2 什么是TCN模型

学习TTS遇到的问题2 什么是TCN模型 什么是TCN模型怎么理解 TCN中的 dilation&#xff1f;什么是 Dilation具体例子数学表达作用例子代码示例 什么是TCN模型 https://juejin.cn/post/7262269863343079479 https://blog.csdn.net/weixin_57726558/article/details/132163074 由下…

出手便是王炸,曙光存储将高端存储推向新高度

二十年磨一剑&#xff0c;今朝试锋芒。 近日&#xff0c;曙光存储重磅发布全球首个亿级IOPS集中式全闪存储FlashNexus&#xff0c;正式宣告进入高端存储市场。 作为存储产业皇冠上的明珠&#xff0c;高端存储一向以技术难度大、市场准入门槛高和竞争格局稳定著称&#xff0c;…

从0-1搭建一个web项目(package.json)详解

本章分析package.json文件详解 本文主要对packge.json配置子文件详解 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 开源的后台管理框架。在一定程度上节省您的开发效率。另外本项目还封装了一些常用组件、hooks、指令、动态路由、按钮级别权限控制等…

Centos7源码方式安装sqle及开发相关

官方文档-源码安装 操作系统&#xff1a;centos:7.9,everything (DVD版应该也可以) (在ubuntu22.04装了两天之后乖乖开了一个新Centos7虚拟机) 镜像&#xff1a;清华大学开源软件镜像站 centos/7.9.2009 安装git sudo yum update -y sudo yum install -y git git --version安…

数据结构与算法笔记:高级篇 - B+树:MySql数据库索引是如何实现的?

概述 作为一名软件开发工程师&#xff0c;你对数据库肯定再熟悉不过了。MySQL 作为主流的数据库存储系统&#xff0c;它在我们的业务开发中&#xff0c;有着举足轻重的地位。在工作中&#xff0c;为了加速数据库中数据的查找速度&#xff0c;我们常用的处理思路是&#xff0c;…

01.Ambari自定义服务开发-项目初始化

文章目录 基础环境在PyCharm中初始化项目配置项目相关依赖在PyCharm中导入依赖 基础环境 PyCharmPython 2.7已经安装完成的Ambari服务端 在PyCharm中初始化项目 项目名称就是我们要安装服务的名称&#xff0c;要求名称为全大写&#xff0c;如&#xff1a;DORIS创建Python2.7…

龙迅LT8711V TYPE-CDP 1.2转VGA芯片,内置MCU,成熟批量产品

龙迅LT8711V描述&#xff1a; LT8711V是一种高性能的Type-C/DP1.2到VGA转换器&#xff0c;设计用于连接USB Type-C源或DP1.2源到VGA接收器。LT8711V集成了一个DP1.2兼容的接收器&#xff0c;和一个高速三通道视频DAC。此外&#xff0c;还包括两个CC控制器&#xff0c;用于CC通…

图像大小调整(缩放)

尺寸调整前尺寸调整前 1、背景介绍 在深度学习中&#xff0c;将图像调整到固定尺寸&#xff08;如28x28像素&#xff09;的操作是非常常见的&#xff0c;尤其是在处理诸如图像分类、物体检测和图像分割等任务时。这种操作有几个重要原因&#xff1a; 标准化输入&#xff1a;许…

【可控图像生成系列论文(五)】ControlNet 和 IP-Adapter 之间的区别有哪些?

系列文章目录 【可控图像生成系列论文&#xff08;一&#xff09;】 简要介绍了 MimicBrush 的整体流程和方法&#xff1b;【可控图像生成系列论文&#xff08;二&#xff09;】 就MimicBrush 的具体模型结构、训练数据和纹理迁移进行了更详细的介绍。【可控图像生成系列论文&…

【漏洞复现】锐捷统一上网行为管理与审计系统——远程命令执行漏洞

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 锐捷统一上网行为管理与审计系统naborTable/static_convert.php…

Linux系统编程(七)进程间通信IPC

进程间通讯的7种方式_进程间通信的几种方法-CSDN博客 管道 pipe&#xff08;命名管道和匿名管道&#xff09;&#xff1b;信号 signal&#xff1b;共享内存&#xff1b;消息队列&#xff1b;信号量 semaphore&#xff1b;套接字 socket&#xff1b; 1. 管道 内核提供&#x…

Arduino平台软硬件原理及使用——SR04超声波传感器的使用

文章目录&#xff1a; 一、超声波传感器工作原理 二、SR04超声波库的使用 三、SR04超声波传感器在Arduino中的使用 一、超声波传感器工作原理 如上图所示&#xff1a;HCSR04超声波传感器拥有4个针脚&#xff0c;除了VCC接正极、GND接负极外&#xff0c;还有两个引脚“Trig”及“…

Linux线程互斥锁

目录 &#x1f6a9;看现象&#xff0c;说原因 &#x1f6a9;解决方案 &#x1f6a9;互斥锁 &#x1f680;关于互斥锁的理解 &#x1f680;关于原子性的理解 &#x1f680;如何理解加锁和解锁是原子的 &#x1f6a9;对互斥锁的简单封装 引言 大家有任何疑问&#xff0c;可…

CCSP自考攻略+经验总结

备考攻略 备考攻略准备阶段通读阶段精度阶段总复习阶段刷题阶段命运审判 写到最后 备考攻略 趁着对ssp知识点的理解还在&#xff0c;开始ccsp的考证之路&#xff0c;文章结构还是按照cissp备考篇的结构梳理。本次备考和cissp的离职在家备考不同&#xff0c;ccsp是在职利用非工…

如何用亚马逊合作伙伴网络快速上线跨境电商

目前跨境电商已成为行业发展主流&#xff0c;如何快速、低成本打造品牌海外独立站和智能客服营销中心、构建全链路跨境电商体系是出海电商商家都会遇到的难题。亚马逊云科技凭借与亚马逊电商平台易于集成的先天优势成为首选的电商解决方案平台。本文介绍了如何用亚马逊云科技平…

Elasticsearch8.x聚合查询全面指南:从理论到实战

聚合查询的概念 聚合查询&#xff08;Aggregation Queries&#xff09;是Elasticsearch中用于数据汇总和分析的查询类型。它不同于普通的查询&#xff0c;而是用于执行各种聚合操作&#xff0c;如计数、求和、平均值、最小值、最大值、分组等。 聚合查询的分类 分桶聚合&…