1858

思路:

  恶心;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
struct TreeNodeType {
int l,r,l1,r1,m1,l0,r0,m0,mid,size,cnt1,cnt0;
bool f1,f0,ff;
inline void turn(){swap(l1,l0),swap(r1,r0),swap(m1,m0),swap(cnt1,cnt0);}
inline void turn1(){l0=,r0=,m0=,cnt0=,l1=size,r1=size,m1=size,cnt1=size;}
inline void turn0(){l1=,r1=,m1=,cnt1=,l0=size,r0=size,m0=size,cnt0=size;}
inline void F1(){f1=true,f0=false,ff=false;}
inline void F0(){f0=true,f1=false,ff=false;}
inline void FF(){
if(f1) f0=true,f1=false;
else if(f0) f1=true,f0=false;
else ff^=;
}
inline void turnzero(){f1=false,f0=false,ff=false;}
};
struct TreeNodeType tree[maxn<<];
struct AnsType {
int l,r,m,s;
};
int n,m,Count;
inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='') now=now*+Cget-'',Cget=getchar();
}
inline void updata(int now)
{
tree[now].cnt1=tree[now<<].cnt1+tree[now<<|].cnt1;
tree[now].cnt0=tree[now<<].cnt0+tree[now<<|].cnt0;
tree[now].l1=tree[now<<].size==tree[now<<].l1?tree[now<<].l1+tree[now<<|].l1:tree[now<<].l1;
tree[now].l0=tree[now<<].size==tree[now<<].l0?tree[now<<].l0+tree[now<<|].l0:tree[now<<].l0;
tree[now].r1=tree[now<<|].size==tree[now<<|].r1?tree[now<<|].r1+tree[now<<].r1:tree[now<<|].r1;
tree[now].r0=tree[now<<|].size==tree[now<<|].r0?tree[now<<|].r0+tree[now<<].r0:tree[now<<|].r0;
tree[now].m1=max(tree[now<<].r1+tree[now<<|].l1,max(tree[now<<].m1,tree[now<<|].m1));
tree[now].m0=max(tree[now<<].r0+tree[now<<|].l0,max(tree[now<<].m0,tree[now<<|].m0));
}
inline void downdata(int now)
{
if(tree[now].f1) tree[now<<].turn1(),tree[now<<|].turn1(),tree[now<<].F1(),tree[now<<|].F1();
if(tree[now].f0) tree[now<<].turn0(),tree[now<<|].turn0(),tree[now<<].F0(),tree[now<<|].F0();
if(tree[now].ff) tree[now<<].turn(),tree[now<<|].turn(),tree[now<<].FF(),tree[now<<|].FF();
tree[now].turnzero();
}
inline void build(int now,int l,int r)
{
tree[now].l=l,tree[now].r=r,tree[now].size=r-l+;
if(l==r)
{
int pos;
in(pos);
if(pos) tree[now].l1=,tree[now].r1=,tree[now].m1=,tree[now].cnt1=;
else tree[now].l0=,tree[now].r0=,tree[now].m0=,tree[now].cnt0=;
return;
}
tree[now].mid=l+r>>;
build(now<<,l,tree[now].mid);
build(now<<|,tree[now].mid+,r);
updata(now);
}
inline void operation0(int now,int l,int r)
{
if(tree[now].l>=l&&tree[now].r<=r){tree[now].turn0(),tree[now].F0();return;}
if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
if(l<=tree[now].mid) operation0(now<<,l,min(r,tree[now].mid));
if(r>tree[now].mid) operation0(now<<|,max(tree[now].mid+,l),r);
updata(now);
}
inline void operation1(int now,int l,int r)
{
if(tree[now].l>=l&&tree[now].r<=r){tree[now].turn1(),tree[now].F1();return;}
if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
if(l<=tree[now].mid) operation1(now<<,l,min(r,tree[now].mid));
if(r>tree[now].mid) operation1(now<<|,max(tree[now].mid+,l),r);
updata(now);
}
inline void operation2(int now,int l,int r)
{
if(tree[now].l>=l&&tree[now].r<=r){tree[now].turn(),tree[now].FF();return;}
if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
if(l<=tree[now].mid) operation2(now<<,l,min(r,tree[now].mid));
if(r>tree[now].mid) operation2(now<<|,max(tree[now].mid+,l),r);
updata(now);
}
inline void operation3(int now,int l,int r)
{
if(tree[now].l>=l&&tree[now].r<=r){Count+=tree[now].cnt1;return;}
if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
if(l<=tree[now].mid) operation3(now<<,l,min(r,tree[now].mid));
if(r>tree[now].mid) operation3(now<<|,max(l,tree[now].mid+),r);
updata(now);
}
inline AnsType operation4(int now,int l,int r)
{
if(tree[now].l>=l&&tree[now].r<=r) return (AnsType){tree[now].l1,tree[now].r1,tree[now].m1,tree[now].size};
if(tree[now].f1||tree[now].f0||tree[now].ff) downdata(now);
bool al=false,ar=false;AnsType Al,Ar,res;
if(l<=tree[now].mid) al=true,Al=operation4(now<<,l,min(r,tree[now].mid));
if(r>tree[now].mid) ar=true,Ar=operation4(now<<|,max(l,tree[now].mid+),r);
if(al&&ar)
{
res.s=Al.s+Ar.s;
res.l=Al.s==Al.l?Al.l+Ar.l:Al.l;
res.r=Ar.s==Ar.r?Ar.r+Al.r:Ar.r;
res.m=max(Al.r+Ar.l,max(Al.m,Ar.m));
return res;
}
return al?Al:Ar;
}
int main()
{
in(n),in(m),build(,,n-);
int op,l,r;AnsType pos;
while(m--)
{
in(op),in(l),in(r);
if(op==) operation0(,l,r);
if(op==) operation1(,l,r);
if(op==) operation2(,l,r);
if(op==) Count=,operation3(,l,r),printf("%d\n",Count);
if(op==) pos=operation4(,l,r),printf("%d\n",max(max(pos.l,pos.r),pos.m));
}
return ;
}

AC日记——[Scoi2010]序列操作 bzoj 1858的更多相关文章

  1. AC日记——[SCOI2010]幸运数字 bzoj 1853

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2405  Solved: 887[Submit][Status] ...

  2. BZOJ 1858: [Scoi2010]序列操作( 线段树 )

    略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...

  3. (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作

    二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...

  4. bzoj 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...

  5. 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Statu ...

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

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

  7. BZOJ_1858_[Scoi2010]序列操作_线段树

    BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...

  8. 【题解】Luogu P2572 [SCOI2010]序列操作

    原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...

  9. P2572 [SCOI2010]序列操作

    对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...

随机推荐

  1. Codeforces Round #511 (Div. 2):C. Enlarge GCD(数学)

    C. Enlarge GCD 题目链接:https://codeforces.com/contest/1047/problem/C 题意: 给出n个数,然后你可以移除一些数.现在要求你移除最少的数,让 ...

  2. Leetcode 703. 数据流中的第K大元素

    1.题目要求 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器, ...

  3. 关于我之前写的修改Windows系统Dos下显示的用户名之再修改测试

    最近看到蛮多网友反映,自己修改Dos下用户名后出现了很多的问题--今天抽了时间,再次修改测试... ================= 提前说明:我自己修改了很多次没发现任何问题,<为避免修改可 ...

  4. JS鼠标滚轮事件解析

    一.不同浏览器的鼠标滚轮事件 首先,不同的浏览器有不同的滚轮事件.主要是有两种,onmousewheel(IE/Opera/Chrome支持,firefox不支持)和DOMMouseScroll(只有 ...

  5. String StrigBuffer StringBuilder 浅解

    1.String是最基本的字符串类,用于表示字符串. 特点:对象内容不可变,但可以通过指向不同的对象来“表示”不同的内容. 使用场景:如果不涉及到内容改变,可以使用String. 注意:如果想将Str ...

  6. mysql 服务端事务和客户端事务对比分析

    之前做mysql事务测试的时候都是在mysql服务端存储过程里面包含事务. 例如: CREATE DEFINER=`root`@`localhost` PROCEDURE `Test`(out deb ...

  7. 【BZOJ】1718: [Usaco2006 Jan] Redundant Paths 分离的路径

    [题意]给定无向连通图,要求添加最少的边使全图变成边双连通分量. [算法]Tarjan缩点 [题解]首先边双缩点,得到一棵树(无向无环图). 入度为1的点就是叶子,两个LCA为根的叶子间合并最高效,直 ...

  8. 【洛谷 P4051】 [JSOI2007]字符加密(后缀数组)

    题目链接 两眼题.. 第一眼裸SA 第二眼要复制一倍再跑SA. 一遍过.. #include <cstdio> #include <cstring> #include < ...

  9. 【CC2530入门教程-01】CC2530微控制器开发入门基础

    [引言] 本系列教程就有关CC2530单片机应用入门基础的实训案例进行分析,主要包括以下6部分的内容:[1]CC2530微控制器开发入门基础.[2]通用I/O端口的输入和输出.[3]外部中断初步应用. ...

  10. 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)(转)

    原文转自 https://blog.csdn.net/leixiaohua1020/article/details/25346147/ 伴随着毕业论文的完成,这两天终于腾出了空闲,又有时间搞搞FFMP ...