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

HDU - 3397 Sequence operation (线段树,区间修改,亦或,查询,以及最长连续的1) 有5个操作, 0  区间全部置为0 1 区间全部置为1 2 区间的值取反,1 变0 ,0变1, 3 求区间1 的个数。 4 求区间连续最长的1.   思路: lazy标记, 有 -1,0,1,2, 四种标记, -1 是什么都没有, 0,1 算是一种操作,区间修改, 2 是一种操作,亦或。   因为亦或这个操作。我们存一下1 的所有数据,0的所有数据,便于以后交换。 我们... 阅读详情


hdu 3397 Sequence operation


线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了

0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区间进行取反

3的查询没啥好说的,最基础的求和查询

4的查询要用到区间合并的操作,需要注意的是查询区间跨左右儿子时要考虑跨区间的连续为1的段要在查询区间内


#include<cstdio>
#include<cstring>
#define MAXN 100005
#define lch p<<1
#define rch p<<1|1
//#define mid (t[p].l+t[p].r)>>1
struct node
{
    int l,r;
    int cover;
    int sum;
    int mx,lmx,rmx;
    //int getlen() {return r-l+1;}
    int len;
}t[MAXN<<2];
int max(int a,int b) {return a>b?a:b;}
int min(int a,int b) {return a<b?a:b;}
void pushup(int p)
{
    t[p].sum=t[lch].sum+t[rch].sum;
    
    t[p].mx=max(t[lch].mx,t[rch].mx);
    t[p].mx=max(t[p].mx,t[lch].rmx+t[rch].lmx);
    
    t[p].lmx=t[lch].lmx;
    if(t[lch].lmx==t[lch].len) t[p].lmx+=t[rch].lmx;
    
    t[p].rmx=t[rch].rmx;
    if(t[rch].rmx==t[rch].len) t[p].rmx+=t[lch].rmx;
}
void construct(int l,int r,int p)
{
    t[p].len=r-l+1;
    t[p].l=l,t[p].r=r;
    t[p].cover=-1;
    if(l==r)
    {
        scanf("%d",&t[p].mx);
        t[p].cover=t[p].lmx=t[p].rmx=t[p].sum=t[p].mx;
        return ;
    }
    int m=(t[p].l+t[p].r)>>1;
    construct(l,m,lch);
    construct(m+1,r,rch);
    pushup(p);
}
void refresh(int p)
{
    if(t[p].cover==0)
        t[p].mx=t[p].lmx=t[p].rmx=t[p].sum=0;
    else
        t[p].mx=t[p].lmx=t[p].rmx=t[p].sum=t[p].len;
}
void pushdown(int p)
{
    t[lch].cover=t[p].cover;
    t[rch].cover=t[p].cover;
    refresh(lch);
    refresh(rch);
    t[p].cover=-1;
}
void modify(int l,int r,int p,int op)
{
    if(t[p].l==l&&t[p].r==r)
    {
        t[p].cover=op;
        refresh(p);
        return ;
    }
    if(t[p].cover!=-1) pushdown(p);
    int m=(t[p].l+t[p].r)>>1;
    if(r<=m) modify(l,r,lch,op);
    else if(l>m) modify(l,r,rch,op);
    else modify(l,m,lch,op),modify(m+1,r,rch,op);
    pushup(p);
}
void modify_xor(int l,int r,int p)
{
    if(t[p].l==l&&t[p].r==r&&(t[p].sum==0||t[p].sum==t[p].len))
    {
        if(t[p].sum) t[p].cover=0;
        else t[p].cover=1;
        refresh(p);
        return ;
    }
    if(t[p].cover!=-1) pushdown(p);
    int m=(t[p].l+t[p].r)>>1;
    if(r<=m) modify_xor(l,r,lch);
    else if(l>m) modify_xor(l,r,rch);
    else modify_xor(l,m,lch),modify_xor(m+1,r,rch);
    pushup(p);
}
int query(int l,int r,int p)
{
    if(t[p].l==l&&t[p].r==r)
        return t[p].sum;
    if(t[p].cover!=-1) pushdown(p);
    int m=(t[p].l+t[p].r)>>1;
    if(r<=m) return query(l,r,lch);
    else if(l>m) return query(l,r,rch);
    else return query(l,m,lch)+query(m+1,r,rch);
}
int query_len(int l,int r,int p)
{
    if(t[p].l==l&&t[p].r==r)
        return t[p].mx;
    if(t[p].cover!=-1) pushdown(p);
    int m=(t[p].l+t[p].r)>>1;
    if(r<=m) return query_len(l,r,lch);
    else if(l>m) return query_len(l,r,rch);
    else
    {
        int ans=max(query_len(l,m,lch),query_len(m+1,r,rch));
        int lans=min(t[lch].rmx,t[lch].r-l+1),
        rans=min(t[rch].lmx,r-t[rch].l+1);
        return  ans=max(ans,lans+rans);
    }
}
int main()
{
    int cas,n,m,op,l,r;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d%d",&n,&m);
        construct(0,n-1,1);
        while(m--)
        {
            scanf("%d%d%d",&op,&l,&r);
            if(op==0)
                modify(l,r,1,0);
            else if(op==1)
                modify(l,r,1,1);
            else if(op==2)
                modify_xor(l,r,1);
            else if(op==3)
                printf("%d\n",query(l,r,1));
            else
                printf("%d\n",query_len(l,r,1));
        }
    }
    return 0;
}


逆向攻防世界CTF系列40-ReverseMe-120 注意sub_401000main中只传了两个参数,但是跟进后发现四个(可能是隐式传递,放在寄存器里传递了),调试发现a4是输入长度,与最终的you_know_how_to_remove_junk_code比较的是v12(但是并没有被传入),开始怀疑是不是隐式传递了。_mm_xor_si128用于计算128位(16字节)的按位异或,然后通过v14控制循环结束的条件,可以看到v14增长的步长为16,而且通过上面得到的flag值解码得到的字符串为32个字节大小,正好是16的整数倍。 阅读详情

相关推荐

ANSYS APDL实战:手把手教你搞定电磁-热耦合分析(附完整命令流)

本文通过一个工业感应加热线圈的实战案例,手把手教你使用ANSYS APDL完成电磁-热耦合分析。内容涵盖从几何建模、材料定义、网格划分到加载求解及后处理的完整流程,重点讲解了使用PLANE13单元进行双向耦合场分析的方法与命令流调试技巧,助力工程师快速掌握这一核心仿真能力。

weixin_29284201的博客 419

hdu 3397 Sequence operation (线段树+区间合并+双Lazy标记)

给你一个长度为n的0、1序列,然后对该序列进行m次操作(1 0 a b 将[a, b]上的所有数变为0; 1 a b 将[a, b]上的所有数变为1; 2 a b 将[a, b]上的0变成1,1变成0; 3 a b 输出[a, b]上1的个数; 4 a b 输出[a, b]上最长的连续的1的数目。 刚开始做的时候就想用两个Lazy标记,一个覆盖标记,一个异或

~飞呀,飞~ 1066

4、I3C协议详解

I3C最初的设计目的是为移动设备创建一个能够使用多个传感器的单一接口。随着现代化移动设备对于传感器数量的增加以及对性能的提高,I2C和SPI已经达到了他们所能支持的临界点,而I3C的出现就是为了解决这一问题,I3C可以在同一根主线上支持更多的传感器设备,而且不会因为要支持中断或睡眠模式而增加额外的逻辑信号。I3C可以在更低功耗的情况下提供更快的传输速率,该特性的提升不止是对移动设备,对其他的嵌入式设备也都是很大的帮助。例如穿戴设备,需要在有限的物理空间中使用多个传感器并且要求更小的耗电。 一、简述..

迟子涵925的博客 2万+

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的博客 441

MaxENT生态位模型实战:从数据准备到论文发表的完整指南

本文提供MaxENT生态位模型从数据准备到论文发表的完整实战指南,涵盖物种分布数据处理、环境变量筛选、参数优化及结果可视化等关键步骤。特别介绍如何通过R语言进行高级建模优化,提升模型AUC值,并分享海洋生物专题研究中的数据处理技巧。适合生态学研究者快速掌握这一强大的物种分布预测工具,产出高质量研究成果。

tensor9flow的博客 301

STM32F407控制舵机

STM32F407控制舵机运行 使用STM32F407控制舵机,首先来看下舵机图片 [黑红白,黑线接GND,红线接VCC,信号线接白色线(有的舵机线的颜色不同,例如褐色红色橘色,仅颜色不同接法还如上述)] 舵机需要信号的周期为20ms,即频率为50Hz。 接下来正式操作: 步骤一:STM32F4程序(本次程序的PWM信号产生的周期频率由定时器TIM14通道1产生(TIM14_CH1),想要使用其它定时器也没关系下面会讲到) #include "pwm.h" void TIM14_CH1_PWM_In

Ievn_Hare的博客 1万+

线段树/lazy技巧(HDU - 3397 Sequence operation)

题目链接 普通线段树,只不过要维护的东西有点多: struct Node { int l, r; int sum0, sum1;//0,1的总和 bool flag0;//全0标记 bool flag1;//全1标记 int add;//操作延迟标记 int sumc0;//最长连续0长度 int sumc1;//最长连续1长度 in...

平凡人Kalzn的博客 161

从入门到精通!Arduino 全栈开发深度指南

本文围绕 Arduino 开发撰写全攻略,从基础入门到高级应用层层递进。开篇介绍 Arduino 概念、优势及硬件家族,引导读者完成开发环境搭建与首个 LED 闪烁项目;深入讲解编程语法、I/O 控制及通信协议;详细阐述传感器、模块应用与调试优化技巧;最后以自定义库开发、低功耗设计等高级内容收尾,并给出综合项目案例与产品化思路。无论新手入门,还是开发者进阶,均可从中系统学习 Arduino 知识,掌握从理论到实践的全流程开发技能。

邓邓子的博客 2754

HDU3397 Sequence operation

  原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3397   线段树,区间合并。   节点记录的信息如下:   int l, r, c;          // 区间左端点,右端点,长度  int lsum1, rsum1, msum1; // 左连续1长度,右连续1长度,区间最长连续1长度  i...

weixin_30497527的博客 81

【YOLOv8改进[Conv]】使用OREPA助力V8更优秀

使用OREPA助力V8更优秀,降低训练成本,在不引入任何推理时间成本的情况下提高深度模型的性能。

静谧、淡雅 1917

科研绘图系列:R语言circos图(circos plot)

科研绘图系列:R语言circos图(circos plot)

专注生信领域 3430

HDU - 3397 Sequence operation && HDU - 3911 Black And White(线段树)

两道线段树的硬怼题,都是线段树的基本操作,区间合并,区间求和,区间修改,lazy标记 3911 #include &lt;bits/stdc++.h&gt; using namespace std; const int MAXN = 100005; #define lson num &lt;&lt; 1 #define rson num &lt;&lt; 1 | 1 struct node ...

GYH0730的博客 255

【XCharts插件】3-1、制作图表及代码生成图表(v1.0)

XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。【Unity3D插件】XCharts插件完全教程《全网最全》-专栏文章目录OK,这是v1.0版本的XCharts插件的创建图表,代码生成图表的教程。可能有人要问了,既然都更新到v3.0了,还写啥v1.0教程呢。因为有些项目就是用v1.0去制作图表了,也没有太多的精力去更新插件,所以就一直用的v1.0,而且v1.0已经能实现大部分的图标样式了,所以,博主还是单独写了一篇文章来介绍v1.0的功能。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1293

HDU 3397 Sequence operation

题目在此 跟着13哥学线段树,

qqspeed 715

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

HDU 3397 Sequence operation

一道很好的线段树的题目,其实是我在给大家拉题目的时候拉错的。。。简直逗的不行。。。 这道题目对序列大概有下面几个操作: set 操作,就是把区间里的所有数变成0或1 转置操作:把一个区间里的数从0变成1,从1变成0 查询1操作:返回一个区间里1的个数 查询2操作:返回一个区间中最长的1的长度 如果割裂来看的话每个操作都很容易实现,set操作和转置操作可以用lazy操作实现(你如果不用l

\*zyeric*/ 530

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HDU 3397 Sequence operation(线段树区间更行)

题意: 给你一个01的串,有五种操作,第一种,将某个区间覆盖成0,第二种,将某个区间覆盖成1,第三种,将某个区间取反(即0变1,1变0),第四种,问某个区间1的个数,第五种,问某个区间最长连续的1的长度 思路: 超级超级超级麻烦的区间更新 首先,对于1,2,4操作,都是基础线段树的操作,5是基础区间更新的操作,但是此时多了一个3操作,导致写起来直接麻烦了很多 首先因为有异或和区间覆盖,我

Roll_Keyboard的博客 441

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

hdu3397 Sequence operation 线段树区间更新&&bzoj1858: [Scoi2010]序列操作

题目大意:给一个01串,给3种操作,分别是将一个区间置0,置1和取反。给2种查询,分别是查询某个区间1的个数和查询某个区间最长连续1的个数。 题目分析:线段树好题。 对区间的3种操作中,置0和置1操作很简单,直接将区间lazy标记,强制覆盖。如果是对区间取反的话,就要考虑区间原来的状态了。如果原来该区间已经取反了,再取反相当于还原,如果该区间没有标记,标记上取反直接返回,如果有标记,则

WJSZMRX 740

HDU 3397——Sequence operation(线段树,区间染色+区间异或+区间合并)

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

fsdcyr 946

zoj 3633 Alice's present 线段树

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3633 题意:给出一n个数的序列,然后又m个询问[x,y](下标),如果[x,y]内没有重复的数,就输出OK,否则输出从右至左第一个重复的数字 测试数据: 5 1 2 3 1 2 3 1 4 1 5 3 5 [1,4]间从右到左第一个重复的数字是1 [

yjCola 4723

poj3667 Hotel (线段树区间合并)

链接:http://poj.org/problem?id=3667 题意:n个连续的房间m个操作。操作分两种,第一种以1 x形式给出,找到最左的能连续容下x个人的连续房间,并输出左端点的编号,如果找不到就输出0.第二章以2 l x的形式给出,表示以l为起点的x个房间都清空。 查询的时候要能直接获取区间的最大连续空房间,这样就能判断能不能连续放下这x个人,但这样还确定不了具体放哪。放的位

yjCola 2409

poj 3468 A Simple Problem with Integers(线段树成段更新,延迟标记,Lazy)

链接:http://poj.org/problem?id=3468 线段树成段更新,延迟更新 #include #include #define MAXN 100005 struct node { int l,r; __int64 s,c; }t[MAXN*4]; void construct(int l,int r,int p) { t[p].l=l,t[p].r=r,t[

yjCola 1814

hdu 4521 小明系列问题——小明序列

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4521 题目中文 这个题我用线段树做的,也有更快的算法,这里只介绍线段树的方式 叶子节点为输入的值 从头开始遍历,线段树天然地排好序,所有不用管大小的问题,设加入了点a[i],那么在一个子序列中这个点最近的下一个点就是a[i+d+1],相当于对于a[i+d+1]来说,当加入了点a[i]时,就

yjCola 994

hdu 1542 Atlantis(线段树,扫描线)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 题意:n个矩阵,给出每个矩阵的左下和右上两个点的坐标,求出所有矩形总的覆盖面积。 扫描线问题,因为坐标是浮点型,那就必须把坐标离散化,我这直接上map了。 再来就是求这个面积的方式了:我这是向y轴映射,那么就保存每一条竖线,包扩该条竖线的x坐标,上下两个y坐标,还有用lr保存这条竖线是

yjCola 972

poj2777 Count Color线段树延迟更新,二进制状态记录

题目链接 线段树延迟更新的运用,这里用到二进制的方式保存状态,位运算向上更新状态 需要注意的是给出的a,b可能a>b #include #include #define MAXN 100005 struct node { int l,r; int c; int rec; }t[MAXN*4]; void construct(int l,int r,int p)

yjCola 946

poj 2352-Stars

链接:http://poj.org/problem?id=2352 因为题目给出的数据y是非递减的,所以y可以直接忽略掉,题目不是很难,比较适合练手,给出线段树和树状数组做的代码 线段树: #include #include #define MAXN 32010 int sum[15010]; struct node { int l,r; int s; }t[4*

yjCola 903

hdu 3255 Farming(扫描线、求立方体交)

hdu 3255 Farming 纠结了几个小时,不过还是很值得的,x

yjCola 874
上一篇: hdu 1540 Tunnel Warfare(线段树区间合并)
下一篇: poj 1191 棋盘分割(dp,黑书dp例二)
yjCola
博客等级 码龄14年 4粉丝 138原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值