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

PADS安装教程(超详细) 声明:个人实践 一、工具准备 pads9.5完整破解版百度网盘提取码【wjx9】 链接:https://pan.baidu.com/s/1pIP6BJO435ssmF7Hjwyz8A 提取码:wjx9 安装环境:win10 64位 二、开始解压安装 关闭杀毒,exe以管理员身份运行 点击【skip】,不然又得licese 点击【agree】 点击【modify】 设置安装的工具、路径及工程路径 设置完成后,开始【install】 在之后注册。 将Crack复制到PADS安装目录 阅读详情

题意:

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的个数
mx[0]表示当前区间最长连续0的个数
mxL[1],mxR[1],mx[1]同上
为什么要定义mx[0],和mx[1]这些标记,是为了在区间翻转的时候得到互相的值。

查询区间最长连续1个数的过程中;
maxl=[l,m]上最长连续1个数
maxl=[m+1,r]上最长连续1的个数
maxm=min(m−l+1,左孩子的rs)+min(r−m,右孩子的ls)
结果应该是这三个中的最大值,即max(maxl,maxr,maxm)

注意:

有个地方需要注意下,就是懒惰传递的先后问题。
我一直WA在这里,后看别人解释,如果覆盖的话,那么异或已经没有用了,把异或标记为0即可。

还有一个问题,怎么确定是先覆盖再异或,还是先异或再覆盖。
这两个的结果可能是不同的,所以必须确定,是怎么的一种传递方法?

传递的时候,如果是覆盖传递,那么子节点的异或失效。如果是异或传递,无影响。(因为存在异或,说明之前不会有覆盖经过这里)

my code

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ls (o<<1)
#define rs (o<<1|1)
#define lson ls, L, M
#define rson rs, M+1, R
using namespace std;
const int N = 1e5 + 10;

int n, m;
int mxL[N<<2][2], mxR[N<<2][2], mx[N<<2][2];
int sum[N<<2];
int XOR[N<<2], cov[N<<2];

inline int max(int a, int b, int c) { return max(a, max(b, c)); }

void setXOR(int o, int L, int R) {
    XOR[o] ^= 1;
    swap(mxL[o][0], mxL[o][1]);
    swap(mxR[o][0], mxR[o][1]);
    swap(mx[o][0], mx[o][1]);
    sum[o] = (R - L + 1) - sum[o];
}

void setCov(int o, int L, int R) {
    int cur = cov[o], tmp = cov[o]^1;
    int len = R - L + 1;
    mxL[o][cur] = mxR[o][cur] = mx[o][cur] = len;
    mxL[o][tmp] = mxR[o][tmp] = mx[o][tmp] = 0;
    sum[o] = cur * len;
}

void pushDown(int o, int L, int R) {
    int M = (L + R)/2;
    if(cov[o] != -1) {
        cov[ls] = cov[rs] = cov[o];
        XOR[ls] = XOR[rs] = false;
        setCov(lson);
        setCov(rson);
        cov[o] = -1;
    }
    if(XOR[o]) {
        setXOR(lson);
        setXOR(rson);
        XOR[o] = false;
    }
}

void merge(int o, int L, int R, int x) {
    int M = (L + R)/2;
    mxL[o][x] = mxL[ls][x]; mxR[o][x] = mxR[rs][x];

    int len1 = M - L + 1, len2 = R - M;
    if(mxL[ls][x] == len1) mxL[o][x] += mxL[rs][x];
    if(mxR[rs][x] == len2) mxR[o][x] += mxR[ls][x];

    int midlen = mxR[ls][x] + mxL[rs][x];
    mx[o][x] = max(mx[ls][x], mx[rs][x], midlen);
}

void pushUp(int o, int L, int R) {
    merge(o, L, R, 1);
    merge(o, L, R, 0);
    sum[o] = sum[ls] + sum[rs];
}

void modify(int o, int L, int R, int ql, int qr, int op) {
    if(ql <= L && R <= qr) {
        if(op < 2) {
            cov[o] = op;
            XOR[o] = false;
            setCov(o, L, R);
        }else {
            setXOR(o, L, R);
        }
        return ;
    }
    pushDown(o, L, R);
    int M = (L + R)/2;
    if(ql <= M) modify(lson, ql, qr, op);
    if(qr > M) modify(rson, ql, qr, op);
    pushUp(o, L, R);
}

int queryMax(int o, int L, int R, int ql, int qr) {
    if(ql <= L && R <= qr) return mx[o][1];
    int M = (L + R)/2, ret = 0;
    pushDown(o, L, R);
    if(qr <= M) ret = queryMax(lson, ql, qr);
    else if(ql > M) ret = queryMax(rson, ql, qr);
    else {
        int len1 = queryMax(lson, ql, M), len2 = queryMax(rson, M+1, qr);  
        int len0 = min(mxR[ls][1], (M - ql + 1)) + min(mxL[rs][1], (qr - M));
        ret = max(len0, len1, len2);
    }
    pushUp(o, L, R);
    return ret;
}

int querySum(int o, int L, int R, int ql, int qr) {
    if(ql <= L && R <= qr) return sum[o];
    int M = (L + R)/2, ret = 0;
    pushDown(o, L, R);
    if(ql <= M) ret += querySum(lson, ql, qr);
    if(qr > M) ret += querySum(rson, ql, qr);
    pushUp(o, L, R);
    return ret;
}

void build(int o, int L, int R) {
    cov[o] = -1, XOR[o] = false;
    if(L == R) {
        int val;
        scanf("%d", &val);
        cov[o] = val;
        setCov(o, L, R);
        return ;
    }
    int M = (L + R)/2;
    build(lson);
    build(rson);
    pushUp(o, L, R);
}

int main() {
    int op, a, b;

    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d", &n, &m);
        build(1, 0, n-1);
        while(m--) {
            scanf("%d%d%d", &op, &a, &b);
            if(op <= 2) {
                modify(1, 0, n-1, a, b, op);
            }else if(op == 3) {
                printf("%d\n", querySum(1, 0, n-1, a, b));
            }else {
                printf("%d\n", queryMax(1, 0, n-1, a, b));
            }
        }
    }
    return 0;
}
ESP32C6+ESP-IDF5.2实战:基于RS485的ModbusRTU从站开发与调试 本文详细介绍了基于ESP32C6和ESP-IDF5.2开发ModbusRTU从站的实战指南。涵盖硬件连接、协议实现、ESP-Modbus库移植、寄存器映射及调试技巧,帮助开发者快速构建稳定可靠的工业级RS485通信节点,并解决常见通信故障。 阅读详情

相关推荐

SAP SD实战:用BADI_SLS_HEAD_SCR_CUS给销售订单VA01/VA02加自定义字段(附完整函数组代码)

本文详细解析了在SAP SD模块中如何利用BADI_SLS_HEAD_SCR_CUS实现销售订单(VA01/VA02)的屏幕增强,包括数据结构设计、函数组创建和BADI接口实现。通过实战案例和完整代码,帮助开发者掌握在SAPMV45A标准流程中添加自定义字段的关键技术,提升业务定制化能力。

weixin_27015733的博客 369

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

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

yjCola 577

银河麒麟鲲鹏aarch64架构安装docker和K8s

鲲鹏云服务器上安装docker-云社区-华为云 (huaweicloud.com) 这里我下载的版本是docker-18.09.3.tag docker 安装包地址:https://download.docker.com/linux/static/stable 配置system服务 在github对应分支的contrib/init/systemd/ 下面,提供了对应的docker.service以及docker.socket文件,可以直接拷贝到本地文件使用: 对应链接:https://github.c

qq_50007696的博客 9056

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

深入解析璞致PZ-ZU47DR RFSoC核心板:硬件架构与多通道ADC/DAC设计实战

本文深入解析璞致PZ-ZU47DR RFSoC核心板的硬件架构与多通道ADC/DAC设计实战。作为Xilinx Zynq UltraScale+ RFSoC系列的代表产品,PZ-ZU47DR集成了8通道5GSPS ADC和8通道9.85GSPS DAC,支持直接射频采样,大幅简化射频链路设计。文章详细介绍了其技术优势、设计挑战及实战技巧,为5G小基站、毫米波等应用场景提供高效解决方案。

meat5的博客 842

TSMaster如何用珠海创芯CAN卡实现高效CAN通信(附完整驱动安装指南)

本文详细介绍了如何使用TSMaster软件与珠海创芯CAN卡实现高效CAN通信,包括驱动安装、系统配置、ControlCAN.dll替换及TSMaster集成配置等关键步骤。通过实战指南和故障排除技巧,帮助工程师快速搭建稳定可靠的CAN通信测试环境,适用于汽车电子和工业控制等领域。

weixin_29201859的博客 482

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

国产NAS哪家强?极空间&绿联&威联通&群晖对比

随着个人数据量暴增,传统网盘空间不足和下载速度慢问题愈发凸显。新势力NAS,作为数据管理领域的璀璨新星,正以其独特的互联网设计理念,引领家庭及小型办公用户向数据存储的新纪元。它不仅仅是一款产品,更是为初学者用户量身定制的贴心伙伴。其系统界面之简洁、操作流程之直观,让人一目了然,真正实现了“即插即用”的极致便捷。同时,新势力NAS在保持专业水准的同时,更提供了多样化的扩展性配置,轻松应对各种数据存储与管理需求,让家庭及小型办公场景下的数据管理变得前所未有的简单与高效。

专注大数据、云计算、人工智能、机器人领域技术传播 3647

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

“傻瓜”学计量——双重差分DID3(多期双重差分原理+解决方案CSDID原理)

“傻瓜”学计量——双重差分DID3(多期双重差分原理+解决方案CSDID原理)

nnpersistent的博客 5057

【OpenBMC 系列】4.启动流程 使用qume模拟ast2600-evb

1.安装openbmc适配的qume 2.启动bmc 3.使用bmc web

AiFool的博客 4459

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

RT-DETR改进策略【Conv和Transformer】| ICCV-2023 iRMB 倒置残差移动块 轻量化的注意力模块

本文记录的是利用模块优化的目标检测网络模型。的作用在于克服了常见模块无法同时吸收CNN 效率建模局部特征和利用Transformer 动态建模能力学习长距离交互的问题。相比一些复杂结构或多个混合模块的方法,能更好地权衡模型成本和精度。本文将其用于的模型改进和二次创新,更好地突出重要特征,提升模型性能。Rethinking Mobile Block for Efficient Attention-based Models从微观角度看,由和组成。及其改进的实现代码如下: 四、创新模块 4.1 改进点1⭐ 模块

Limiiiing的博客 816

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【线段树】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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

HDU3397 Sequence operation 区间修改,区间异或,区间合并,线段树经典题

区间修改,区间异或,区间合并,线段树经典题 #include #include #include using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ls (rt<<1) #define rs (rt<<1|1) const int M = 100001; int n

= = 1562

HDU 3397 Sequence operation(线段树·成段更新·区间合并·混合操作)

题意  给你一个只有0, 1的数组  有这些操作   0. 将[a, b]区间的所有数都改为0   1. 将[a, b]区间的所有数都改为1   2. 将[a, b]区间的所有数都取反 即与1异或   3. 输出区间[a, b]中1的个数  即所有数的和   4. 输出区间[a, b]中最大连续1的长度 对于所有的3, 4操作输出对应的答案 单个的操作都很简单  但搞在一起就

Deng's site \# 970

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

维护8个数组,区间和,区间连续1和0的最多的范围,左区间最多连续1和0的范围,右区间最多连续1和0的范围, 和一个懒标记数组c[],-2为全0,-1为全1,1为互换(就是^1)。 代码: #include #include #include #include #define lson l, m , rt<<1 #define rson m+1,r, rt<<1|1 using na

Neutralzz的博客 294

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

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

捡起回忆碎片 386

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

妈的调了两天终于过了。。。我好菜啊。 题意 对长度为n的序列执行q种操作, 0:把区间内的值都置为0; 1:把区间内的值都置为1; 2:把区间内的0都置为1,区间内的1都置为0; 3:查询区间里1的个数; 4:查询区间里最长的连续为1的区间的长度; 题解 显然,线段树区间更新区间查询可解此题,具体是: 维护懒标标记set,区间里1的个数sum1,区间左端点l,区间右端点r,区间...

weixin_34176694的博客 141

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

比较麻烦的一道题,各种操作 线段树中存储的信息有,覆盖标记,异或标记,0和1的从左到右连续长度,从右到左连续长度,区间最大连续长度 /* ID: sdj22251 PROG: subset LANG: C++ */ #include #include #include #include #include #include #include #include #inc

水 1040

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

Sequence operation  题目链接:HDU - 3397  题意: HDU - 3911 的升级版; 给出一个01串,5种操作: 0 L R:区间[L ,R]全置为0; 1 L R:区间[L, R]全置为1; 2 L R :区间[L, R]中0变1,1变0; 3 L R:求区间[L, R]中1的总个数; 4 L R:求区间[L, R]中连续1的最长长度; 可以先看H...

Sirius_han的博客 394

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

题目来源:Sequence operation 题意 给你一个长度为n的01串,现在有m次操作 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的长度 思路 用线段树维护区间从左、右开始数0和1的最大长...

jesHrz的博客 229

hdu 3397 Sequence operation 线段树 区间更新 区间合并

题意: 5种操作,所有数字都为0或1 0 a b:将[a,b]置0 1 a b:将[a,b]置1 2 a b:[a,b]中的0和1互换 3 a b:查询[a,b]中的1的数量 4 a b:查询[a,b]中的最长连续1串的长度 这题看题目就很裸,综合了区间更新,区间合并 我一开始把更新操作全放一个变量,但是在push_down的时候很麻烦,情况很多,容易漏,后来改成下面的 更新的操...

weixin_33708432的博客 71
上一篇: hdu 4578 Transformation(线段树区间更新)
下一篇: Codeforces Round #318(ABCD)
HelloWorld10086
博客等级 码龄12年 88粉丝 614原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值