解题:SCOI 2010 序列操作
线段树......模板题(雾?
然而两种标记会互相影响,必须保证每次只放一个(不然就不知道怎么放了),具体的影响就是:
翻转标记会使得覆盖标记一起翻转,下放的时候就是各种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 序列操作的更多相关文章
- SCOI 2010 序列操作
题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b ...
- SCOI2010 序列操作
2421 序列操作 http://codevs.cn/problem/2421/ 2010年省队选拔赛四川 题目描述 Description lxhgww最近收到了一个01序列,序列里面包含了n个 ...
- 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Statu ...
- Python通用序列操作
1.序列概览 1.数据结构 序列.容器 Python中最基本的数据结构是序列,其有索引(从左到右第一个索引为0,从右到左第一个索引为-1). Python包含6中内建的序列: 列表 元组 字符串 Un ...
- 【BZOJ-2962】序列操作 线段树 + 区间卷积
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 678 Solved: 246[Submit][Status][Discuss] ...
- 【BZOJ-1858】序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1961 Solved: 991[Submit][Status ...
- bzoj 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...
- BZOJ 1858: [Scoi2010]序列操作( 线段树 )
略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...
- [bzoj]2962序列操作
[bzoj]2962序列操作 标签: 线段树 题目链接 题意 给你一串序列,要你维护三个操作: 1.区间加法 2.区间取相反数 3.区间内任意选k个数相乘的积 题解 第三个操作看起来一脸懵逼啊. 其实 ...
随机推荐
- 为什么HashMap桶(链表)的长度超过8会转换成红黑树?
百度了一下,感觉能说清楚的并不多,所以在此记录一下. 首先说一说转换为红黑树的必要性: 红黑树的插入.删除和遍历的最坏时间复杂度都是log(n), 因此,意外的情况或者恶意使用下导致hashCode( ...
- ssh软件及命令的使用
常用软件安装及使用目录 第1章 ssh常用用法小结 1.1 连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以 ...
- maven实战读书笔记(二)
一个Spring加载属性的工具类,指定目标位置之后可以用${}的方式加载配置文件 测试maven工程发送email的例子:运行成功的例子—github 常用的命令: mvn clean compile ...
- Linux 读书笔记 三 (第二章)
一.学习目标 1. 理解二进制在计算机中的重要地位 2. 掌握布尔运算在C语言中的应用 3. 理解有符号整数.无符号整数.浮点数的表示 4. 理解补码的重要性 5. 能避免C语言中溢出,数据类型转 ...
- youi软件测试计划
beta版本中,我们将重视软件开发中的测试. 我们的软件是需要测试的,不测试怎么知道好与不好呢?有的程序不测试甚至都不能运行-- 我们的目标呢:就是经过测试之后软件的质量得到有效的保证.不管什么情况都 ...
- 1001 A+B
代码链接 PDF链接 首先要说的是这道题的难点是如何把数字输出加入逗号,毕竟数据范围并没有超过Long.当然这个难点也不是问题,将数字转为字符串,C中就有这样的函数,然后再用 %3==0 这样来控制输 ...
- pygame学习笔记(1)——安装及矩形、圆型画图
pygame是一个设计用来开发游戏的python模块,其实说白了和time.os.sys都是一样的东东.今天开始正式学习pygame,下载地址:www.pygame.org.下载后安装完成即可,在py ...
- 面试问题总结二(技术能力-PHP)----Ⅱ
20.支付功能的实现? 答:在线支付一般来说有两种实现方式,一种是调用各个银行提供的接口,另一种是使用第三方集成好的支付功能,两种方式各有优劣.对于第三方支付来说会需要提交企业5证来验证,还会有部分手 ...
- p2 碰撞
P2可以实现物体碰撞模拟,同时在碰撞过程中派发一些事件实现碰撞检测,将碰撞信息及时反馈,以添加相应的特效. P2中,当两个刚体的最小包围盒AABB发生重叠,碰撞就开始了:然后刚体的形状发生重叠,同时P ...
- firewall和iptables
防火墙有这三种方式,firewalld.iptables.ebtables,现在的centOS7使用的是firewalld. 下面是一些总结: 查看当前firewalld的状态 firewall-cm ...