bzoj1858: [Scoi2010]序列操作
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]序列操作的更多相关文章
- bzoj1858[Scoi2010]序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 3079 Solved: 1475[Submit][Statu ...
- BZOJ1858 [Scoi2010]序列操作(线段树)
题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using names ...
- BZOJ1858[Scoi2010]序列操作 题解
题目大意: 有一个01序列,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0:1 a b 把[a, b]区间内的所有数全变成1:2 a b 把[a,b]区间 ...
- [BZOJ1858] [SCOI2010] 序列操作 解题报告 (线段树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 Description lxhgww最近收到了一个01序列,序列里面包含了n个数, ...
- 【分块】bzoj1858 [Scoi2010]序列操作
分块 Or 线段树 分块的登峰造极之题 每块维护8个值: 包括左端点在内的最长1段: 包括右端点在内的最长1段: 该块内的最长1段: 该块内1的个数: 包括左端点在内的最长0段://这四个是因为可能有 ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- [待码][BZOJ1858]SCOI2010序列操作 jzyzoj1655
待码的线段树.....太长了看上去不是很想写 [ 什么破理由啊摔,不要脸 ] 嗯先水几道再写
- bzoj1858 [Scoi2010]序列操作——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 线段树...调了一个上午...(后面带 // 的都是改出来的) lazy 标记的下放好 ...
- 【BZOJ-1858】序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1961 Solved: 991[Submit][Status ...
随机推荐
- php function 定义时函数名前加&符号的意义
看了很多帖子,但是都不能理解,又去看了很多资料,终于名白了.记下备忘. 问题:php在声明函数时,函数名前面的&符号有什么用? 一直想不通.很多帖子说类似于变量的$a=&$b,但是$b ...
- php文件夹与文件目录操作函数
在php中一些常用的文件夹/文件目录操作函数总结. php文件夹操作函数 string basename ( string path [, string suffix] ) 给出一个包含有指向一个文件 ...
- ThinkPHP图片上传
ThinkPHP是国内比较流行的轻量级的PHP框架,它在国内流行的一个最主要的因素在于它的说明文档非常健全完善,以及它源码内的注释都是中文的,方便于英语能力较差的程序员学习. 图片上传在网站里是很常用 ...
- Canvas开发笔记(不断更新)
1.可以使用requestAnimationFrame函数代替setInterval.需要处理浏览器兼容问题: var w = window; requestAnimationFrame = w.re ...
- 1010. Radix (25)
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...
- 【IOS】利用ASIHTTPRequest 实现一个简单的登陆验证
http://blog.csdn.net/toss156/article/details/7638529
- WP8.1和Win8.1的不同之处
本文仅是个人见解,如有不足或错误之处欢迎批评指正~ 1.Toast: 创建Toast代码差不多但实现机制及管理上不一样 2.ApplicationData: WP8.1多了一个LocalCacheFo ...
- Java中的IO流系统详解
Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...
- mysql.zip免安装版配置
MYSQL ZIP免安装版配置 1. 下载MySQL 选择自己想要的.本次安装.我使用的是mysql-5.6.17-winx64 地址:http://dev.mysql.com/downloads/ ...
- [转载]再次谈谈easyui datagrid 的数据加载
这篇文章只谈jQuery easyui datagrid 的数据加载,因为这也是大家谈论最多的内容.其实easyui datagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数 ...