Luogu P2572 [SCOI2010]序列操作 线段树。。
咕咕了。。。于是借鉴了小粉兔的做法ORZ。。。
其实就是维护最大子段和的线段树,但上面又多了一些操作。。。。QWQ
维护8个信息:1/0的个数(sum),左/右边起1/0的最长长度(ls,rs),整段区间中1/0的连续最长长度(mx)。
于是对于各个操作,我们有了一些tag。。。
tg1[]是区间赋值标记,没有标记时为-1,有标记时为0或1;tg2[]是区间取反标记,没有标记时为 0,有标记时为1。
注意标记下传时要先传tg1[],再传tg2[],否则取反标记会被赋值标记覆盖
#include<cstdio>
#include<iostream>
#define R register int
#define ls (tr<<1)
#define rs (tr<<1|1)
const int N=;
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,q,a[N];
struct node{
int sum0,sum1,ls0,ls1,rs0,rs1,mx0,mx1;
node(int s0=,int s1=,int ls0=,int ls1=,int rs0=,int rs1=,int mx0=,int mx1=):
sum0(s0),sum1(s1),ls0(ls0),ls1(ls1),rs0(rs0),rs1(rs1),mx0(mx0),mx1(mx1) {}
};
inline node upd(node l,node r) {
return node(l.sum0+r.sum0,l.sum1+r.sum1,
l.sum1?l.ls0:l.sum0+r.ls0,l.sum0?l.ls1:l.sum1+r.ls1,
r.sum1?r.rs0:r.sum0+l.rs0,r.sum0?r.rs1:r.sum1+l.rs1,
max(max(l.mx0,r.mx0),l.rs0+r.ls0),
max(max(l.mx1,r.mx1),l.rs1+r.ls1));
} node t[N]; int len[N],tg1[N],tg2[N];
inline void push(int tr,int typ) {
node& tmp=t[tr];
if(typ==) tg2[tr]=,tg1[tr]=,tmp=node(,len[tr],,len[tr],,len[tr],,len[tr]);
else if(typ==) tg2[tr]=,tg1[tr]=,tmp=node(len[tr],,len[tr],,len[tr],,len[tr],);
else if(typ==) tg2[tr]^=,swap(tmp.sum0,tmp.sum1),swap(tmp.ls0,tmp.ls1),swap(tmp.rs0,tmp.rs1),swap(tmp.mx0,tmp.mx1);
}
inline void spread(int tr) {
if(~tg1[tr]) push(ls,tg1[tr]),push(rs,tg1[tr]);
if(tg2[tr]) push(ls,),push(rs,);
tg1[tr]=-,tg2[tr]=;
}
inline void build(int tr,int l,int r) {
len[tr]=r-l+,tg1[tr]=-;
if(l==r) {R tmp=g(); t[tr]=node(tmp,tmp^,tmp,tmp^,tmp,tmp^,tmp,tmp^); return ;} R md=l+r>>;
build(ls,l,md),build(rs,md+,r); t[tr]=upd(t[ls],t[rs]);
}
inline void change(int tr,int l,int r,int LL,int RR,int d) {
if(LL<=l&&r<=RR) {push(tr,d); return ;} spread(tr); R md=l+r>>;
if(LL<=md) change(ls,l,md,LL,RR,d); if(RR>md) change(rs,md+,r,LL,RR,d);
t[tr]=upd(t[ls],t[rs]);
}
inline node query(int tr,int l,int r,int LL,int RR) {
if(LL<=l&&r<=RR) return t[tr]; spread(tr); R md=l+r>>; register node ret=node();
if(LL<=md) ret=query(ls,l,md,LL,RR); if(RR>md) ret=upd(ret,query(rs,md+,r,LL,RR)); return ret;
}
signed main() {
n=g(),q=g(); build(,,n);
for(R i=;i<=q;++i) {
R op=g(),l=g()+,r=g()+;
if(op<) change(,,n,l,r,op);
else {register node tmp=query(,,n,l,r); printf("%d\n",op==?tmp.sum0:tmp.mx0);}
}
}
2019.04.27
Luogu P2572 [SCOI2010]序列操作 线段树。。的更多相关文章
- 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...
- 【题解】Luogu P2572 [SCOI2010]序列操作
原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...
- BZOJ 1858: [Scoi2010]序列操作( 线段树 )
略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...
- bzoj1858[Scoi2010]序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 3079 Solved: 1475[Submit][Statu ...
- 【bzoj1858】[Scoi2010]序列操作 线段树区间合并
题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b ...
- [SCOI2010]序列操作 线段树
---题面--- 题解: 在考场上打的这道题,出人意料的很快就打完了?! 直接用线段树,维护几个东西: 1,lazy标记 : 表示区间赋值 2,mark标记:表示区间翻转 3,l1:前缀最长连续的1的 ...
- bzoj1858 [Scoi2010]序列操作——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 线段树...调了一个上午...(后面带 // 的都是改出来的) lazy 标记的下放好 ...
- P2572 [SCOI2010]序列操作
对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...
- 【题解】P4247 [清华集训]序列操作(线段树修改DP)
[题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...
随机推荐
- spring框架 事务 注解配置方式
user=LF password=LF jdbcUrl=jdbc:oracle:thin:@localhost:1521:orcl driverClass=oracle.jdbc.driver.Ora ...
- SQL Server 2008 R2 Express 不能启动
今天,新安装了Sql Server 2008 R2 Express,准备部署相应系统,在完成了数据库还原,系统部署以后,从浏览器里输入系统网址,出现登录页面,登录时报错,无法连上数据库.在查找原因的过 ...
- Web服务器父与子 Apache和Tomcat区别(转)
From http://developer.51cto.com/art/201007/210894.htm 熟悉三国的朋友都知道曹操,曹操有二十五个儿子,其中最得曹操宠爱的是曹丕.曹植.曹彰三个,曹丕 ...
- Vue 与Angular、React框架的对比
首先,我们先了解什么是MVX框架模式? MVX框架模式:MVC+MVP+MVVM 1.MVC:Model(模型)+View(视图)+controller(控制器),主要是基于分层的目的,让彼此的职责分 ...
- C# -- 泛型(1)
简介: 先看看泛型的概念--“通过参数化类型来实现在同一份代码上操作多种数据类型.利用“参数化类型”将类型抽象化,从而实现灵活的复用”. 很多初学者在刚开始接触泛型的时候会比较难理解 “泛型” 在这里 ...
- linux 查看 PHP 的默认版本。
命令 env env:显示当前用户的环境变量: which php
- 【C#】MVC+EF+LINQ 综合小项目
第一,创建数据库 create table category(id int primary key,name nvarchar(20)) create table news(id int primar ...
- Task 回调
前正无生意,且记录Task回调之用法. using System; using System.Collections.Generic; using System.Diagnostics; using ...
- linux系统上安装mysql5.6(详细步骤)
为了学习mycat 尝试在虚拟机上装mysql(看了别人的博客比划着安装),但装了两次都没成功.因此总结了如下步骤 有需要的朋友可以试下(linux需要联网) mysql-5.6.26.tar.gz百 ...
- 十、Node.js-url模块
下面使用之前提到过的note交互模式(可以在cmd直接执行js代码)进行学习url模块 跳出note模式同样是Ctrl+C(两次) 学习url模块主要是要掌握url模块的方法: url.parse() ...