洛谷P2572 [SCOI2010]序列操作
线段树
pushdown写的很浪~
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 100000+10
using namespace std;
struct Node{
int L,R;
int tag;
int num[];
int lcon[],rcon[],mcon[];
Node(){
L=R=tag=;
num[]=num[]=;
lcon[]=rcon[]=mcon[]=;
lcon[]=rcon[]=mcon[]=;
}
}dat[MAXN<<];
int n,m;
int a[MAXN];
Node Merge(Node A,Node B){
if(A.L<)return B;
if(B.L<)return A;
Node ret;
ret.L=A.L,ret.R=B.R;
int ls=A.R-A.L,rs=B.R-B.L;
for(int i=;i<=;i++){
ret.num[i]=A.num[i]+B.num[i];
if(A.num[i]==ls)ret.lcon[i]=ls+B.lcon[i];
else ret.lcon[i]=A.lcon[i];
if(B.num[i]==rs)ret.rcon[i]=rs+A.rcon[i];
else ret.rcon[i]=B.rcon[i];
ret.mcon[i]=max(A.mcon[i],B.mcon[i]);
ret.mcon[i]=max(ret.mcon[i],A.rcon[i]+B.lcon[i]);
}
return ret;
}
void c(Node &A,int x){
x--;
int size=A.R-A.L;
A.num[x]=size,A.num[x^]=;
A.lcon[x]=A.rcon[x]=A.mcon[x]=size;
A.lcon[x^]=A.rcon[x^]=A.mcon[x^]=;
A.tag=x+;
}
void r(Node &A){
swap(A.num[],A.num[]);
swap(A.lcon[],A.lcon[]);
swap(A.rcon[],A.rcon[]);
swap(A.mcon[],A.mcon[]);
A.tag=;
}
void update(Node &A,int x){
if(x<=){c(A,x);return;}
if(!A.tag){
r(A);
}
else if(A.tag<=){
c(A,((A.tag-)^)+);
}
else{
r(A);
A.tag=;
}
}
void pushdown(int k){
if(!dat[k].tag)return;
update(dat[k<<],dat[k].tag);
update(dat[k<<|],dat[k].tag);
dat[k].tag=;
}
void build(int k,int L,int R){
if(L+==R){
dat[k].L=L,dat[k].R=R;
if(a[L]){dat[k].num[]=dat[k].lcon[]=dat[k].rcon[]=dat[k].mcon[]=;}
else {dat[k].num[]=dat[k].lcon[]=dat[k].rcon[]=dat[k].mcon[]=;}
return;
}
build(k<<,L,(L+R)>>);
build(k<<|,(L+R)>>,R);
dat[k]=Merge(dat[k<<],dat[k<<|]);
}
void rev(int a,int b,int k){
int L=dat[k].L,R=dat[k].R;
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
update(dat[k],);
}
else{
pushdown(k);
rev(a,b,k<<);
rev(a,b,k<<|);
dat[k]=Merge(dat[k<<],dat[k<<|]);
}
}
void cha(int a,int b,int k,int x){
int L=dat[k].L,R=dat[k].R;
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
update(dat[k],x);
}
else{
pushdown(k);
cha(a,b,k<<,x);
cha(a,b,k<<|,x);
dat[k]=Merge(dat[k<<],dat[k<<|]);
}
}
Node query(int a,int b,int k){
int L=dat[k].L,R=dat[k].R;
if(b<=L||R<=a){
Node ret;ret.L=-;
return ret;
}
else if(a<=L&&R<=b){
return dat[k];
}
else{
pushdown(k);
Node lc=query(a,b,k<<);
Node rc=query(a,b,k<<|);
return Merge(lc,rc);
}
}
int main()
{
// freopen("data.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
build(,,n+);
int opt,x,y;
while(m--){
scanf("%d%d%d",&opt,&x,&y);x++,y++;
if(==opt||opt==){
cha(x,y+,,opt+);
}
else if(==opt){
rev(x,y+,);
}
else{
Node ans=query(x,y+,);
printf("%d\n",(==opt?ans.num[]:ans.mcon[]));
}
}
return ;
}
洛谷P2572 [SCOI2010]序列操作的更多相关文章
- 洛谷 P2572 [SCOI2010]序列操作
题意简述 维护一个序列,支持如下操作 把[a, b]区间内的所有数全变成0 把[a, b]区间内的所有数全变成1 把[a,b]区间内所有的0变成1,所有的1变成0 询问[a, b]区间内总共有多少个1 ...
- 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...
- 洛谷P2572 [SCOI2010]序列操作(ODT)
题解 题意 题目链接 Sol ODT板子题..... // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long l ...
- 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)
传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...
- 【题解】Luogu P2572 [SCOI2010]序列操作
原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...
- P2572 [SCOI2010]序列操作
对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...
- Luogu P2572 [SCOI2010]序列操作 线段树。。
咕咕了...于是借鉴了小粉兔的做法ORZ... 其实就是维护最大子段和的线段树,但上面又多了一些操作....QWQ 维护8个信息:1/0的个数(sum),左/右边起1/0的最长长度(ls,rs),整段 ...
- bzoj 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...
- BZOJ 1858: [Scoi2010]序列操作( 线段树 )
略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...
随机推荐
- 201621123040《Java程序设计》第七周学习总结
1.本周学习总结 1.1思维导图:Java图形界面总结 2.书面作业 2.1GUI中的事件处理 2.1.1写出事件处理模型中最重要的几个关键词. 关键词:事件 事件源 事件监听器 2.1.2任意编写事 ...
- 201621123057 《Java程序设计》第3周学习总结
1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你 ...
- Android Studio使用过程中遇到的错误
> 错误1 1. This fragment should provide a default constructor (a public constructor wit 代码不规范,这个错误是 ...
- IDEA插件和快捷设置
前言 IDEA全名Intellij IDEA,是Java开发的集成环境,它有两个版本,专业版(Ultimate)和社区版(Community),专业版需要注册,而社区版不用注册,同时需要注意的是社区版 ...
- LeetCode & Q169-Majority Element-Easy
Array Divide and Conquer Bit Manipulation Description: Given an array of size n, find the majority e ...
- 作业五:RE 模块模拟计算器
# !/usr/bin/env python3 # _*_coding:utf-8_*_ ''' 实现模拟计算器的功能: 公式: - * ( (- +(-/) * (-*/ + /*/* + * / ...
- java 实现多文件打包下载
jsp页面js代码: function downloadAttached(){ var id = []; id.push(infoid); var options = {}; options.acti ...
- 修改了SpringBoot的主类名称后,gradle build报错的解决办法
Unable to find a single main class from the following candidates [*.*Application]
- Error loading MySQLdb module: No module named 'MySQLdb'----------- django成功连接mysql数据库的方法
在进行django学习过程中,尝试使用框架连接mysql数据库,启动服务器的时候经常遇到Error loading MySQLdb module: No module named 'MySQLdb' ...
- centos7配置Apache支持HTTPS
Apache版本2.4 安装mod_ssl yum install mod_ssl 建立文件夹,存放sslkey mkdir /etc/httpd/ssl/ 建立凭证档 openssl req -x5 ...