备战蓝桥杯---线段树应用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]);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 代码控制播放序列帧动画的实现

在Unity中有些应用场景的动画是通过序列帧实现的。 如下图即为一个英雄攻击的一个动画&#xff1a; 那么如何实现该序列帧动画的播放呢&#xff0c;我们可以通过代码来控制播放。 1、把以上序列帧导入编辑器中&#xff0c;并修改图片属性&#xff0c;如下图所示&#xff0c;其…

利用Idea实现Ajax登录(maven工程)

一、新建一个maven工程&#xff08;不会建的小伙伴可以参考Idea引入maven工程依赖(保姆级)-CSDN博客&#xff09;&#xff0c;工程目录如图 ​​​​​​​ js文件可以上up网盘提取 链接&#xff1a;https://pan.baidu.com/s/1yOFtiZBWGJY64fa2tM9CYg?pwd5555 提取码&…

UI自动化测试重点思考(上)--元素定位/验证码/测试框架

UI自动化测试重点思考--元素定位 Selenium定位元素selenium中如何判断元素是否存在&#xff1f;定位页面元素webdriver打开页面id定位name定位class_name定位tag_name 定位xpath定位css_selector定位link_text 定位partial_link 定位总结 selenium中元素定位的难点&#xff1f;…

K8S - Deployment 的版本回滚

当前状态 先看deployment rootk8s-master:~# kubectl get deploy -o wide --show-labels NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES …

武汉星起航:深耕全球市场,拓展国际影响力,共赢未来跨境新篇章

在瞬息万变的跨境电商领域&#xff0c;武汉星起航凭借其敏锐的创新意识和卓越的执行力&#xff0c;为行业注入了新的活力。作为一家追求卓越、勇于创新的企业&#xff0c;武汉星起航深知创新是成功的关键。公司通过不断探索新的商业模式、引入先进技术和优化运营流程&#xff0…

【pycharm】在debug循环时,如何快速debug到指定循环次数

【pycharm】在debug循环时&#xff0c;如何快速debug到指定循环次数 【先赞后看养成习惯】求关注收藏点赞&#x1f600; 在 PyCharm 中&#xff0c;可以使用条件断点来实现在特定循环次数后停止调试。这可以通过在断点处右键单击&#xff0c;然后选择 “Add Breakpoint” -&g…

【精品教程】护网HVV实战教程资料合集(持续更新,共20节)

以下是资料目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a; 01-HW介绍.zip 02-HTTP&Burp课程资料.zip 03-信息收集_3.zip 04-SQL注入漏洞_2.zip 05-命令执行漏洞.zip 06-XSS漏洞.zip 07-CSRF.zip 08-中间件漏洞.zip 09-SSRF.zip 10-XXE.zip 11-Java反序列…

2024 最新版 Proteus 8.17 安装汉化教程

前言 大家好&#xff0c;我是梁国庆。 今天给大家带来的是目前 Proteus 的最新版本——Proteus 8.17。 时间&#xff1a;2024年4月4日 获取 Proteus 安装包 我已将本篇所使用的安装包打包上传至百度云&#xff0c;扫描下方二维码关注「main工作室」&#xff0c;后台回复【…

Netty客户端发送数据给服务器的两个通道(1)

EventLoopGroup group new NioEventLoopGroup();// 设置的连接group。 Bootstrap bootstrap new Bootstrap().group(group).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000) // 超时时间。 .channel(NioSocketChannel.class).handler(new ChannelInitializer() { Ov…

【stm32】I2C通信协议

【stm32】I2C通信协议 概念及原理 如果我们想要读写寄存器来控制硬件电路&#xff0c;就至少需要定义两个字节数据 一个字节是我们要读写哪个寄存器&#xff0c;也就是指定寄存器的地址 另一个字节就是这个地址下存储寄存器的内容 写入内容就是控制电路&#xff0c;读出内容就…

vue 浅解watch cli computed props ref vue slot axios nexttick devtools说明使用

Vue.js 是一个强大的前端框架&#xff0c;它提供了很多有用的功能和工具。你提到的这些特性&#xff08;watch、cli、computed、props、ref、slot、axios、nextTick、devtools&#xff09;在 Vue 中各自扮演着不同的角色。下面我会逐一解释这些特性如何在 Vue 中使用&#xff1…

蓝桥杯每日一题:约数个数(质因数)

题目描述&#xff1a; 输入 n 个整数&#xff0c;依次输出每个数的约数的个数。 输入格式 第一行包含整数 n。 第二行包含 n 个整数 ai。 输出格式 共 n 行&#xff0c;按顺序每行输出一个给定整数的约数的个数。 数据范围 1≤n≤1000, 1≤ai≤10^9 输入样例&#xff…

分布式任务调度框架XXL-JOB

1、概述 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 官方文档&#xff1a;https://www.xuxueli.com/xxl-job/#%E4%BA%8C%E3%80%81%E5%BF%AB%E9%80%9F%E…

c# wpf Template ContentTemplate

1.概要 1.1 定义内容的外观 2.2 要点分析 2.代码 <Window x:Class"WpfApp2.Window1"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schem…

深入浅出 -- 系统架构之分布式系统底层的一致性

在分布式领域里&#xff0c;一致性成为了炙手可热的名词&#xff0c;缓存、数据库、消息中间件、文件系统、业务系统……&#xff0c;各类分布式场景中都有它的身影&#xff0c;因此&#xff0c;想要更好的理解分布式系统&#xff0c;必须要理解“一致性”这个概念。 其实关于…

Day83:服务攻防-开发组件安全JacksonFastJson各版本XStreamCVE环境复现

目录 J2EE-组件Jackson-本地demo&CVE 代码执行 (CVE-2020-8840) 代码执行 (CVE-2020-35728&#xff09; J2EE-组件FastJson-本地demo&CVE FastJson < 1.2.24 FastJson < 1.2.47 FastJson < 1.2.80 (利用条件比较苛刻) J2EE-组件XStream-靶场&CVE …

redis进阶入门配置与持久化

一、Redis.conf详解 容量单位 1、配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit,不区分大小写&#xff0c;G和GB有区别 2、对 大小写 不敏感 可以使用 include 组合多个配置问题 网络配置 bind 127.0.0.1 # 绑定的i…

ES学习日记(八)-------ik安装和简易使用

一、下载和安装 https://github.com/infinilabs/analysis-ik.git 网络不好可以用这个地址,注意:ik版本要和es版本保持一致 现成地址 注意es用户操作或给es用户权限 plugins新建ik文件夹,并把压缩包解压到ik unzip elasticsearch-analysis-ik-7.4.2.zip /bin目录启动es: 二…

【Rust】生命周期

Rust 生命周期机制是与所有权机制同等重要的资源管理机制。 之所以引入这个概念主要是应对复杂类型系统中资源管理的问题。 引用是对待复杂类型时必不可少的机制&#xff0c;毕竟复杂类型的数据不能被处理器轻易地复制和计算。 但引用往往导致极其复杂的资源管理问题&#x…

MyBatis 上

预备知识&#xff1a;JAVA基础、JDBC 文章目录 一、MyBatis简介二、搭建MyBatis1. 开发环境2. 创建模块&#xff0c;导入坐标3. 创建MyBatis的核心配置文件 --> 替换连接信息解决硬编码问题4. 创建mapper接口5. 创建SQL的映射文件 --> 统一管理sql语句&#xff0c;解决硬…