【题目描述】

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

4 a b 询问[a, b]区间内最多有多少个连续的1

对于每一种询问操作,lxhgww都需要给出回答,聪明的程序员们,你们能帮助他吗?

【输入】

输入数据第一行包括2个数,n和m,分别表示序列的长度和操作数目

第二行包括n个数,表示序列的初始状态

接下来m行,每行3个数,op, a, b,(0<=op<=4,0<=a<=b)

这题真心烦,尤其是对初学线段树的我来说。考试的时候不得不强行写了30分的程序(o(╯□╰)o)。调了一天了,到晚上才调出来,我果然是蒟蒻。

`此处我用的是姜神的思路,又省空间又省时间,真的好。 nod数组代表lazy,如果下面区间数字一致,

可代表 0or1时:update&pushdown 没什么难度。

2时:+一个如果区间不相等,再往下就是了

3时:查询左右即可。

4时:用一个last数组存储前一个区间的值,更新max即可。

#include<cstdio>
#include<cstring>
#include<iostream>
#define push_up if (nod[rt<<1]==nod[rt<<1|1]&&nod[rt]==-1) nod[rt]=nod[rt<<1]
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
int nod[800005],n,m,last,max1,ans,a;
void init()
{
freopen("operation.in","r",stdin);
freopen("operation.out","w",stdout);
}
void pushdown(int rt)
{
if (nod[rt]!=-1)
{
nod[rt<<1]=nod[rt<<1|1]=nod[rt];
nod[rt]=-1;
}
}
void change(int rt,int l,int r,int a,int b,int color)
{
if (a<=l&&b>=r)
{
nod[rt]=color;
return;
}
pushdown(rt);
int mid=(l+r)>>1;
if (a<=mid) change(lson,a,b,color);
if (b>mid) change(rson,a,b,color);
push_up;
}
void modity(int rt,int l,int r,int a,int b)
{
if (a<=l&&b>=r)
{
if (nod[rt]!=-1)
{
nod[rt]=1-nod[rt];
return;
}
}
pushdown(rt);
int mid=(l+r)>>1;
if (a<=mid) modity(lson,a,b);
if (b>mid) modity(rson,a,b);
push_up;
}
int count(int rt,int l,int r,int a,int b)
{
if (a<=l&&b>=r)
{
if (nod[rt]==1) return r-l+1;
else if (nod[rt]==0)return 0;
}
pushdown(rt);
int mid=(l+r)>>1;
int x1=0;
int x2=0;
if (a<=mid) x1=count(lson,a,b);
if (b>mid) x2=count(rson,a,b);
push_up;
return x1+x2;
}
void find(int rt,int l,int r,int a,int b)
{
if (a<=l&&b>=r)
{
if (nod[rt]!=-1)
{
if (nod[rt]==1&&last==1)
{
max1+=r-l+1;
ans=max(max1,ans);
}
else if (nod[rt]==1&&last==0)
{
max1=r-l+1;
ans=max(max1,ans);
}
else if (nod[rt]==0)
{
max1=0;
}
ans=max(max1,ans);
last=nod[rt];
return;
}
if (l==r) return;
}
pushdown(rt);
int mid=(l+r)>>1;
if (a<=mid) find(lson,a,b);
if (b>mid) find(rson,a,b);
push_up;
}
void work()
{
cin>>n>>m;
int x,y,z;
for (int i=0;i<n;i++)
{
scanf("%d",&a);
change(1,0,n-1,i,i,a);
}
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
if (x==0||x==1) change(1,0,n-1,y,z,x);
if (x==2) modity(1,0,n-1,y,z);
if (x==3) printf("%d\n",count(1,0,n-1,y,z));
if (x==4)
{
last=1;
max1=ans=0;
find(1,0,n-1,y,z);
printf("%d\n",ans);
}
}
}
int main()
{
init();
work();
return 0;
}

scoi2010&&bzoj1858序列操作的更多相关文章

  1. 【线段树】【P2572】【SCOI2010】序列操作

    Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 ...

  2. 【SCOI2010】序列操作

    各种繁琐的线段树标记操作...赤裸裸的码农题. 调了一个晚上,最后写篇题解. 题解亮点:代码短,~~跑得慢(连第一页都没挤进去)~~ 其实我跟你们说啊,代码短是好事~~(这里不是说压行好,我的代码不压 ...

  3. [bzoj1858]序列操作

    考虑建立一棵线段树,维护:1.左端点的连续1和:2.右端点的连续1和:3.最长1的连续子序列:4.1的个数:5.将0和1交换后上面的四项:6.懒标记具体实现中,需要注意细节,可以看代码(比较短) 1 ...

  4. bzoj1858[Scoi2010]序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 3079  Solved: 1475[Submit][Statu ...

  5. BZOJ1858 [Scoi2010]序列操作(线段树)

    题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using names ...

  6. 【BZOJ-1858】序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1961  Solved: 991[Submit][Status ...

  7. bzoj 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...

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

    略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...

  9. BZOJ_1858_[Scoi2010]序列操作_线段树

    BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...

随机推荐

  1. SQLite XXTea加密学习

    这几天优化数据库读写,移植了xxtea加密到最新的数据库sqlite 3.12.2里,一些好文章放在这里.移植后,数据库读写性能异常优秀! 这几天又发现,数据库还是发生了无法写入情况,数据库崩溃掉了. ...

  2. centos7 web服务器内核优化

    net.ipv4.tcp_syn_retries = 1net.ipv4.tcp_synack_retries = 1net.ipv4.tcp_keepalive_time = 600net.ipv4 ...

  3. GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台

    在当前很多的GPS平台当中,有很多是基于asp.NET+siverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的 ...

  4. Leetcode: Unique Substrings in Wraparound String

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...

  5. MFC工程资源相对路径

    Project->Properties->Configuration Properties->Debuging->Working Directory改为$(ProjectDir ...

  6. JSSDK用法//////////////////zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

    参照微信官方文档,调试成功之后总结如下: 步骤一:绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 备注:登录后可在“开发者中心”查看对应的接口权限. 步骤二: ...

  7. Docker镜像的管理和创建

    1. Docker镜像和Docker容器:      Docker镜像实际上是一系列的文件系统,通常的Linux系统一般是两层文件系统,bootfs和rootfs,bootfs就是bootloader ...

  8. MATLAB的GUI

    % 常使用的对象查看和设置函数 % .get.set函数 ) % 获得句柄值为0的对象的属性,即显示器对象属性 plot([:]); % 绘制一幅图 title('示例'); % 增加text对象 % ...

  9. 微信接口php

    官方提供的SDK只有一个文本消息功能,我们将所有消息的消息类型及事件响应都整理了进来,并且加入日志记录,代码如下: 更新日志: 2013-01-01 版本1.0,包含Token验证及基本消息接口的收发 ...

  10. python基础入门一(语法基础)

    作为自己正式接触并应用的第一门编程语言,在Alex和武sir两位大王的要求下,开始了写博客总结的日子.学习编程语言是很有趣的一件事情,但有2点请一定要谨记:1.做人靠自己,码代码也必须靠自己.能不能成 ...