lazy-tag线段树。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 800000 + 10; struct Segtree {
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1) int l[maxn],r[maxn];
int l1[maxn],r1[maxn],con1[maxn],cnt1[maxn];
int l0[maxn],r0[maxn],con0[maxn];
int t1[maxn],t0[maxn],tr[maxn]; void set1(int x) {
l1[x]=r1[x]=con1[x]=cnt1[x]=r[x]-l[x]+1;
l0[x]=r0[x]=con0[x]=0;
t1[x]=1; t0[x]=tr[x]=0;
} void set0(int x) {
l0[x]=r0[x]=con0[x]=r[x]-l[x]+1;
l1[x]=r1[x]=con1[x]=cnt1[x]=0;
t0[x]=1; t1[x]=tr[x]=0;
} void inv(int x) {
swap(l1[x],l0[x]);
swap(r1[x],r0[x]);
swap(con1[x],con0[x]);
cnt1[x]=r[x]-l[x]+1-cnt1[x];
tr[x]^=1;
} void push(int x) {
if(t0[x]) {
set0(lc(x));
set0(rc(x));
t0[x]=0;
}
if(t1[x]) {
set1(lc(x));
set1(rc(x));
t1[x]=0;
}
if(tr[x]) {
inv(lc(x));
inv(rc(x));
tr[x]=0;
}
} void update(int x) {
l1[x]=(l1[lc(x)]==r[lc(x)]-l[lc(x)]+1?l1[lc(x)]+l1[rc(x)]:l1[lc(x)]);
r1[x]=(r1[rc(x)]==r[rc(x)]-l[rc(x)]+1?r1[rc(x)]+r1[lc(x)]:r1[rc(x)]);
l0[x]=(l0[lc(x)]==r[lc(x)]-l[lc(x)]+1?l0[lc(x)]+l0[rc(x)]:l0[lc(x)]);
r0[x]=(r0[rc(x)]==r[rc(x)]-l[rc(x)]+1?r0[rc(x)]+r0[lc(x)]:r0[rc(x)]);
con1[x]=max(max(con1[lc(x)],con1[rc(x)]),r1[lc(x)]+l1[rc(x)]);
con0[x]=max(max(con0[lc(x)],con0[rc(x)]),r0[lc(x)]+l0[rc(x)]);
cnt1[x]=cnt1[lc(x)]+cnt1[rc(x)];
} void op0(int x,int L,int R) {
push(x);
if(R<l[x] || L>r[x]) return;
if(L<=l[x] && r[x]<=R) {
set0(x);
return;
}
op0(lc(x),L,R);
op0(rc(x),L,R);
update(x);
} void op1(int x,int L,int R) {
push(x);
if(R<l[x] || L>r[x]) return;
if(L<=l[x] && r[x]<=R) {
set1(x);
return;
}
op1(lc(x),L,R);
op1(rc(x),L,R);
update(x);
} void op2(int x,int L,int R) {
push(x);
if(R<l[x] || L>r[x]) return;
if(L<=l[x] && r[x]<=R) {
inv(x);
return;
}
op2(lc(x),L,R);
op2(rc(x),L,R);
update(x);
} int op3(int x,int L,int R) {
push(x);
if(R<l[x] || L>r[x]) return 0;
if(L<=l[x] && r[x]<=R) return cnt1[x];
return(op3(lc(x),L,R)+op3(rc(x),L,R));
} int op4(int x,int L,int R) {
push(x);
if(R<l[x] || L>r[x]) return 0;
if(L<=l[x] && r[x]<=R) return con1[x];
return max(max(op4(lc(x),L,R),op4(rc(x),L,R)),min(r1[lc(x)],r[lc(x)]-L+1)+min(l1[rc(x)],R-l[rc(x)]+1));
} void build(int x,int L,int R) {
l[x]=L; r[x]=R;
if(L==R) {
int k;
scanf("%d",&k);
if(k) l1[x]=r1[x]=con1[x]=cnt1[x]=1;
else l0[x]=r0[x]=con0[x]=1;
return;
}
int mid=(L+R)>>1;
build(lc(x),L,mid);
build(rc(x),mid+1,R);
update(x);
}
}seg;
int n,m; int main() {
scanf("%d%d",&n,&m);
seg.build(1,0,n-1);
for(int i=1,op,a,b;i<=m;i++) {
scanf("%d%d%d",&op,&a,&b);
if(op==0) seg.op0(1,a,b);
else if(op==1) seg.op1(1,a,b);
else if(op==2) seg.op2(1,a,b);
else if(op==3) printf("%d\n",seg.op3(1,a,b));
else if(op==4) printf("%d\n",seg.op4(1,a,b));
}
return 0;
}

bzoj1858: [Scoi2010]序列操作的更多相关文章

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

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

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

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

  3. BZOJ1858[Scoi2010]序列操作 题解

    题目大意: 有一个01序列,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0:1 a b 把[a, b]区间内的所有数全变成1:2 a b 把[a,b]区间 ...

  4. [BZOJ1858] [SCOI2010] 序列操作 解题报告 (线段树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 Description lxhgww最近收到了一个01序列,序列里面包含了n个数, ...

  5. 【分块】bzoj1858 [Scoi2010]序列操作

    分块 Or 线段树 分块的登峰造极之题 每块维护8个值: 包括左端点在内的最长1段: 包括右端点在内的最长1段: 该块内的最长1段: 该块内1的个数: 包括左端点在内的最长0段://这四个是因为可能有 ...

  6. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  7. [待码][BZOJ1858]SCOI2010序列操作 jzyzoj1655

    待码的线段树.....太长了看上去不是很想写 [ 什么破理由啊摔,不要脸 ] 嗯先水几道再写

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 线段树...调了一个上午...(后面带 // 的都是改出来的) lazy 标记的下放好 ...

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

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

随机推荐

  1. 大型网站用什么技术比较好,JSP,PHP,ASP.NET

    大型网站,我建议要考虑的问题: 首先讨论一下大型网站需要注意和考虑的问题. 数据库海量数据处理:负载量不大的情况下select.delete和update是响应很迅速的,最多加几个索引就可以搞定,但千 ...

  2. Linux进程间通信IPC学习笔记

    linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...

  3. 在win7上建立本地FTP站点详细步骤

    一.安装FTP组件点击:控制面板—>程序和功能—>打开或关闭Windows功能. 勾选“FTP服务器”及“FTP服务”“FTP扩展性”,点击“确定”,安装FTP组件. 勾选Web管理工具的 ...

  4. PL/SQL中如何执行DDL、SCL?

    PL/SQL程序中不能直接执行DDL语句.为什么? 假设我们在pl/sql程序中有这样的一条DDL语句—— drop table emp:在第一次解析pl/sql中的“drop table emp;” ...

  5. DataGrid中取HyperLinkColumn列的值,处理DataGrid中绑定的特殊字符

    DataGrid中取HyperLinkColumn列的值. /// <summary> /// 对datagrid中标签进行编码,处理特殊字符 /// </summary> / ...

  6. Java注解处理器(转)

    Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现的.一直想详细了解一下其中的原理.很有幸阅读到一篇详细解释编写注解处理器的文章.本文的 ...

  7. [转]SqlServer数据库同步方案详解

    SqlServer数据库同步是项目中常用到的环节,若一个项目中的数据同时存在于不同的数据库服务器中,而这些数据库需要被多个不同的网域调用时,配置 SqlServer数据库同步是个比较好的解决方案.Sq ...

  8. XCODE7新变化之-test

    Xcode 7新鲜出炉,一大早下载下来就安装上了,急急地体验一把.这几天公司给的任务是单元测试,那我们一起来用新版本做一次测试吧. 除了官方发布的下载链接地址,分享本人的xcode 7下载地址,大家不 ...

  9. PAT-乙级-1016. 部分A+B (15)

    1016. 部分A+B (15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 正整数A的“DA(为1位整数)部 ...

  10. FireFly 服务端 Unity3D黑暗世界 客户端 问题

    启动服务端成功截图: 连接成功截图: 测试服务端是否启动成功: 在Web输入:http://localhost:11009/  按回车 (查看cmd启动的服务端 是否多出如下显示) 服务端启动成功.P ...