备战蓝桥杯---线段树应用2

来几个不那么模板的题:

对于删除,我们只要给那个元素附上不可能的值即可,关键问题是怎么处理序号变化的问题。

事实上,当我们知道每一个区间有几个元素,我们就可以确定出它的位置,因此我们可以再维护一下前缀和即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1000100];
struct node{int maxn,minn,num;
}tree[4001000];
void build(int p,int l,int r){if(l==r){tree[p].maxn=a[l];tree[p].minn=a[l];tree[p].num=1;return;}int mid=(l+r)/2;build(p*2,l,mid);build(p*2+1,mid+1,r);tree[p].maxn=max(tree[p*2].maxn,tree[p*2+1].maxn);tree[p].minn=min(tree[p*2].minn,tree[p*2+1].minn);tree[p].num=tree[p*2].num+tree[p*2+1].num;
}
void del(int p,int l,int r,int x){if(l==r){tree[p].maxn=-1e9-10;tree[p].minn=1e9+10;tree[p].num=0;return;}int mid=(l+r)/2;if(tree[p*2].num>=x) del(p*2,l,mid,x);else del(p*2+1,mid+1,r,x-tree[p*2].num);//更新tree[p].maxn=max(tree[p*2].maxn,tree[p*2+1].maxn);tree[p].minn=min(tree[p*2].minn,tree[p*2+1].minn);tree[p].num=tree[p*2].num+tree[p*2+1].num;
}
node query(int p,int l,int r,int x,int y){if(x==1&&y==tree[p].num){return tree[p];}int mid=(l+r)/2;if(tree[p*2].num>=y) return query(p*2,l,mid,x,y);if(tree[p*2].num<x) return query(p*2+1,mid+1,r,x-tree[p*2].num,y-tree[p*2].num);node t1=query(p*2,l,mid,x,tree[p*2].num);node t2=query(p*2+1,mid+1,r,1,y-tree[2*p].num);t1.maxn=max(t1.maxn,t2.maxn);t1.minn=min(t1.minn,t2.minn);return t1;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++) scanf("%d",&a[i]);build(1,1,n);for(int i=1;i<=m;i++){int q,x,y;scanf("%d",&q);if(q==1){scanf("%d",&x);del(1,1,n,x);//x为相对位置}else{scanf("%d%d",&x,&y);node ck=query(1,1,n,x,y);printf("%d %d\n",ck.minn,ck.maxn);}}
}

接题:

首先我们可以维护3,对于1,0用Lazy标识(4种)即可,对于2我们0的个数就是1的个数。

怎么求4?我们需要知道左区间末尾连续1的个数以及右区间开头连续1的个数,因为有0,那么还要维护连续0.

数10个tag(晕)。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{int lazy;//0权变0,1全变1,2反转,-1没干int sum[2],max[2],left[2],right[2];
}tr[400010];
int a[100010];
void pushup(int p,int l,int r){int mid=(l+r)/2;for(int i=0;i<=1;i++){tr[p].sum[i]=tr[p*2].sum[i]+tr[p*2+1].sum[i];tr[p].max[i]=max(max(tr[p*2].max[i],tr[p*2+1].max[i]),tr[p*2].right[i]+tr[p*2+1].left[i]);if(tr[p*2].left[i]==mid-l+1)tr[p].left[i]=tr[p*2].left[i]+tr[p*2+1].left[i];else  tr[p].left[i]=tr[p*2].left[i];if(tr[p*2+1].right[i]==r-mid)tr[p].right[i]=tr[p*2+1].right[i]+tr[p*2].right[i];else  tr[p].right[i]=tr[p*2+1].right[i];}
}
void build(int p,int l,int r){tr[p].lazy=-1;if(l==r){tr[p].sum[a[l]]=1;tr[p].max[a[l]]=1;tr[p].left[a[l]]=1;tr[p].right[a[l]]=1;return;}int mid=(l+r)/2;build(p*2,l,mid);build(p*2+1,mid+1,r);pushup(p,l,r);
}
void jiaohuan(int p){swap(tr[p].sum[0],tr[p].sum[1]);swap(tr[p].max[0],tr[p].max[1]);swap(tr[p].left[0],tr[p].left[1]);swap(tr[p].right[0],tr[p].right[1]);
}
void pushdown(int p,int l,int r,int mid){if(tr[p].lazy==2){jiaohuan(p*2);jiaohuan(p*2+1);if(tr[p*2].lazy==-1) tr[p*2].lazy=2;else if(tr[p*2].lazy==2) tr[p*2].lazy=-1;else tr[p*2].lazy^=1;if(tr[p*2+1].lazy==-1) tr[p*2+1].lazy=2;else if(tr[p*2+1].lazy==2) tr[p*2+1].lazy=-1;else tr[p*2+1].lazy^=1;tr[p].lazy=-1;}else{int a=tr[p].lazy;tr[2*p].lazy=a;tr[p*2].sum[a]=mid-l+1;tr[p*2].max[a]=mid-l+1;tr[p*2].left[a]=mid-l+1;tr[p*2].right[a]=mid-l+1;tr[p*2].sum[a^1]=0;tr[p*2].max[a^1]=0;tr[p*2].left[a^1]=0;tr[p*2].right[a^1]=0;tr[2*p+1].lazy=a;tr[p*2+1].sum[a]=r-mid;tr[p*2+1].max[a]=r-mid;tr[p*2+1].left[a]=r-mid;tr[p*2+1].right[a]=r-mid;tr[p*2+1].sum[a^1]=0;tr[p*2+1].max[a^1]=0;tr[p*2+1].left[a^1]=0;tr[p*2+1].right[a^1]=0;tr[p].lazy=-1;}
}
void change(int p,int l,int r,int x,int y,int a){if(x<=l&&r<=y){tr[p].lazy=a;tr[p].sum[a]=r-l+1;tr[p].max[a]=r-l+1;tr[p].left[a]=r-l+1;tr[p].right[a]=r-l+1;tr[p].sum[a^1]=0;tr[p].max[a^1]=0;tr[p].left[a^1]=0;tr[p].right[a^1]=0;return;}int mid=(l+r)/2;if(tr[p].lazy!=-1) pushdown(p,l,r,mid);if(x<=mid) change(p*2,l,mid,x,y,a);if(y>mid) change(p*2+1,mid+1,r,x,y,a);pushup(p,l,r);    
}
void rev(int p,int l,int r,int x,int y){if(x<=l&&r<=y){jiaohuan(p);if(tr[p].lazy==-1) tr[p].lazy=2;else if(tr[p].lazy==2) tr[p].lazy=-1;else tr[p].lazy^=1;return;}int mid=(l+r)/2;if(tr[p].lazy!=-1) pushdown(p,l,r,mid);if(x<=mid) rev(p*2,l,mid,x,y);if(y>mid) rev(p*2+1,mid+1,r,x,y);pushup(p,l,r); 
}
int find1(int p,int l,int r,int x,int y){if(x<=l&&r<=y){return tr[p].sum[1];}int mid=(l+r)/2;if(tr[p].lazy!=-1) pushdown(p,l,r,mid);int ans=0;if(x<=mid) ans+=find1(p*2,l,mid,x,y);if(y>mid) ans+=find1(p*2+1,mid+1,r,x,y);return ans;
}
node find2(int p,int l,int r,int x,int y){if(x<=l&&r<=y){return tr[p];}int mid=(l+r)/2;if(tr[p].lazy!=-1) pushdown(p,l,r,mid);if(y<=mid) return find2(p*2,l,mid,x,y);if(x>mid)  return find2(p*2+1,mid+1,r,x,y);node ans1=find2(p*2,l,mid,x,mid);node ans2=find2(p*2+1,mid+1,r,mid+1,y);ans1.max[1]=max(ans1.max[1],max(ans2.max[1],ans1.right[1]+ans2.left[1]));if(ans1.left[1]==mid-l+1) ans1.left[1]+=ans2.left[1];if(ans2.right[1]==r-mid) ans1.right[1]+=ans2.right[1];else ans1.right[1]=ans2.right[1];return ans1;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++) scanf("%d",&a[i]);build(1,1,n);for(int i=1;i<=m;i++){int op,a,b;scanf("%d%d%d",&op,&a,&b);a++,b++;if(op==0){change(1,1,n,a,b,0);}if(op==1) change(1,1,n,a,b,1);if(op==2) rev(1,1,n,a,b);if(op==3)  printf("%d\n",find1(1,1,n,a,b));if(op==4) printf("%d\n",find2(1,1,n,a,b).max[1]);}
}

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

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

相关文章

优秀企业都在用的企微知识库,再不搭建就晚了!

每个团队都在寻找让工作效率提升的方法。如果你想知道哪些团队能够高效地完成任务&#xff0c;而另一些却步履维艰&#xff0c;那么答案可能就是“企业微信知识库”。见过很多团队都在使用它&#xff0c;而且效果非常显著。如果你还没有搭建属于自己的企微知识库&#xff0c;可…

C++ 【原型模式】

简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象&#xff0c;客户端不需要知道要复制的对象是哪个类的实例&#xff0c;只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类&#xff0c;客户端代码无需改变&#xff0c;只需修改原型工…

各类系统业务功能架构图整理

一、前言 很多软件系统一直经久不衰&#xff0c;主要这些系统都是一些生产工作经营不可或缺的系统。比如财务系统&#xff0c;商城系统&#xff0c;支付系统&#xff0c;供应链系统&#xff0c;人力资源管理系统&#xff0c;ERP系统等等。这些系统不管大公司还是小公司往往都需…

简约轻量-失信录系统源码

失信录系统-最新骗子收录查询系统源码 首页查询&#xff1a; 举报收录页&#xff1a; 后台管理页&#xff1a; 失信录系统 V1.0.0 更新内容&#xff1a; 1.用户查询,举报功能 2.界面独立开发 3.拥有后台管理功能 4.xss,sql安全过滤 5.平台用户查询 6.用户中心&#xff08;待完…

揭开“栈和队列”的神秘面纱

前言 在线性表中不止有顺序表和链表&#xff0c;今天的主角就如标题所说--->认识栈和队列。把他们俩放一起总结是有原因的&#xff0c;还请看官听我娓娓道来~ 什么是栈&#xff1f; 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入和删除操作的线性表 咱可以把栈理…

【活动创作】未来AI技术方面会有哪些创业机会

放假期间突然看到这个活动创作&#xff0c;觉得很有意思&#xff0c;既然如此&#xff0c;我就先让AI来回答一下吧&#xff0c;哈哈 1、文心一言 首先来看看文心一言的回答&#xff1a; 2、讯飞星火 然后来看看讯飞星火的回答&#xff1a; 3、个人感受 最后来说说给人感受吧&am…

深入剖析主机安全中的零信任机制及其实施原理

引言 在数字化转型加速与云端服务普及的大背景下&#xff0c;传统依赖边界的网络安全模式逐渐显露出其局限性。面对愈发复杂多变的威胁环境&#xff0c;零信任安全架构作为新一代的安全范式应运而生&#xff0c;尤其是在主机层面的安全实践中&#xff0c;零信任机制正扮演着至…

【QT+QGIS跨平台编译】056:【pdal_arbiter+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_arbiter介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_arbiter介绍 pdal_arbiter是 PDAL 项目的一个库,用于帮助管理应用程序运行在 EC2 实例上的 AWS 凭证。 当应用程序需要调用 AWS API 时,它们必须使用 AWS 凭据对 AP…

达梦DMHS-Manager工具日常操作

目录 1、前言 2、同步服务管理 2.1、DMHS Agent节点管理 2.2、DMHS实例节点管理 2.3、DMHS模块节点管理 3、监控及告警 3.1、主机资源监控 3.2、同步链路监控 3.3、告警配置 4、系统管理 4.1、用户管理 4.2、角色管理 4.3、系统配置 4.4、审计信息 5、联机帮助 …

2024软件测试全套教程,软件测试自学线路图

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

4.7Qt

自由发挥应用场景实现一个登录窗口界面。 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置this->setWindowTitle("原神启动");this->setWindowIcon(QIcon("C:\\Users\\17212\\Pict…

工具推荐-针对Nacos利器-NacosExploitGUI_v4.0

Nacos是由阿里所开发的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 工具简介 集成Nacos的各种poc Nacos控制台默认口令漏洞(nacos,nacos)Nacostoken.secret.key默认配置(QVD-2023-6271)Nacos-clientYaml反序列化漏洞Nacos Jraft Hessian反序列化漏洞…

Redis中的Sentinel(六)

Sentinel 选举领头Sentinel. 当一个主服务器被判断为客观下线时&#xff0c;监视这个下线主服务器的各个Sentinel会进行协商&#xff0c;选举出一个领头Sentinel,并由领头 Sentinel对下线主服务器执行故障转移操作。以下是Redis选举领头Sentinel的规则和方法: 1.所有在线的S…

AcWing---转圈游戏---快速幂

太久没写快速幂了... 这是一道数学题orz&#xff0c;能看出来的话答案就是 &#xff0c;但是很大&#xff0c;同时还要mod n&#xff0c;直接用快速幂即可。 快速幂模版&#xff1a; long long int power(long long int a,long long int b,long long int mod){long long int r…

设计模式之命令模式(上)

命令模式 1&#xff09;概述 1.定义 命令模式(Command Pattern) 将一个请求封装为一个对象&#xff0c;可以用不同的请求对客户进行参数化&#xff1b;对请求排队或者记录请求日志&#xff0c;以及支持可撤销的操作。 2.作用 命令模式可以将请求发送者和接收者完全解耦&am…

31.2k star, 免费开源的白板绘图工具 tldraw

31.2k star, 免费开源的白板绘图工具 tldraw 分类 开源分享 项目名: tldraw -- 无限画布白板 Github 开源地址&#xff1a; https://github.com/tldraw/tldraw 在线测试地址&#xff1a; tldraw 文档地址&#xff1a; tldraw SDK tldraw 是一款开源免费的无限画布白板&…

基于springboot实现社区医院信息平台系统项目【项目源码+论文说明】

基于springboot实现社区医院信息平台系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了社区医院信息平台的开发全过程。通过分析社区医院信息平台管理的不足&#xff0c;创建了一个计算机管理社区医院信…

【Linux】环境基础开发工具使用——vim使用

Linux 软件包管理器 yum 什么是软件包 1.在 Linux 下安装软件 , 一个通常的办法是下载到程序的源代码 , 并进行编译 , 得到可执行程序 . 2.但是这样太麻烦了 , 于是有些人把一些常用的软件提前编译好 , 做成软件包 ( 可以理解成 windows 上的安装程序) 放在一个服务器…

人工智能 - 服务于谁?

人工智能服务于谁&#xff1f; 人工智能服务于生存&#xff0c;其最终就是服务于战争&#xff08;热战、技术战、经济战&#xff09; 反正就是为了活着而战的决策。 既然人工智能所有结果&#xff0c;来自大数据的分挖掘&#xff08;分析&#xff09;也就是数据的应用&#x…

Qt实现Kermit协议(四)

3 实现 3.3 KermitRecvFile 该模块实现了Kermit接收文件功能。 序列图如下&#xff1a; 3.3.1 KermitRecvFile定义 class QSerialPort; class KermitRecvFile : public QObject, public Kermit {Q_OBJECT public:explicit KermitRecvFile(QSerialPort *serial, QObject *…