BZOJ 1858: [Scoi2010]序列操作 线段树区间修改查询

Cadence元件库介绍 Cadence安装完之后,在安装目录下,会有默认自带的一些常用元件库。例如,我的Candece安装目录为: D:\Cadence\Cadence_SPB_17.2-2016 元件库所在目录为: D:\Cadence\Cadence_SPB_17.2-2016\tools\capture\library 各个元件库对应的内容如下: AMPLIFIER.OLB 共 182 个零件,存放模拟放大器 IC,如 CA3280,TL027C,EL4093 等。 ARITHMETIC.OLB 共 182 个零件,存放 阅读详情

时空隧道


其实这道题没有什么特殊的地方….就是一定不要用cin&cout会RE…
还有就是合并lazy的标记的时候一定要想清楚…(我把-1写成1查了半天…)


代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;
const int maxn=100000+5;
int n,m,pri[maxn];
struct Tree{
    int l,r,pre0,suf0,seq0,pre1,suf1,seq1,No1,len,lazy;
}tree[maxn*4];
inline void build(int l,int r,int tr){
    tree[tr].l=l,tree[tr].r=r;tree[tr].len=tree[tr].r-tree[tr].l+1;tree[tr].lazy=-1;
    if(l==r){
        if(pri[l]==0)
            tree[tr].pre0=1,tree[tr].suf0=1,tree[tr].seq0=1,tree[tr].pre1=tree[tr].suf1=tree[tr].seq1=0,tree[tr].No1=0;
        else
            tree[tr].pre1=1,tree[tr].suf1=1,tree[tr].seq1=1,tree[tr].pre0=tree[tr].suf0=tree[tr].seq0=0,tree[tr].No1=1;
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,tr<<1),build(mid+1,r,tr<<1|1);
    if(tree[tr<<1].pre0==tree[tr<<1].len)
        tree[tr].pre0=tree[tr<<1].len+tree[tr<<1|1].pre0;
    else
        tree[tr].pre0=tree[tr<<1].pre0;
    if(tree[tr<<1|1].suf0==tree[tr<<1|1].len)
        tree[tr].suf0=tree[tr<<1|1].len+tree[tr<<1].suf0;
    else
        tree[tr].suf0=tree[tr<<1|1].suf0;
    tree[tr].seq0=max(tree[tr<<1].seq0,tree[tr<<1|1].seq0);
    tree[tr].seq0=max(tree[tr].seq0,tree[tr<<1].suf0+tree[tr<<1|1].pre0);
    if(tree[tr<<1].pre1==tree[tr<<1].len)
        tree[tr].pre1=tree[tr<<1].len+tree[tr<<1|1].pre1;
    else
        tree[tr].pre1=tree[tr<<1].pre1;
    if(tree[tr<<1|1].suf1==tree[tr<<1|1].len)
        tree[tr].suf1=tree[tr<<1|1].len+tree[tr<<1].suf1;
    else
        tree[tr].suf1=tree[tr<<1|1].suf1;
    tree[tr].seq1=max(tree[tr<<1].seq1,tree[tr<<1|1].seq1);
    tree[tr].seq1=max(tree[tr].seq1,tree[tr<<1].suf1+tree[tr<<1|1].pre1);
    tree[tr].No1=tree[tr<<1].No1+tree[tr<<1|1].No1;
}
inline void change(int l,int r,int order,int tr){
//  cout<<l<<" "<<r<<" "<<tree[tr].l<<" "<<tree[tr].r<<" "<<tree[tr].lazy<<" "<<order<<endl;
    if(tree[tr].l==l&&tree[tr].r==r){
        if(order==0)
            tree[tr].pre0=tree[tr].suf0=tree[tr].seq0=tree[tr].len,
            tree[tr].pre1=tree[tr].suf1=tree[tr].seq1=tree[tr].No1=0;
        else if(order==1)
            tree[tr].pre0=tree[tr].suf0=tree[tr].seq0=0,
            tree[tr].pre1=tree[tr].suf1=tree[tr].seq1=tree[tr].No1=tree[tr].len;
        else if(order==2)
            swap(tree[tr].pre0,tree[tr].pre1),swap(tree[tr].suf0,tree[tr].suf1),swap(tree[tr].seq0,tree[tr].seq1),
            tree[tr].No1=tree[tr].len-tree[tr].No1;
        if(order!=2)    
            tree[tr].lazy=order;
        else if(tree[tr].lazy==-1)
            tree[tr].lazy=order;
        else if(tree[tr].lazy!=2)
            tree[tr].lazy^=1;
        else if(tree[tr].lazy==2)
            tree[tr].lazy=-1;
        return;
    }
    int mid=(tree[tr].l+tree[tr].r)>>1;
    if(tree[tr].lazy!=-1)
        change(tree[tr].l,mid,tree[tr].lazy,tr<<1),change(mid+1,tree[tr].r,tree[tr].lazy,tr<<1|1),tree[tr].lazy=-1;
    if(r<=mid)
        change(l,r,order,tr<<1);
    else if(l>mid)
        change(l,r,order,tr<<1|1);
    else
        change(l,mid,order,tr<<1),change(mid+1,r,order,tr<<1|1);
    if(tree[tr<<1].pre0==tree[tr<<1].len)
        tree[tr].pre0=tree[tr<<1].len+tree[tr<<1|1].pre0;
    else
        tree[tr].pre0=tree[tr<<1].pre0;
    if(tree[tr<<1|1].suf0==tree[tr<<1|1].len)
        tree[tr].suf0=tree[tr<<1|1].len+tree[tr<<1].suf0;
    else
        tree[tr].suf0=tree[tr<<1|1].suf0;
    tree[tr].seq0=max(tree[tr<<1].seq0,tree[tr<<1|1].seq0);
    tree[tr].seq0=max(tree[tr].seq0,tree[tr<<1].suf0+tree[tr<<1|1].pre0);
    if(tree[tr<<1].pre1==tree[tr<<1].len)
        tree[tr].pre1=tree[tr<<1].len+tree[tr<<1|1].pre1;
    else
        tree[tr].pre1=tree[tr<<1].pre1;
    if(tree[tr<<1|1].suf1==tree[tr<<1|1].len)
        tree[tr].suf1=tree[tr<<1|1].len+tree[tr<<1].suf1;
    else
        tree[tr].suf1=tree[tr<<1|1].suf1;
    tree[tr].seq1=max(tree[tr<<1].seq1,tree[tr<<1|1].seq1);
    tree[tr].seq1=max(tree[tr].seq1,tree[tr<<1].suf1+tree[tr<<1|1].pre1);
    tree[tr].No1=tree[tr<<1].No1+tree[tr<<1|1].No1;
}
inline int query(int l,int r,int order,int tr){
    if(tree[tr].l==l&&tree[tr].r==r){
        if(order==3)
            return tree[tr].No1;
        else if(order==4)
            return tree[tr].seq1;
        else if(order==5)
            return tree[tr].pre1;
        else
            return tree[tr].suf1;
    }
    int mid=(tree[tr].l+tree[tr].r)>>1;
    if(tree[tr].lazy!=-1)
        change(tree[tr].l,mid,tree[tr].lazy,tr<<1),change(mid+1,tree[tr].r,tree[tr].lazy,tr<<1|1),tree[tr].lazy=-1;
    if(r<=mid)
        return query(l,r,order,tr<<1);
    else if(l>mid)
        return query(l,r,order,tr<<1|1);
    else{
        if(order==3)
            return query(l,mid,order,tr<<1)+query(mid+1,r,order,tr<<1|1);
        else if(order==4){
            int lala=max(query(l,mid,order,tr<<1),query(mid+1,r,order,tr<<1|1));
            lala=max(lala,query(l,mid,6,tr<<1)+query(mid+1,r,5,tr<<1|1));
            return lala;
        }
        else if(order==5){
            int lala=query(l,mid,order,tr<<1);
            if(lala==mid-l+1)
                lala+=query(mid+1,r,order,tr<<1|1);
            return lala;
        }
        else{
            int lala=query(mid+1,r,order,tr<<1|1);
            if(lala==r-mid)
                lala+=query(l,mid,order,tr<<1);
            return lala;
        }
    }
}
signed main(void){
//  freopen("in.txt","r",stdin);
//  freopen("out1.txt","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&pri[i]);
    build(1,n,1);int s,x,y;
    while(m--){
        scanf("%d%d%d",&s,&x,&y);x++,y++;
        if(s>=0&&s<=2)
            change(x,y,s,1);//,cout<<"lala"<<query(1,6,3,1)<<" lalala"<<query(1,6,4,1)<<endl;
        else
            printf("%d\n",query(x,y,s,1));
    }
    return 0;
}

by >_< NeighThorn

DeepSeek+知网研学:三步搞定文献矩阵与对比分析(实战指南) 本文提供了一套高效实用的文献管理分析实战指南,详细介绍了如何结合DeepSeek大模型与知网研学平台,通过三个核心步骤快速完成文献梳理。该方法能自动提炼文献核心要素、生成结构化对比矩阵,并辅助发现研究空白,显著提升学术研究者的文献分析效率与深度。 阅读详情

相关推荐

Netapp FAS2750更换磁盘后不同步问题处理

netapp fas2750磁盘更换后不同步问题处理

jetliu05的博客 1256

【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

Description 有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。 Input 第一行N,M 接下来M行,每行形如1 a b c或2 a b c Output 输出每个询问的结果 S...

Gregory99174的博客 189

【物理模拟】PBD算法详解

参考MatthiaMuller的十分钟物理(他就是PBD算法的发明者)

beidou111的博客 9498

(WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作

二次联通门 :BZOJ 1858: [Scoi2010]序列操作 /*   BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊... */ #include <cstdio> void read (int &no...

weixin_30257433的博客 119

SAP IDOC与EDI实战解析:从基础原理到跨系统采购订单同步

本文深入解析了SAP IDOC与EDI在企业数据交换中的核心作用,通过跨系统采购订单同步的实战案例,详细阐述了从基础原理到配置部署的全过程。文章将IDOC比作标准化数据“集装箱”,EDI视为高效传输“高速公路”,并提供了从消息类型定义、处理代码开发到全链路测试的完整指南,帮助企业实现自动化、无差错的业务协同。

weixin_28335283的博客 294

保姆级教程:用GATK4分析重测序数据,从fq.gz到vcf文件一步不落

本文提供了一份详细的GATK4重测序数据分析教程,涵盖从原始fq.gz文件到最终vcf文件的完整上游分析流程。通过Miniconda环境配置、数据质控、序列比对、变异检测等步骤的逐步指导,帮助生物信息学研究人员掌握标准流程,特别适合Linux命令行基础薄弱的研究者学习实践。

weixin_28366053的博客 472

bzoj1858【scoi2010】序列操作

很麻烦的线段树模板

AaronPolaris 1295

BODAS说明书的中文版与相关资料总结

花了三天时间配了控制器的接线口,找了软件安装的一套东西。 又花了一周时间零零散散在网上只找到关于控制器少得可怜的资料: 1.力士乐控制器RC6系列介绍 2.力士乐控制器手册不完整版 3.RC6-9程序下载 力士乐配套的只有德语和英语两版,人工翻译专业文件的价格太惊人,决定自己写一版方便大家。有不正之处欢迎指出。 For these controllers, in the event of an...

我的技术日常 6492

BZOJ 1858 SCOI2010 序列操作 线段树

题目大意:给定一个01序列,提供三种操作: 0:把一段区间的所有元素都变成0 1:把一段区间的所有元素都变成1 2:把一段区间内的所有元素全都取反 3:查询一段区间内1的个数 4:查询一段区间内最长的一段连续的1 首先如果没有操作4这就是bitset的水题。。。多了这个,我们考虑线段树 线段树的每一个节点存修改标记和翻转标记,以及该区间的信息 虽然查询的信息都是1 但是我们要连0一

世界 1896

杰理JL701N内置flash录音配置教程

本文详细介绍了内置Flash录音功能的配置方法。主要内容包括:1) 基础模式配置(开启音乐/录音模式、Flash录音宏定义);2) 录音参数设置(格式基准值、存储区域定义、容量配置);3) MP3编码特殊处理;4) 下载时的Flash格式化操作;5) 录音开关和播放接口的使用说明。配置过程涉及多个关键文件的修改,并强调存储容量的精确分配。

qq_42014563的博客 597

密码学系列3-Elgamal加密及其IND-CPA安全性证明

但这没有任何影响,敌手本身就只能知道公钥,他并没有能力知道挑战者是否知道对应的私钥。所以上述整个游戏就是一个模拟实验,敌手无法区分挑战者运行的是这个模拟实验,还是真正的按照第一节的算法构造的实验(挑战者知道私钥…为什么合起来的时候有1/2:因为T既可能是随机的也可能是g^{ab},这两种情况概率为1/2。能够攻破Elgamal加密方案,那么挑战者利用敌手的能力构建下面游戏,来求解困难性问题DDH。就是挑战者选的随机数,虽然挑战者自己也不知道。),否则挑战者输出0,作为DDH的回答。

qq_41359358的博客 1249

[BZOJ1858]SCOI2010序列操作|线段树

一看以为是线段树水题,写起来发现好像询问4比较麻烦,调了好久。。 对每个线段树节点维护sum为区间内1的个数,ml0、mr0表示左右的最长连续0长度,ml1,mr1同理,m0、m1为区间内连续0/1的最大长度,合并信息的时候用ml0、mr0、ml1,mr1来更新m0、m1,就和维护数列那题一样。。这里要注意合并时维护ml1,mr1、ml0、mr0的时候要考虑能不能延长到另半个区间去,就像下图一样

Tag_king的专栏 1288

Rockchip eMMC寿命监控:SMART信息读取与预防性维护

擦写计数坏块数量温度使用时间。

小灰灰的博客 760

BZOJ 1858 SCOI 2010 序列操作

题目大意:维护一种01数据结构,它可以: 1.把一段区间变成0。 2.把一段区间变成1。 3.把一段区间取反。 4.查询一段区间内1的个数。 5.查询一段区间内连续的1的个数。 思路:一眼看去Splay和线段树都可以,看起来好像Splay维护起来好弄一点,就没怎么想写了Splay。写完之后才发现Splay维护的时候边界值根本没法弄(可能是我写的麻烦),就又重写线段树。啊啊啊啊现

(╯°口°)╯(┴—┴ 1284

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

BZOJ 1858 [Scoi2010]序列操作 线段树

Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是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

I'm Growing 353

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

BZOJ1858 [Scoi2010]序列操作

傻逼题…… 维护0和1的左最长右最长和最长还有和,打覆盖标和翻转标即可 #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define MAXN 10

neither_nor 513

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

BZOJ 1858: [Scoi2010]序列操作 线段树

Time Limit: 10 Sec Memory Limit: 64 MB Submit: 2944 Solved: 1424Descriptionlxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[a

Monica 477

[BZOJ1858] [Scoi2010]序列操作

传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1858题目大意给定一个01序列每次操作 0:[L,R]都变0 1:[L,R]都变1 2:[L,R]0变1,1变0 3:查询[L,R]区间内1个数 4:查询[L,R]区间内最长连续1个数题解明显线段树 维护 1.区间和 2.左端点开始连续0个数 3.右端点开始连续0个数 4.最长

slongle的专栏 635

[BZOJ1858/Luogu2572][SCOI2010]序列操作

题目链接: BZOJ1858 Luogu2572 为什么我的代码这么长啊。。 这一看就是个线段树裸题,难点在于第\(4\)个操作。 我们需要在线段树上维护\(6\)个值: Lm0/1:紧靠左的最长一段\(0/1\)的长度 Rm0/1:紧靠右的最长一段\(0/1\)的长度 Tm0/1:整段中的最长一段\(0/1\)的长度 最后注意修改和翻转操作的优先级:修改的优先级最高(显然)。 然后De...

weixin_30512043的博客 95

【BZOJ 1858】 [Scoi2010]序列操作

线段树代码题~

Regina8023 1213

bzoj 1858: [Scoi2010] 序列操作 题解

【原题】 1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1031  Solved: 529 [Submit][Status] Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a

阿蒋的专栏 1639

【BZOJ】【P1858】【Scoi2010】【序列操作】【题解】【线段树】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1858 锻炼代码能力的线段树裸题 Code: #include #include #include #include #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define L i<<1 #define R i<<1|1 u

退役狗的专栏 1812

BZOJ1858: [Scoi2010]序列操作(洛谷P2572)

线段树 BZOJ题目传送门 洛谷题目传送门 就是这道题的两种颜色版+普通线段树。 对于每个区间维护一些东西: sm[0/1]sm[0/1]sm[0/1]表示这个区间0/10/10/1的数量,mx[0/1]mx[0/1]mx[0/1]表示这个区间连续的0/10/10/1的最长长度,lx[0/1]lx[0/1]lx[0/1]表示以这个区间左端点为起始的连续0/10/10/1的长度,rx[0/...

forezxl的博客 341

BZOJ1858: [Scoi2010]序列操作

【传送门:BZOJ1858】 简要题意:   给出一个长度为n的01序列,有五种操作,m个操作:   0 x y将第x个数到第y个数都变成0   1 x y将第x个数到第y个数都变成1   2 x y将第x个数到第y个数的所有数取反(即0变为1,1变为0)   3 x y求出第x个数到第y个数有多少个1   4 x y求出第x个数到第y个数最多有多少个连续的1 题解:  ...

weixin_30693183的博客 116

[BZOJ 1858][Scoi2010]序列操作(线段树)

Descriptionlxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是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

Zaaaaars19 490
上一篇: HDU 1255 覆盖的面积 线段树+扫描线+离散化
下一篇: POJ 2132 Cow Math DP
NeighThorn
博客等级 码龄11年 20粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值