SCOI 2010 序列操作
题目描述
lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作:
0 a b 把[a, b]区间内的所有数全变成0
1 a b 把[a, b]区间内的所有数全变成1
2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成0
3 a b 询问[a, b]区间内总共有多少个1
4 a b 询问[a, b]区间内最多有多少个连续的1
对于每一种询问操作,lxhgww都需要给出回答,聪明的程序员们,你们能帮助他吗?
一道坑爹的线段树,我们维护7个信息,区间左右段点值,左右端点的连续长度,区间内的最长0串和1串。注意标记合并,翻转标记是xor更新的。覆盖标记遇上翻转标记是改覆盖标记类型。或者覆盖。
#include<bits/stdc++.h>
#define sight(x) ('0'<=x&&x<='9')
#define MID ((l+r)>>1)
#define max(x,y) (x)>(y)?(x):(y)
#define node No
#define o(x) (x=(x&1)+1)
#define L(x) ((x)<<1)
#define R(x) ((x)<<1|1)
#define La lazy
#define N 400007
using namespace std;
inline void read(int &x) {
static char c; static int b;
for (b=,c=getchar();!sight(c);c=getchar()) if (c=='-') b=-;
for (x=;sight(c);c=getchar()) x=x*+c-;
x*=b;
}
struct Node{
int sum,l,r,llen,rlen,ma[],siz;
inline void add(Node x,Node y){
sum=x.sum+y.sum; siz=x.siz+y.siz;
l=x.l; r=y.r;
ma[]=max(x.ma[],y.ma[]); ma[]=max(x.ma[],y.ma[]);
if (x.r==y.l) ma[x.r]=max(ma[x.r],x.rlen+y.llen);
llen=x.llen; rlen=y.rlen;
if (x.llen==x.siz) llen=x.llen+((y.l==x.r)?y.llen:);
if (y.rlen==y.siz) rlen=y.rlen+((y.l==x.r)?x.rlen:);
}
inline void G1() {
sum=siz-sum;
l^=,r^=; swap(ma[],ma[]);
}
inline void L1(int x) {
sum=x?siz:;
l=r=x; ma[x]=siz; ma[x^]=; llen=rlen=siz;
}
}T[N],RR;
int La[N],La1[N];
inline void updata(int node){
if (La[No]) { La[L(No)]=La[R(No)]=La[No];
T[L(No)].L1(La[No]&); La1[L(No)]=;
T[R(No)].L1(La[No]&); La1[R(No)]=; La[No]=; return;}
if (La1[No]) {
if (La[L(No)]) o(La[L(No)]),La1[L(No)]=; else La1[L(No)]^=;
if (La[R(No)]) o(La[R(No)]),La1[R(No)]=; else La1[R(No)]^=;
La1[No]=; T[L(No)].G1(); T[R(No)].G1(); return;}
}
void build(int node,int l,int r){
if (l==r) {
read(T[node].sum);
T[node].l=T[node].r=T[node].sum;
T[node].llen=T[node].rlen=T[node].siz=;
T[node].ma[T[node].sum]=;
return;
}
build(L(No),l,MID); build(R(No),MID+,r);
T[node].add(T[L(No)],T[R(No)]);
}
void change(int node,int l,int r,int L,int R,int col){
if (L<=l&&r<=R) { int XX=col&;
if (XX) { La1[No]=; La[No]=XX; T[No].L1(XX&);}
else { if (La[No]) o(La[No]),La1[No]=; else La1[No]^=; T[No].G1();
} return;
}
if (La[node]||La1[node]) updata(node);
if (R<=MID) change(L(No),l,MID,L,R,col); else
if (L> MID) change(R(No),MID+,r,L,R,col); else
change(L(No),l,MID,L,MID,col),change(R(No),MID+,r,MID+,R,col);
T[No].add(T[L(No)],T[R(No)]);
}
Node query(int node,int l,int r,int L,int R){
if (L<=l&&r<=R) return T[node];
if (La[node]||La1[node]) updata(node);
if (R<=MID) return query(L(No),l,MID,L,R);
if (L> MID) return query(R(No),MID+,r,L,R);
Node XX;
XX.add(query(L(No),l,MID,L,MID),query(R(No),MID+,r,MID+,R));
return XX;
}
void write(int x){
if (x<) {putchar(''+x);return;}write(x/); putchar(''+x%);
}
int n,m,op,X,Y;
int main () {
freopen("a.in","r",stdin);
read(n); read(m);
build(,,n);
while(m--) {
read(op); read(X); read(Y); X++; Y++;
switch (op){
case :change(,,n,X,Y,); break;
case :change(,,n,X,Y,); break;
case :change(,,n,X,Y,); break;
case :RR=query(,,n,X,Y);write(RR.sum);putchar('\n'); break;
case :RR=query(,,n,X,Y);write(RR.ma[]);putchar('\n'); break;
}
}
return ;
}
SCOI 2010 序列操作的更多相关文章
- 解题:SCOI 2010 序列操作
题面 线段树......模板题(雾? 然而两种标记会互相影响,必须保证每次只放一个(不然就不知道怎么放了),具体的影响就是: 翻转标记会使得覆盖标记一起翻转,下放的时候就是各种swap 覆盖标记会抹掉 ...
- SCOI2010 序列操作
2421 序列操作 http://codevs.cn/problem/2421/ 2010年省队选拔赛四川 题目描述 Description lxhgww最近收到了一个01序列,序列里面包含了n个 ...
- 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个数相乘的积 题解 第三个操作看起来一脸懵逼啊. 其实 ...
- bzoj 2962 序列操作
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为n的序列, ...
随机推荐
- 51Nod--1018排序
1018 排序 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出N个整数,对着N个整数进行排序 Input 第1行:整数的数量N(1 <= N ...
- JavaSE初步学习笔记
PS:个人用来随时记录学习的过程,格式比较混乱,仅供个人参考与复习知识点 Dos命令行,课程中常见的命令 Dir:列出当前目录下包含的文件 Md:在当前目录下创建文件 Rd:在当前目录下删除指定文件夹 ...
- WinForm下的loading框实现
前言:在项目使用C/S模式情况下,由于需要经常进行数据的刷新,如果直接进行刷新,会有一个等待控件重画的过程,非常的不友好,因此在这里添加一个loading框进行等待显示. 实现:在经过多方面查询资料, ...
- 零基础学习Hadoop
零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了.整个过程整理一下,给大家参考,欢迎讨论,共同学习. ...
- java-8u151-64安装与配置环境变量
去oracle官网下载 java jdk for developments(最新发布的java9与java8有很大差别,选择8就够用了) 我是装在默认的C盘里的,直接配置环境变量了 新建JAVA_HO ...
- kubernetes入门实践
k8s中文文档 k8s概念比较多,有什么概念的疑惑的推荐看k8s中文文档. me的环境 操作系统:centos7 docker:1.12.6 环境跟me的不一致?不要慌,基本大部分操作都是行的通的. ...
- Docker笔记四:Elasticsearch实例部署
在运行或启动elasticsearch容器前,先在宿主机上执行 sysctl -w vm.max_map_count=262144: 解决" max virtual memory areas ...
- Python爬虫:用BeautifulSoup进行NBA数据爬取
爬虫主要就是要过滤掉网页中没用的信息.抓取网页中实用的信息 一般的爬虫架构为: 在python爬虫之前先要对网页的结构知识有一定的了解.如网页的标签,网页的语言等知识,推荐去W3School: W3s ...
- LintCode-买卖股票的最佳时机
如果有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多仅仅同意完毕一次交易(比如,一次买卖股票),设计一个算法来找出最大利润. 您在真实的面试中是否遇到过这个题? Yes 例子 给出 ...
- jsp页面制作弹出框
各种弹出页面的设计 [1.普通的弹出窗口] 其实代码非常简单: <SCRIPT LANGUAGE=javascript> <!-- window.open ('page.html') ...