序列操作(bzoj 1858)
Description
Input
Output
Sample Input
0 0 0 1 1 0 1 0 1 1
1 0 2
3 0 5
2 2 2
4 0 4
0 3 6
2 3 7
4 2 8
1 0 5
0 5 6
3 3 9
Sample Output
2
6
5
HINT
对于30%的数据,1<=n, m<=1000
对于100%的数据,1<=n, m<=100000
/*
不想写线段树,写的分块。
维护一下每个块的左最大连续区间,右最大连续区间,最大连续区间,和几个标记(无/全0/全1/取反)。
*/
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#define N 100010
#define M 510
using namespace std;
int a[N],bl[N],n,m,size;
int tag[M],lc0[M],rc0[M],sc0[M],lc1[M],rc1[M],sc1[M],sum[M]; void init(int i){
tag[i]=-;lc0[i]=rc0[i]=sc0[i]=lc1[i]=rc1[i]=sc1[i]=sum[i]=;
for(int j=(i-)*size+;j<=min(n,i*size);j++)
if(a[j]) sum[i]++;
int fl=,p=;
for(int j=(i-)*size+;j<=min(n,i*size);j++){
if(!a[j]&&!fl) lc0[i]++;
else fl=;
if(!a[j]) p++;else p=;
sc0[i]=max(sc0[i],p);
}
fl=;
for(int j=min(n,i*size);j>(i-)*size;j--){
if(!a[j]&&!fl) rc0[i]++;
else fl=;
}
fl=,p=;
for(int j=(i-)*size+;j<=min(n,i*size);j++){
if(a[j]&&!fl) lc1[i]++;
else fl=;
if(a[j]) p++;else p=;
sc1[i]=max(sc1[i],p);
}
fl=;
for(int j=min(n,i*size);j>(i-)*size;j--){
if(a[j]&&!fl) rc1[i]++;
else fl=;
}
} void pushdown(int i){
if(tag[i]==-) return;
if(tag[i]==||tag[i]==)
for(int j=(i-)*size+;j<=i*size;j++)
a[j]=tag[i];
else
for(int j=(i-)*size+;j<=i*size;j++)
a[j]^=;
tag[i]=-;
} void change1(int x,int y,int v){
pushdown(bl[x]);
for(int i=x;i<=min(y,bl[x]*size);i++) a[i]=v;
init(bl[x]);
for(int i=bl[x]+;i<bl[y];i++){
tag[i]=v;
if(v) lc1[i]=rc1[i]=sc1[i]=sum[i]=size,lc0[i]=rc0[i]=sc0[i]=;
else lc1[i]=rc1[i]=sc1[i]=sum[i]=,lc0[i]=rc0[i]=sc0[i]=size;
}
if(bl[x]==bl[y]) return;
pushdown(bl[y]);
for(int i=(bl[y]-)*size+;i<=y;i++) a[i]=v;
init(bl[y]);
} void change2(int x,int y){
pushdown(bl[x]);
for(int i=x;i<=min(y,bl[x]*size);i++) a[i]^=;
init(bl[x]);
for(int i=bl[x]+;i<bl[y];i++){
if(tag[i]==-) tag[i]=;
else if(tag[i]==) tag[i]=;
else if(tag[i]==) tag[i]=;
else tag[i]=-;
swap(lc0[i],lc1[i]);swap(rc0[i],rc1[i]);
swap(sc0[i],sc1[i]);sum[i]=size-sum[i];
}
if(bl[x]==bl[y]) return;
pushdown(bl[y]);
for(int i=(bl[y]-)*size+;i<=y;i++) a[i]^=;
init(bl[y]);
} int query1(int x,int y){
int ans=;
pushdown(bl[x]);
for(int i=x;i<=min(y,bl[x]*size);i++)
if(a[i]) ans++;
for(int i=bl[x]+;i<bl[y];i++) ans+=sum[i];
if(bl[x]==bl[y]) return ans;
pushdown(bl[y]);
for(int i=(bl[y]-)*size+;i<=y;i++)
if(a[i]) ans++;
return ans;
} int query2(int x,int y){
int ans=,l=;
pushdown(bl[x]);
for(int i=x;i<=min(y,bl[x]*size);i++){
if(a[i]) l++;else l=;
ans=max(ans,l);
}
for(int i=bl[x]+;i<bl[y];i++){
l+=lc1[i];
ans=max(ans,l);
ans=max(ans,sc1[i]);
if(lc1[i]!=size) l=rc1[i];
}
if(bl[x]==bl[y]) return max(ans,l);
pushdown(bl[y]);
for(int i=(bl[y]-)*size+;i<=y;i++){
if(a[i]) l++;else l=;
ans=max(ans,l);
}
return ans;
} int main(){
memset(tag,-,sizeof(tag));
scanf("%d%d",&n,&m);size=sqrt(n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
bl[i]=(i-)/size+;
}
for(int i=;i<=bl[n];i++) init(i);
int op,x,y;
for(int i=;i<=m;i++){
scanf("%d%d%d",&op,&x,&y);x++;y++;
if(op==) change1(x,y,);
if(op==) change1(x,y,);
if(op==) change2(x,y);
if(op==) printf("%d\n",query1(x,y));
if(op==) printf("%d\n",query2(x,y));
}
return ;
}
序列操作(bzoj 1858)的更多相关文章
- AC日记——[Scoi2010]序列操作 bzoj 1858
1858 思路: 恶心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tree ...
- bzoj 1858 序列操作
bzoj 1858 序列操作 带有随机多个区间单值覆盖的区间操作题,可考虑用珂朵莉树解决. #include<bits/stdc++.h> using namespace std; #de ...
- (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作
二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...
- 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个数相乘的积 题解 第三个操作看起来一脸懵逼啊. 其实 ...
- 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Statu ...
- bzoj 2962 序列操作
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为n的序列, ...
- bzoj 4831 [Lydsy1704月赛]序列操作 dp
[Lydsy1704月赛]序列操作 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 203 Solved: 69[Submit][Status][Dis ...
- 【BZOJ-2962】序列操作 线段树 + 区间卷积
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 678 Solved: 246[Submit][Status][Discuss] ...
随机推荐
- vue.js 发布后路径引用问题
在发布到iis目录下时候,如果放在网站的根目录下的时候,是不会有什么问题的 但是一旦放在了非根目录的其他文件夹里面,这时候index.html里引用的js和css文件路径都会找不到 错误如下 打开in ...
- jupyter notebook(三)——IOPub_data_rate_limit报错
一.问题 运行jupyter notebook,然后运行python代码,读取文件处理时,会报错.发现时IO读取时错误.应该是IO速率问题. 下面是问题报错: IOPub data rate exce ...
- Django ORM (四) annotate,F,Q 查询
annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合. from django.shortcuts import re ...
- 精通SpringBoot---整合RabbitMQ消息队列
今天来和朋友们一起学习下,SpringBoot怎么整合RabbitMQ.目前消息组件大致有三种:.activemq, rabbitmq, kafka.这三者各有优缺点,RabbitMQ相比之下是处于其 ...
- 自动化运维之使用Python3收发电子邮件~~~附源码
一.背景介绍 1.1 一些专业名称的解释 MUA——Mail User Agent,邮件用户代理.是用户与电子邮件系统的交互接口,一般来说它就是我们PC机上的一个程序,提供一个好的用户界面,它提 ...
- static关键字 详解
原文地址:http://blog.csdn.net/keyeagle/article/details/6708077 google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇 ...
- 笔记-python-lib-re
笔记-python-lib-re 1. re模块简介 re模块提供了与perl类似的正则匹配功能. 要搜索的模式和字符串都可以是Unicode字符串(str)以及8位字符串(bytes).但 ...
- Diycode开源项目 NodeListFragment分析
1.整体分析 1.1.作用讲解 这个类没有用到,只是一个备用的. 分类列表,用于定制首页内容 考虑到节点列表一般不会变化,所以直接将数据封装在客户端中,可以直接查看,提高效率. 1.2.整体分析 首先 ...
- luogu4169 [Violet]天使玩偶/SJY摆棋子 / bzoj2648 SJY摆棋子 k-d tree
k-d tree + 重构的思想,就能卡过luogu和bzoj啦orz #include <algorithm> #include <iostream> #include &l ...
- 50、转自知乎上android开发相见恨晚的接口
原文链接:http://www.zhihu.com/question/33636939 程序员软件开发Android 开发JavaAndroid修改 Android开发中,有哪些让你觉得相 ...