标记会重叠需要判断.

 #include <bits/stdc++.h>
using namespace std;
inline int Max(int x,int y) {return x>y?x:y;}
inline int Max3(int x,int y,int z) {return Max(x,Max(y,z));}
inline void Swap(int &x,int &y) {int t=x;x=y;y=t;}
//===========================================
const int Maxn=;
struct Node
{
int Len,Size0,Size1,l0,l1,r0,r1,Max0,Max1,Tag,Rev;
}Tree[Maxn<<];
int n,m,l,r,Type,a[Maxn];
inline void Push_Up(int o)
{
Tree[o].Len=Tree[o<<].Len+Tree[o<<|].Len;
Tree[o].Size0=Tree[o<<].Size0+Tree[o<<|].Size0;
Tree[o].Size1=Tree[o<<].Size1+Tree[o<<|].Size1;
Tree[o].l0=(Tree[o<<].Len!=Tree[o<<].l0)?Tree[o<<].l0:Tree[o<<].Len+Tree[o<<|].l0;
Tree[o].r0=(Tree[o<<|].Len!=Tree[o<<|].r0)?Tree[o<<|].r0:Tree[o<<|].Len+Tree[o<<].r0;
Tree[o].l1=(Tree[o<<].Len!=Tree[o<<].l1)?Tree[o<<].l1:Tree[o<<].Len+Tree[o<<|].l1;
Tree[o].r1=(Tree[o<<|].Len!=Tree[o<<|].r1)?Tree[o<<|].r1:Tree[o<<|].Len+Tree[o<<].r1;
Tree[o].Max0=Max3(Tree[o<<].r0+Tree[o<<|].l0,Tree[o<<].Max0,Tree[o<<|].Max0);
Tree[o].Max1=Max3(Tree[o<<].r1+Tree[o<<|].l1,Tree[o<<].Max1,Tree[o<<|].Max1);
}
inline void Swap_Tree(int o)
{
Swap(Tree[o].l1,Tree[o].l0),Swap(Tree[o].r0,Tree[o].r1),Swap(Tree[o].Max0,Tree[o].Max1),Swap(Tree[o].Size0,Tree[o].Size1);
}
inline void Update(int o,int v)
{
if (v==) Tree[o].Size0=Tree[o].l0=Tree[o].r0=Tree[o].Max0=Tree[o].Len,Tree[o].Size1=Tree[o].l1=Tree[o].r1=Tree[o].Max1=;
if (v==) Tree[o].Size0=Tree[o].l0=Tree[o].r0=Tree[o].Max0=,Tree[o].Size1=Tree[o].l1=Tree[o].r1=Tree[o].Max1=Tree[o].Len;
}
inline void Push_Down(int o)
{
if (Tree[o].Rev)
{
if (Tree[o<<].Tag) Tree[o<<].Tag=(Tree[o<<].Tag==)?:,Swap_Tree(o<<); else Tree[o<<].Rev^=,Swap_Tree(o<<);
if (Tree[o<<|].Tag) Tree[o<<|].Tag=(Tree[o<<|].Tag==)?:,Swap_Tree(o<<|); else Tree[o<<|].Rev^=,Swap_Tree(o<<|);
Tree[o].Rev=;
}
if (Tree[o].Tag)
{
Update(o<<,Tree[o].Tag),Update(o<<|,Tree[o].Tag);
Tree[o<<].Tag=Tree[o<<|].Tag=Tree[o].Tag;
Tree[o].Tag=;
} }
void Build(int o,int l,int r)
{
if (l==r)
{
Tree[o].Len=;
if (a[l]==) Tree[o].l0=Tree[o].r0=Tree[o].Max0=Tree[o].Size0=;
if (a[l]==) Tree[o].l1=Tree[o].r1=Tree[o].Max1=Tree[o].Size1=;
return;
}
int mid=(l+r)>>;
Build(o<<,l,mid),Build(o<<|,mid+,r);
Push_Up(o);
}
void Modify(int o,int l,int r,int p,int q,int v)
{
if (l==p && r==q)
{
if (Tree[o].Rev) Tree[o].Rev=;
Update(o,v); Tree[o].Tag=v;
return;
}
int mid=(l+r)>>;
Push_Down(o);
if (q<=mid) Modify(o<<,l,mid,p,q,v);
if (p>=mid+) Modify(o<<|,mid+,r,p,q,v);
if (p<=mid && q>=mid+) Modify(o<<,l,mid,p,mid,v),Modify(o<<|,mid+,r,mid+,q,v);
Push_Up(o);
}
void Revese(int o,int l,int r,int p,int q)
{
Push_Down(o);
if (l==p && r==q)
{
if (Tree[o].Tag) {Tree[o].Tag=(Tree[o].Tag==)?:; Swap_Tree(o); return;}
Tree[o].Rev^=;
Swap_Tree(o);
return;
}
int mid=(l+r)>>;
if (q<=mid) Revese(o<<,l,mid,p,q);
if (p>=mid+) Revese(o<<|,mid+,r,p,q);
if (p<=mid && q>=mid+) Revese(o<<,l,mid,p,mid),Revese(o<<|,mid+,r,mid+,q);
Push_Up(o);
}
int Query_Size(int o,int l,int r,int p,int q)
{
Push_Down(o);
if (l==p && r==q) return Tree[o].Size1;
int mid=(l+r)>>;
if (q<=mid) return Query_Size(o<<,l,mid,p,q);
if (p>=mid+) return Query_Size(o<<|,mid+,r,p,q);
return Query_Size(o<<,l,mid,p,mid)+Query_Size(o<<|,mid+,r,mid+,q);
}
Node Query_Len(int o,int l,int r,int p,int q)
{
Push_Down(o);
if (l==p && r==q) return Tree[o];
int mid=(l+r)>>;
if (q<=mid) return Query_Len(o<<,l,mid,p,q);
if (p>=mid+) return Query_Len(o<<|,mid+,r,p,q);
Node L=Query_Len(o<<,l,mid,p,mid);
Node R=Query_Len(o<<|,mid+,r,mid+,q);
Node M;
M.Len=L.Len+R.Len;
M.l1=(L.Len!=L.l1)?L.l1:L.Len+R.l1;
M.r1=(R.Len!=R.r1)?R.r1:R.Len+L.r1;
M.Max1=Max3(L.r1+R.l1,L.Max1,R.Max1);
return M;
}
int main()
{
// freopen("c.in","r",stdin);
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
Build(,,n);
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&Type,&l,&r); l++,r++;
if (Type==) Modify(,,n,l,r,);
if (Type==) Modify(,,n,l,r,);
if (Type==) Revese(,,n,l,r);
if (Type==) printf("%d\n",Query_Size(,,n,l,r));
if (Type==) printf("%d\n",Query_Len(,,n,l,r).Max1);
}
return ;
}

C++

BZOJ 1858 线段树的更多相关文章

  1. BZOJ 1798 (线段树||分块)的标记合并

    我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...

  2. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

  3. bzoj 3999 线段树区间提取 有序链剖

    看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...

  4. bzoj 3211 线段树

    开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. /***************************** ...

  5. bzoj 1018 线段树维护连通性

    本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...

  6. bzoj 3212 线段树

    裸的线段树 /************************************************************** Problem: User: BLADEVIL Langua ...

  7. bzoj 2120 线段树套平衡树

    先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...

  8. bzoj 1901 线段树套平衡树+二分答案查询

    我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...

  9. BZOJ 1012 线段树||单调队列

    非常裸的线段树  || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件 ...

随机推荐

  1. 使用 Spring 进行单元测试

    一.使用spring中对Junit框架的整合功能 除了junit4和spring的jar包,还需要spring-test.jar.引入如下依赖: <dependency> <grou ...

  2. 如何用php生成1-10之间的不重复随机数

       今天跟大家分享一个PHP中的案列,大家一起学习学习.                                                        使用shuffle函数生成随机 ...

  3. YY前端课程3

    1. 常用的字符实体(html实体):空格=      <=<       >=>       版权符号=© 2. ID就像身份证号一样,是唯一的,html页面的ID不能重复: ...

  4. Redis常用命令入门1:字符串类型命令

    Redis总共有五种数据类型,在学习的时候,一定要开一个redis-cli程序,边看边练,提高效率. 一.最简单的命令 1.获得符合规则的键名列表 keys * 这里的*号,是指列出所有的键,同时*号 ...

  5. php HTTP Auth

    if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] != 'kuser' || $_SERVER['PHP_AUTH_ ...

  6. 工作需求----表单多选框checkbox交互

    关于多选框,反选及选取几个: 1.html内容 <!--begin checkbox--> <div class="c_n_manage_tablexx"> ...

  7. Apache AB 如何传递参数

    AB使用时,网上通篇一律,在进行示例时使用的连接一般都是http://*.com,这种写法是没有带参数,如果你想测试一个写入的Case,那需要传递参数给后台,如何传递参数呢? 这里有一个登录的请求,需 ...

  8. CSS3 仿微信聊天小气泡

    今天给大家分享一个我刚做的项目中的一个小案例, 因为我们在做一个聊天的功能,之前的聊天页面UI很丑,我就不在这里展示给大家了. 现在就教大家怎么用css3制作一个和微信聊天界面一样的页面. 首先给大家 ...

  9. 前端神器Sublime Text3 常用插件&常用快捷键

    Sublime Text3常用插件 使用Package Control组件安装 也可以安装package control组件,然后直接在线安装: 按Ctrl+`调出console(注:安装有QQ输入法 ...

  10. callback 转换到 promise

    最近项目迭代,从express到koa,面对callback,想偷懒,就想到了Proxy对象 new Proxy(docker,{ get : function (obj,name) { return ...