备战蓝桥杯---线段树应用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.mzph.cn/news/795076.shtml

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

相关文章

RK3568测试

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

非关系型数据库------------Redis的安装和部署

目录 一、关系型数据库与非关系型数据库 1.1关系型数据库 1.2非关系型数据库 1.2.1非关系型数据库产生背景 1.3关系型非关系型区别 1.4客户访问时&#xff0c;关系型数据库与redis的工作过程 二、Redis 2.1redis简介 2.2Redis命中机制和淘汰机制 2.3Redis 具有以下优…

树莓派安装Windows搭建网盘和下载机

0 需求分析 在同一个局域网内&#xff0c;同时有多种设备&#xff08;Windows&#xff0c;Linux&#xff0c;Android&#xff09;需要进行大量的数据共享。另外&#xff0c;还时常需要从百度网盘/夸克网盘等网盘下载文件。不难看出&#xff0c;我的需求很简单&#xff0c;就是…

提醒:2024年思维100春季线上比赛今天报名截止,来看官方样题

【温馨提醒】今天是2024年4月6日&#xff0c;是2024年春季思维100活动第一阶段线上比赛报名的截止日期。如果要参赛&#xff0c;请设置好闹钟别错过了报名。更多安排和需要提前了解的关键点可以见我前面写的文章&#xff0c;或者直接联系我获取相关资料。 官方发布的2024年春季…

汽车网络安全管理

汽车网络安全管理 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c…

javaweb学习(day11-监听器Listener过滤器Filter)

一、监听器Listener 1 Listener介绍 Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是&#xff1a;Servlet 程 序、Listener 监听器、Filter 过滤器 Listener 是 JavaEE 的规范&#xff0c;就是接口 监听器的作用是&#xff0c;监听某种变化(一般就是对…

Java零基础入门-递归

一、概述 上一期&#xff0c;我们是具体学习了File类的一些概念基础知识点&#xff0c;以及对于该类的常用方法进行了一个全量举例演示&#xff0c;这也是考虑到有的小伙伴在阅读的同时&#xff0c;没有时间去实际测试&#xff0c;所以我也就顺带的给大家去做了实例演示&#x…

数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成

数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成 目录 数据生成 | Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.Matlab实现基于K-means和SVM的GMM高斯混合分布的数据生成&#xf…

【实现100个unity特效之7】unity 3d实现各种粒子效果

文章目录 先看最终效果下雨效果萤火虫和火花四溅的效果 3d下雨粒子效果涟漪效果雨滴和涟漪效果结合水花效果雨滴涟漪水花结合问题雾气效果萤火虫火花效果萤火虫和火花效果结合其他特效爆炸、闪电、火焰、雷雨特效&#xff08;2023/7/5更新&#xff09;源码完结 先看最终效果 下…

爬虫 新闻网站 并存储到CSV文件 以红网为例 V2.0 (控制台版)升级自定义查询关键词、时间段,详细注释

爬虫&#xff1a;红网网站&#xff0c; 获取指定关键词与指定时间范围内的新闻&#xff0c;并存储到CSV文件 V2.0&#xff08;控制台版&#xff09; 爬取目的&#xff1a;为了获取某一地区更全面的在红网已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 对比V1.0升级的…

ObjectiveC-10-OOP面向对象程序设计-分类/类别

类别(Category)是OjectiveC的一个特性&#xff0c;主要目的是让开发者可以以模块的形式向类添加方法&#xff08;扩展&#xff09;&#xff0c;创建标准化的方法列表供给其他人实现。 有些文档也会翻译成类别&#xff0c;其实是一个意思。 概述 语法说明 类别提供了一个简单的…

C语言中strlen函数的实现

C语言中strlen函数的实现 为了便于和strlen函数区别&#xff0c;以下命令为_strlen。 描述&#xff1a;实现strlen&#xff0c;获取字符串的长度&#xff0c;函数原型如下&#xff1a; size_t strlen(const char *str);_strlen实现&#xff1a; size_t _strlen(const char*…

在flutter中添加video_player【视频播放插件】

添加插件依赖 dependencies:video_player: ^2.8.3插件的用途 在Flutter框架中&#xff0c;video_player 插件是一个专门用于播放视频的插件。它允许开发者在Flutter应用中嵌入视频播放器&#xff0c;并提供了一系列功能来控制和定制视频播放体验。这个插件对于需要在应用中展…

Vite 项目中环境变量的配置和使用

Vite 项目中环境变量的声明 我们要在 Vite 项目中进行环境变量的声明&#xff0c;那么需要在项目的根目录下&#xff0c;新建 .env.[mode] 文件用于声明环境变量&#xff0c;如&#xff1a; .env.test 文件用于测试环境下项目全局变量的声明.env.dev 文件用于开发环境下项目全…

Scikit-Learn K均值聚类

Scikit-Learn K均值聚类 1、K均值聚类1.1、K均值聚类及原理1.2、K均值聚类的优缺点1.3、聚类与分类的区别2、Scikit-Learn K均值聚类2.1、Scikit-Learn K均值聚类API2.2、K均值聚类初体验2.3、K均值聚类案例1、K均值聚类 K-均值(K-Means)是一种聚类算法,属于无监督学习。K-M…

OpenFOAM学习笔记

OpenFOAM 计算流体力学&#xff1a;用计算机求解流体控制方程&#xff0c;来模拟真实情况下&#xff0c;流体的流动状态OpenFOAM的离散方法&#xff1a;有限体积法&#xff0c;将整个空间划分成若干个控制体OpenFOAM使用的网格系统&#xff1a;同位网格&#xff08;Collocated…

nvm保姆级安装使用教程

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

python相机校准

文章目录 张正友标定法角点检测标定去畸变 张正友标定法 相片是三维世界在二维平面上的投射&#xff0c;故而其深度信息是损失掉了的。但是&#xff0c;如果把拍照看作理想的小孔成像过程&#xff0c;那么相片中的每个像素&#xff0c;都将通过一个锥体与世界中真实的点一一对…

C++之双向链表与哈希链表用法区别实例(二百六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Cisco Unified Communications Manager (CallManager) 15.0 SU1 - 统一通信与协作

Cisco Unified Communications Manager (CallManager) 15.0 SU1 - 统一通信与协作 思科统一通信管理器 (CallManager) 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-ucm-15/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;…