题面

线段树......模板题(雾?

然而两种标记会互相影响,必须保证每次只放一个(不然就不知道怎么放了),具体的影响就是:

翻转标记会使得覆盖标记一起翻转,下放的时候就是各种swap

覆盖标记会抹掉翻转标记,下放的时候好像挺正常的

然后就是码码码+细节

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
struct a{int ll,rr,vv;};
int val[*N],last[*N][],lst[*N][],rst[*N][];
int num[N],laz1[*N],laz2[*N];
int n,m,t1,t2,t3;
void pushup(int nde,int l,int r)
{
int mid=(l+r)/,ls=*nde,rs=*nde+;
val[nde]=val[ls]+val[rs];
//value
lst[nde][]=(last[ls][]==mid-l+)?last[ls][]+lst[rs][]:lst[ls][];
rst[nde][]=(last[rs][]==r-mid)?last[rs][]+rst[ls][]:rst[rs][];
last[nde][]=max(rst[ls][]+lst[rs][],max(last[ls][],last[rs][]));
//longest continuing one
lst[nde][]=(last[ls][]==mid-l+)?last[ls][]+lst[rs][]:lst[ls][];
rst[nde][]=(last[rs][]==r-mid)?last[rs][]+rst[ls][]:rst[rs][];
last[nde][]=max(rst[ls][]+lst[rs][],max(last[ls][],last[rs][]));
//longest continuing zero
}
void create(int nde,int l,int r)
{
if(l==r)
{
last[nde][]=lst[nde][]=rst[nde][]=(num[l]^);
val[nde]=last[nde][]=lst[nde][]=rst[nde][]=num[l];
}
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+;
create(ls,l,mid),create(rs,mid+,r);
pushup(nde,l,r);
}
}
void release(int nde,int l,int r)
{
int mid=(l+r)/,ls=*nde,rs=*nde+;
if(laz2[nde])
{
if(~laz1[ls]) laz1[ls]^=; else laz2[ls]^=;
if(~laz1[rs]) laz1[rs]^=; else laz2[rs]^=;
val[ls]=(mid-l+)-val[ls],val[rs]=(r-mid)-val[rs];
//reversing
swap(last[ls][],last[ls][]),swap(last[rs][],last[rs][]);
swap(lst[ls][],lst[ls][]),swap(lst[rs][],lst[rs][]);
swap(rst[ls][],rst[ls][]),swap(rst[rs][],rst[rs][]);
//a lot of swaps......
laz2[nde]=;
//refresh
}
//release the lazy tag of intervals reversing
else if(~laz1[nde])
{
laz1[ls]=laz1[nde],laz1[rs]=laz1[nde],laz2[ls]=,laz2[rs]=;
//to the left/right son
val[ls]=last[ls][]=lst[ls][]=rst[ls][]=(mid-l+)*laz1[nde];
val[rs]=last[rs][]=lst[rs][]=rst[rs][]=(r-mid)*laz1[nde];
//longest continuing one
last[ls][]=lst[ls][]=rst[ls][]=(mid-l+)*(laz1[nde]^);
last[rs][]=lst[rs][]=rst[rs][]=(r-mid)*(laz1[nde]^);
//longest continuing zero
laz1[nde]=-;
//refresh
}
//release the lazy tag of intervals covering
}
void Change(int nde,int l,int r,int nl,int nr,int task)
{
if(l>nr||r<nl)
return ;
else if(l>=nl&&r<=nr)
{
last[nde][]=lst[nde][]=rst[nde][]=(task^)*(r-l+);
val[nde]=last[nde][]=lst[nde][]=rst[nde][]=task*(r-l+);
laz1[nde]=task,laz2[nde]=;
}
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+; release(nde,l,r);
Change(ls,l,mid,nl,nr,task),Change(rs,mid+,r,nl,nr,task);
pushup(nde,l,r);
}
}
void Reverse(int nde,int l,int r,int nl,int nr)
{
if(l>nr||r<nl)
return ;
else if(l>=nl&&r<=nr)
{
val[nde]=(r-l+)-val[nde],swap(last[nde][],last[nde][]);
swap(lst[nde][],lst[nde][]),swap(rst[nde][],rst[nde][]);
if(~laz1[nde]) laz1[nde]^=; else laz2[nde]^=;
}
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+; release(nde,l,r);
Reverse(ls,l,mid,nl,nr),Reverse(rs,mid+,r,nl,nr); pushup(nde,l,r);
}
}
int Vquery(int nde,int l,int r,int nl,int nr)
{
if(l>nr||r<nl)
return ;
else if(l>=nl&&r<=nr)
return val[nde];
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+; release(nde,l,r);
return Vquery(ls,l,mid,nl,nr)+Vquery(rs,mid+,r,nl,nr);
}
}
a Lquery(int nde,int l,int r,int nl,int nr)
{
if(l>=nl&&r<=nr)
return (a){lst[nde][],rst[nde][],last[nde][]};
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+; release(nde,l,r);
if(nr<=mid) return Lquery(ls,l,mid,nl,nr);
if(nl>mid) return Lquery(rs,mid+,r,nl,nr);
a Q1=Lquery(ls,l,mid,nl,nr),Q2=Lquery(rs,mid+,r,nl,nr),ret;
ret.vv=max(max(Q1.vv,Q2.vv),Q1.rr+Q2.ll);
ret.ll=(Q1.vv==(mid-l+))?Q1.vv+Q2.ll:Q1.ll;
ret.rr=(Q2.vv==(r-mid))?Q2.vv+Q1.rr:Q2.rr;
return ret;
}
}
int main ()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&num[i]);
create(,,n);
memset(laz1,-,sizeof laz1);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&t1,&t2,&t3),t2++,t3++;
if(!t1) Change(,,n,t2,t3,);
else if(t1==) Change(,,n,t2,t3,);
else if(t1==) Reverse(,,n,t2,t3);
else if(t1==) printf("%d\n",Vquery(,,n,t2,t3));
else printf("%d\n",Lquery(,,n,t2,t3).vv);
}
return ;
}

解题:SCOI 2010 序列操作的更多相关文章

  1. SCOI 2010 序列操作

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

  2. SCOI2010 序列操作

    2421 序列操作 http://codevs.cn/problem/2421/ 2010年省队选拔赛四川   题目描述 Description lxhgww最近收到了一个01序列,序列里面包含了n个 ...

  3. 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Statu ...

  4. Python通用序列操作

    1.序列概览 1.数据结构 序列.容器 Python中最基本的数据结构是序列,其有索引(从左到右第一个索引为0,从右到左第一个索引为-1). Python包含6中内建的序列: 列表 元组 字符串 Un ...

  5. 【BZOJ-2962】序列操作 线段树 + 区间卷积

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 678  Solved: 246[Submit][Status][Discuss] ...

  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]2962序列操作

    [bzoj]2962序列操作 标签: 线段树 题目链接 题意 给你一串序列,要你维护三个操作: 1.区间加法 2.区间取相反数 3.区间内任意选k个数相乘的积 题解 第三个操作看起来一脸懵逼啊. 其实 ...

随机推荐

  1. dvwa学习笔记之xss

    反射型Low 直接输入<script>alert(/xss/)</script>就可以发现弹窗Medium 检查源码 可以看到网站对输入字符进行了过滤,尝试双写绕过,构造< ...

  2. docker pull下来的镜像放哪儿了?

    本机docker版本 docker –version Docker version 1.进入docker 目录 root@Rightsec:~# cd /var/lib/docker root@Rig ...

  3. JDK自带的监控工具方法

    一.概述       SUN 的JDK中的几个工具,非常好用.秉承着有免费,不用商用的原则.以下简单介绍一下这几种工具.(注:本文章下的所有工具都存在JDK5.0以上版本的工具集里(jdk的bin目录 ...

  4. centos下设置自启动和配置环境变量的方法

    1. 设置自启动 在CentOS系统下,主要有两种方法设置自己安装的程序开机启动.1.把启动程序的命令添加到/etc/rc.d/rc.local文件中,比如下面的是设置开机启动httpd. #!/bi ...

  5. 将本地开发完的SDK代码上传到SVN上面:an error occurred while contacting the repository The server may be unreachable or the URL may be incorrect

    将本地开发完的SDK代码上传到SVN上面:an error occurred while contacting the repository  The server may be unreachabl ...

  6. sprint2(第三天)

    展板 燃尽图

  7. TeamWork#3,Week5,Scrum Meeting 11.13

    最近我们根据之前发现的问题, 补充了相关知识,正在努力修复出现的问题,调整程序结构. 成员 已完成 待完成 彭林江 之前没有考虑到网站信息更新导致的程序可变性,正在调整爬虫程序结构 更换爬虫结构 郝倩 ...

  8. Daily Scrumming 2015.10.20(Day 1)

    一.今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 购买服务器,搭建服务器,配置服务器端用户与权限管理 配置ruby与rails环境 配置mysql与数据 ...

  9. Shiro异常1:java.lang.IllegalArgumentException: Line argument must contain a key and a value. Only one

    按照开涛shiro的事例 ,老是出这个异常 原因在于ini文件格式错误,为什么我也不知道 我是这样改的:找到其他可以的(换行的时候能右移两下的)在换行处复制粘贴得到那个格式,新建一个ini文件,把刚刚 ...

  10. <mvc:annotation-driven/>的作用

    <mvc:annotation-driven>的作用是: 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapt ...