HDU-3397 线段树+区间合并

hdu3397(线段树区间合并) 是一道坑题。。。大致的思维很好想,只要你知道区间合并,这题的结点维护的变量略多,这题需要用到lazy标记。我用的是一个lazy,写了200行代码,好不容易把样例过了,结果wa。。。瞟了一眼别人的博客,发现大多数是用两个lazy标记,我那时候想到是我lazy这地方有缺陷,我也不想 用两个lazy,一来是麻烦,二来是我根本想不到为什么用两个lazy,套用别人的东西,下次 也 不会做。。就酱紫,调试了半 阅读详情

Sequence operation


                                                                   Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
                                                                                            Total Submission(s): 8068    Accepted Submission(s): 2416


Problem Description
lxhgww got a sequence contains n characters which are all '0's or '1's.
We have five operations here:
Change operations:
0 a b change all characters into '0's in [a , b]
1 a b change all characters into '1's in [a , b]
2 a b change all '0's into '1's and change all '1's into '0's in [a, b]
Output operations:
3 a b output the number of '1's in [a, b]
4 a b output the length of the longest continuous '1' string in [a , b]
 

Input
T(T<=10) in the first line is the case number.
Each case has two integers in the first line: n and m (1 <= n , m <= 100000).
The next line contains n characters, '0' or '1' separated by spaces.
Then m lines are the operations:
op a b: 0 <= op <= 4 , 0 <= a <= b < n.
 

Output
For each output operation , output the result.
 

Sample Input
  
1 10 10 0 0 0 1 1 0 1 0 1 1 1 0 2 3 0 5 2 2 2 4 0 4 0 3 6 2 3 7 4 2 8 1 0 5 0 5 6 3 3 9
 

Sample Output
  
5 2 6 5
 

Author
lxhgww&&shǎ崽
 

Source
 


题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3397


总结:

  好久没写线段树,最近想复习一下,就找了这道以前觉得最复杂的区间合并来练手,上次做这道题还是一年半之前的8月集训,翻翻当时HDU上的记录,这道题整整调了3天。当时对pushdown和pushup这两个操作的理解还没有到位,两种标记处理的很拙劣。现在写线段树的境界有所提高,拿出来重新做,结果还是WA了4遍才过,所以写下这篇博客,记录一下这次错的几个地方:

  (1)第一个,翻转操作标记只是置1,忘记了偶数次翻转的抵消;

  (2)第二个,手残,区间合并的一个右边区间的左边连续1个数llb打成rrb,比赛的话写完代码一定要仔细查一遍;

  (3)第三个,区间合并是有条件的,忽略了mid必须在[a,b]之间的判断;

  (4)第四个,一个操作参数2打成3,原因是这题操作标签是0~4,印象中成了1~5,检查代码各种感觉不会错的细小的地方也要想一下!


AC代码:

  最后附上这次写的姿势比较优美的代码:

  

import java.io.*;

public class Main {
    static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static int nextInt() throws IOException    
    {  
        in.nextToken();    
        return (int)in.nval;     
    }
    static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));
    static int T,n,m,a,b,op,maxn=100000;
    static int[] aa=new int[maxn];
    static int[] ss=new int[maxn<<2];
    static int[] lz=new int[maxn<<2];
    static int[] re=new int[maxn<<2];
    static int[] lla=new int[maxn<<2];
    static int[] rra=new int[maxn<<2];
    static int[] mma=new int[maxn<<2];
    static int[] llb=new int[maxn<<2];
    static int[] rrb=new int[maxn<<2];
    static int[] mmb=new int[maxn<<2];
    static void pushup(int k,int l,int r)
    {
        int mid=(l+r)/2;
        ss[k]=ss[k*2+1]+ss[k*2+2];
        lla[k]=lla[k*2+1]+(lla[k*2+1]==mid+1-l?lla[k*2+2]:0);
        rra[k]=rra[k*2+2]+(rra[k*2+2]==r-mid?rra[k*2+1]:0);
        mma[k]=Math.max(rra[k*2+1]+lla[k*2+2],Math.max(mma[k*2+1],mma[k*2+2]));
        llb[k]=llb[k*2+1]+(llb[k*2+1]==mid+1-l?llb[k*2+2]:0);
        rrb[k]=rrb[k*2+2]+(rrb[k*2+2]==r-mid?rrb[k*2+1]:0);
        mmb[k]=Math.max(rrb[k*2+1]+llb[k*2+2],Math.max(mmb[k*2+1],mmb[k*2+2]));
    }
    static void pushdown(int k,int l,int r)
    {
        int mid=(l+r)/2;
        if(lz[k]!=-1)
        {
            up(l,r,k*2+1,l,mid,lz[k]);
            up(l,r,k*2+2,mid+1,r,lz[k]);
        }
        if(re[k]==1)
        {
            up(l,r,k*2+1,l,mid,2);
            up(l,r,k*2+2,mid+1,r,2);
        }
        lz[k]=-1;re[k]=0;
    }
    static void build(int k,int l,int r)
    {
        lz[k]=-1;re[k]=0;
        if(l==r)
        {
            lla[k]=rra[k]=mma[k]=1-aa[l];
            llb[k]=rrb[k]=mmb[k]=ss[k]=aa[l];
            return;
        }
        int mid=(l+r)/2;
        build(k*2+1,l,mid);
        build(k*2+2,mid+1,r);
        pushup(k,l,r);
    }
    static void up(int a,int b,int k,int l,int r,int op)
    {
        if(a>r||b<l) return;
        if(a<=l&&r<=b)
        {
            if(op==2)
            {
                ss[k]=r-l+1-ss[k];
                re[k]=(re[k]+1)%2;
                int c;
                c=lla[k];lla[k]=llb[k];llb[k]=c;
                c=rra[k];rra[k]=rrb[k];rrb[k]=c;
                c=mma[k];mma[k]=mmb[k];mmb[k]=c;
            }
            else
            {
                lz[k]=op;re[k]=0;
                int x=op==0?0:r-l+1;
                ss[k]=llb[k]=rrb[k]=mmb[k]=x;
                lla[k]=rra[k]=mma[k]=r-l+1-x;
            }
        }
        else
        {
            int mid=(l+r)/2;
            pushdown(k,l,r);
            up(a,b,k*2+1,l,mid,op);
            up(a,b,k*2+2,mid+1,r,op);
            pushup(k,l,r);
        }
    }
    static int sum(int a,int b,int k,int l,int r)
    {
        if(a>r||b<l) return 0;
        if(a<=l&&r<=b) return ss[k];
        int mid=(l+r)/2;
        pushdown(k,l,r);
        return sum(a,b,k*2+1,l,mid)+sum(a,b,k*2+2,mid+1,r);
    }
    static int len(int a,int b,int k,int l,int r)
    {
        if(a>r||b<l) return 0;
        if(a<=l&&r<=b) return mmb[k];
        int mid=(l+r)/2,res=0;
        pushdown(k,l,r);
        if(a<=mid&&mid<b)
        {
            res+=Math.min(mid+1-a,rrb[k*2+1]);
            res+=Math.min(b-mid,llb[k*2+2]);
        }
        res=Math.max(res,len(a,b,k*2+1,l,mid));
        res=Math.max(res,len(a,b,k*2+2,mid+1,r));
        return res;
    }

    public static void main(String[] args) throws IOException {
        T=nextInt();
        while(T-->0)
        {
            n=nextInt();m=nextInt();
            for(int i=0;i<n;i++)
                aa[i]=nextInt();
            build(0,0,n-1);
            while(m-->0)
            {
                op=nextInt();
                a=nextInt();b=nextInt();
                if(op==3)
                    out.println(sum(a,b,0,0,n-1));
                else if(op==4)
                    out.println(len(a,b,0,0,n-1));
                else up(a,b,0,0,n-1,op);
            }
            out.flush();
        }
    }
}

告别玄学:用Multisim或LTspice仿真带你直观理解PFC的三种工作模式(CCM/DCM/CrM) 本文通过Multisim和LTspice仿真工具,详细解析了PFC(功率因数校正)的三种工作模式(CCM、DCM、CrM)的本质差异。从波形捕捉到参数优化,提供了实用的仿真技巧和工程实践策略,帮助工程师直观理解并优化PFC电路设计,提升THD和功率因数。 阅读详情

相关推荐

DAGGER vs 传统模仿学习:为什么数据聚合能提升模型性能?

本文深入对比了DAGGER与传统模仿学习,揭示了传统方法因“分布不匹配”导致性能下降的根源。DAGGER通过动态的**数据聚合**机制,在智能体自身策略产生的状态分布上收集专家数据,从根本上解决了误差累积问题,从而显著提升了模型在实际部署中的鲁棒性和性能。

weixin_29170327的博客 234

HDU 3397(线段树)

Problem Description lxhgww got a sequence contains n characters which are all '0's or '1's. We have five operations here: Change operations: 0 a b change all characters into '0's in [a , b] 1 a b cha...

PCCCCC的博客 478

程序进入hardfault之后查找原因的方法

如果在MCU运行程序的时候,进入了hardfault,该怎么办?

smart_boy__的博客 761

HDU3397(Sequence operation)线段树解法

                                       Sequence operation                        Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)                                  ...

snayf的博客 356

Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

Geant4是由欧洲核子研究组织基于C++面向对象技术开发的蒙特卡罗应用软件包,用于模拟粒子在物质中输运的物理过程。由于具有良好的通用性和扩展能力,Geant4在涉及微观粒子与物质相互作用的诸多领域获得了广泛应用。 第一部分 Geant4的基本概念 HEP中的模拟是“虚拟现实”。仿真既可用于在研发阶段帮助设计探测器,又可用于物理研究中了解探测器的响应。为了创建这样的虚拟现实,我们需要对粒子间的相互作用,几何形状和材料进行建模,以便将基本粒子传播到检测器中。我们还需要描述检测器生成原始数据的灵敏度。 Gea

M_M-铭的博客 2万+

看不懂分子动力学模拟的结果?一文读懂RMSD曲线

随后,将每一帧结构与初始模板进行叠合,计算对应原子的平均偏移量,即RMSD。总之,掌握 RMSD 的解读方法,就等于抓住了评估分子动力学模拟成败与质量的“总开关”。①在模拟初始阶段,RMSD会从0迅速上升,这是蛋白质从静态晶体或模型结构释放到溶液环境中并逐渐适应的正常过程。②经过一段时间后,曲线不再系统性上升或下降,而是围绕一个平均值,小幅度地上下波动,形成一个稳定的“平台”。这种情况下,RMSD 在初始快速上升后,并未进入平台,而是持续甚至加速上升,始终未见收敛。🔍 如何解读不同趋势的RMSD曲线。

weixin_46587777的博客 4896

HDU-3397:Sequence operation(区间更新之合集?)

HDU-3397:Sequence operation(区间更新之合集?) 有前提条件的区间更新,

污miao汪的博客 324

uniapp [全端兼容] - 详细实现人脸识别和活体检测功能,实时监测人脸是否进入区域及动作是否正确播报,免费自动提示引导动作及语音,提供提供实名认证、身份证识别、人脸信息采集、刷脸扫脸认证示例代码

uniapp,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,人脸识别,扫脸认证,人脸认证,活体认证,身份认证,uni-app人脸识别详细教程,如何在app端实现免费人脸识别教程,如何在小程序端做,最好用的插件,安卓ios百度人脸识别、活体检测、人脸采集APP,H5人脸识别带前后摄像头,适合新手看的人脸识别功能教程,详细示例代码源码,有没有免费的,接入百度,阿里云人脸识别,百度,api,活体检测,数据采集,动作提示指引,语音提示指引,报错,无法核验一直出错,根本用

🏆 前端领域优质创作者 1万+

HDU 3397 线段树区间合并

点击打开链接 题意:五种操作,0全部置0,1全部置1,2是0变1 1变0,3是询问1的个数,4是询问最长连续的1 思路:推荐先写hdu 3911 ,是这题的简单版,这题注意的地方就是一旦有置0和置1操作,那么2操作的标记就要被覆盖,剩下的操作都是比较精典的区间合并操作了#include #include #include #include #include using namespa

Dan__ge的博客 506

Python 爬虫实战:模拟登录网易云音乐(加密接口逆向与自动化登录实现)

网易云音乐作为国内主流的音乐流媒体平台,其丰富的音乐资源和个性化推荐算法吸引了大量用户。对于开发者而言,模拟登录网易云音乐并实现自动化操作,可以用于数据分析、歌单同步、歌词抓取等场景。然而,网易云音乐采用了多重加密机制和反爬策略,直接模拟登录存在较大挑战。

yansideyucsdn的博客 2590

久坐不慌,健康护航 —— 智能震动提醒坐垫的设计与实现

硬件核心:选用 ESP32 为主控,HX711 + 应变片实现精准压力检测,8050 三极管驱动震动马达,锂电池 + TP4056 满足便携供电需求;软件逻辑:核心是 “压力阈值判断 + 时间计时”,达到久坐阈值后触发震动提醒,流程图清晰体现了循环检测、状态重置的核心逻辑;代码特性:代码注释完善,阈值可灵活调整,支持串口调试,新手可直接编译烧录并根据实际场景校准。

weixin_42300449的博客 401

HDU - 3397(线段树区间合并,01覆盖)

链接 题意 有5种操作 op = 0 ,改变[a,b]区间值全为0 op = 1 ,改变[a,b]区间值全为1 op = 2 ,改变[a,b]区间值翻转,0 --> 1 ,1 --> 0 op = 3,,查询[a,b]区间所有1的个数 op =4,查询[a,b]区间最长连续1的个数 思路 首先很明显需要用线段树来维护区间信息, 线段树维护的信息 int sum[man<&lt...

nofuck的博客 310

10分钟搞定manim安装与vscode配置

manim安装与vscode配置

帅帅de三叔 3413

hdu 3397 Sequence operation(线段树,lazy,区间合并)

hdu 3397 Sequence operation 线段树lazy和区间合并的

yjCola 577

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

hdu 3397(线段树区间合并)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意描述:给你一个0和1组成的序列,后给你五个操作,0 a,b,表示将区间a到b的值变为0,1 a,b表示将区间a到b的值变为1,2 a,b,表示将区间a到b的序列取

649

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

线段树内容总结(详细)

线段树上每一个节点即一个区间,每个区间维护一些信息,区间合并即小区间信息合并得到大区间信息,一个问题能不能使用线段树或者线段树上节点的这样的维护信息能不能解决问题,需要看区间能否合并,在代码中的具体体现就是常写的push_up函数。先给出几个例题引出区间合并,这里的例题以简单的形式叙述。

idio_dsfrbeki的博客 642

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HDU3397 Sequence operation(线段树的区间合并)

Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7547    Accepted Submission(s): 2254 Problem Description lxhgww g

KeyboardPianist的博客 605

hdu3397 Sequence operation 线段树区间合并

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:一个0,1序列,有三种操作方式:1、把某子区间置为0;2、把某子区间置为1;3、把某子区间0,1置反; 有两种询问:1、某子区间中1的个数;2、某子区间连续的1的个数最长是多少 对于第一种询问,就是普通的区间查询,第二种是一个区间合并的过程,可能是左子区间,右子区间或者中间合并一下

renew 859

HDU 3397 Sequence operation (线段树,成段更新,区间合并)

http://acm.hdu.edu.cn/showproblem.php?pid=3397 Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5801    Accepted Subm

fcbruce 1404

HDU - 3397 Sequence operation(线段树+区间合并)

题目链接:点击查看 题目大意:给定一个初始的数列,然后依次进行m次操作: 0 a b:将闭区间[a,b]内的点都变为0 1 a b:将闭区间[a,b]内的点都变为1 2 a b:将闭区间[a,b]内的点1变为0,0变为1(相当于取异或) 3 a b:查询闭区间[a,b]内有多少个1 4 a b:查询闭区间[a,b]内的最大连续的1的长度 题目分析:操作1、2、4是最简单的线段树操作,区...

Falcon的博客 442

HDU 3397 Sequence operation(线段树的区间合并)

lxhgww got a sequence contains n characters which are all '0's or '1's. We have five operations here: Change operations: 0 a b change all characters into '0's in [a , b] 1 a b change all characters into '1's in [a , b] 2 a b change all '0's into '1's

HJY 453

hdu 3397 线段树+区间合并+懒惰标记 好题

Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4603    Accepted Submission(s): 1338 Problem Description lxhgww

skyline 1395

HDU3397 线段树 区间合并 双标记

传送门:点击打开链接 Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6493    Accepted Submission(s): 1933 Problem Descripti

上决╇ф的ACM 572

hdu3397Sequence operation(线段树区间合并)

题目链接:hdu3397 线段树区间合并,和poj3667类似,都是老套路。。。 #include #include #include #include #include using namespace std; #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 const int N = 200005; struct nod

no pains,no gains 1042

【线段树】HDU 3397 Sequence operation 区间合并

操作 Change operations: 0 a b change all characters into '0's in [a , b] 1 a b change all characters into '1's in [a , b] 2 a b change all '0's into '1's and change all '1's into '0's in [a, b] Out

Kewowlo 1094

HDU 3397 Sequence operation(线段树区间合并)

题意: 0 a b将区间[a,b]所有数全部变成0 1 a b将区间[a,b]所有数全部变成1 2 a b将区间[a,b]中所有数0 1互换,0变1,1变0 3 a b输出区间[a,b]中1的个数 4 a b输出区间[a,b]中最长连续1的个数 解析: 涉及到线段树的多种操作。 mxL[0]表示左边最长连续0的个数 mxR[0]表示右边最长连续0的个数

小G的ACM之路 627
上一篇: Nachos操作系统课设 浅谈优先级调度
下一篇: Sublime Text 3在Windows下配置C++环境
AC_Machine
博客等级 码龄11年 1粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值