5 种操作  0 1 然后 异或 似乎这种2个更新的先后每次都搞不清

覆盖有覆盖就可以不异或

也不知道为什么

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; #define MAXN 100010 struct node
{
int l,r,ls,rs,ms; // 左边连续的1 右边 最多
int lz,rz,mz; // 0
int XOR,cov; // 异或 lazy
int sum; //和
}x[MAXN<<];
int z[MAXN];
void makexor(int a)//0 1 交换
{
swap(x[a].ls,x[a].lz);
swap(x[a].rs,x[a].rz);
swap(x[a].ms,x[a].mz);
x[a].sum=x[a].r-x[a].l+-x[a].sum;
}
void push_up(int a)
{
int len=x[a].r-x[a].l+;
x[a].ls=x[a<<].ls;
x[a].rs=x[a<<|].rs;
x[a].ms=max(x[a<<].ms,x[a<<|].ms);
if(x[a].ls==(len+)>>) //这边就是普通的区间合并
x[a].ls+=x[a<<|].ls;
if(x[a].rs==len>>)
x[a].rs+=x[a<<].rs;
int mid=(x[a].r+x[a].l)>>;
// if(z[mid]==z[mid+1]&&z[mid]==1) //一开始这里一直错 其实后面更新了 不用考虑这个
x[a].ms=max(x[a].ms,x[a<<].rs+x[a<<|].ls); x[a].lz=x[a<<].lz;
x[a].rz=x[a<<|].rz;
x[a].mz=max(x[a<<].mz,x[a<<|].mz);
if(x[a].lz==(len+)>>)
x[a].lz+=x[a<<|].lz;
if(x[a].rz==len>>)
x[a].rz+=x[a<<].rz;
x[a].mz=max(x[a].mz,x[a<<].rz+x[a<<|].lz); x[a].sum=x[a<<].sum+x[a<<|].sum;
}
void push_down(int a)
{
if(x[a].cov!=-)
{
int l=x[a].l;
int r=x[a].r;
int len=r-l+;
x[a<<].cov=x[a<<|].cov=x[a].cov;
x[a<<].XOR=x[a<<|].XOR=; x[a<<].ls=x[a<<].rs=x[a<<].ms=x[a].cov?(len+)>>:;
x[a<<].lz=x[a<<].rz=x[a<<].mz=x[a].cov?:(len+)>>;
x[a<<].sum=x[a].cov?(len+)>>:; x[a<<|].ls=x[a<<|].rs=x[a<<|].ms=x[a].cov?len>>:;
x[a<<|].lz=x[a<<|].rz=x[a<<|].mz=x[a].cov?:len>>;
x[a<<|].sum=x[a].cov?len>>:; x[a].cov=-;
}
if(x[a].XOR)
{
x[a].XOR=;
x[a<<].XOR^=;
x[a<<|].XOR^=;
makexor(a<<);
makexor(a<<|);
}
} void Build(int l,int r,int a)
{
x[a].l=l;
x[a].r=r;
x[a].XOR=;
x[a].cov=-;
if(l==r)
{
x[a].ls=x[a].rs=x[a].ms=(z[l]==);
x[a].lz=x[a].rz=x[a].mz=(z[l]==);
x[a].sum=z[l];
x[a].cov=z[l];
return ;
}
int mid=(l+r)>>;
Build(l,mid,a<<);
Build(mid+,r,a<<|);
push_up(a);
}
void update(int l,int r,int a1,int b1,int w,int a)
{
push_down(a);
if(a1<=l&&r<=b1)
{
if(w<)
{
int len=r-l+;
x[a].cov=w;
x[a].ls=x[a].rs=x[a].ms=w?len:;
x[a].lz=x[a].rz=x[a].mz=w?:len;
x[a].sum=w?len:;
x[a].XOR=;
}
else
{
x[a].XOR=;
makexor(a);
}
return ;
}
int mid=(l+r)>>;
if(a1<=mid)
update(l,mid,a1,b1,w,a<<);
if(b1>mid)
update(mid+,r,a1,b1,w,a<<|);
push_up(a);
}
int query_sum(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) {
return x[rt].sum;
}
push_down(rt);
int m=(l+r)>>;
int ans=;
if(L<=m)
ans+=query_sum(L,R,l,m,rt<<);
if(m<R)
ans+=query_sum(L,R,m+,r,rt<<|);
return ans;
}
int query_len(int L,int R,int l,int r,int rt)
{
push_down(rt);
if(L<=l&&r<=R) {
return x[rt].ms;
} int m=(l+r)>>;
int ans=;
if(L<=m)
ans=max(ans,query_len(L,R,l,m,rt<<));
if(m<R)
ans=max(ans,query_len(L,R,m+,r,rt<<|));
return max(ans,min(m-L+,x[rt<<].rs)+min(R-m,x[rt<<|].ls));
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&z[i]);
Build(,n,); while(m--)
{
int op,a,b;
scanf("%d%d%d",&op,&a,&b);
a++;
b++;
if(op<=)
update(,n,a,b,op,);
else if(op==)
printf("%d\n",query_sum(a,b,,n,));
else
printf("%d\n",query_len(a,b,,n,));
}
}
return ;
}

线段树 HDU 3397(真)的更多相关文章

  1. 线段树 HDU 3397

    5种操作 具体看代码 #include<iostream> #include<stdio.h> #include<string.h> #include<alg ...

  2. 敌兵布阵(线段树HDU 1166)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...

  3. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

  4. 最大矩阵覆盖权值--(静态连续最大子段 (线段树) )-HDU(6638)Snowy Smile

    这题是杭电多校2019第六场的题目 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6638 题意:给你平面上n个点,每个点都有权值(有负权),让你计算一 ...

  5. HDU 6464 权值线段树 && HDU 6468 思维题

    免费送气球 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  6. 区间第k大问题 权值线段树 hdu 5249

    先说下权值线段树的概念吧 权值平均树 就是指区间维护值为这个区间内点出现次数和的线段树 用这个加权线段树 解决第k大问题就很方便了 int query(int l,int r,int rt,int k ...

  7. 线段树 HDU 3308

    t 题目大意:给你n个数,m个操作.操作有两种:1.U x y 将数组第x位变为y   2. Q x y 问数组第x位到第y位连续最长子序列的长度.对于每次询问,输出一个答案 #include< ...

  8. 二维线段树 HDU 1823最简单的入门题

    xiaoz 征婚,首先输入M,表示有M个操作. 借下来M行,对每一行   Ih a l     I 表示有一个MM报名,H是高度, a是活泼度,L是缘分. 或   Q h1 h2 a1 a2    求 ...

  9. bzoj 3038: 上帝造题的七分钟2 线段树||hdu 4027

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 476[Submit][Status][Dis ...

随机推荐

  1. UIWindow

    title: UIWindow相关知识date: 2016-1-21 20:50categories: IOS tags: UIWindow 小小程序猿我的博客:http://daycoding.co ...

  2. 蚂蚁金服寒泉子:JVM源码分析之临门一脚的OutOfMemoryError完全解读

    ➠更多技术干货请戳:听云博客 概述 OutOfMemoryError,说的是java.lang.OutOfMemoryError,是JDK里自带的异常,顾名思义,说的就是内存溢出,当我们的系统内存严重 ...

  3. iOS 学习 - 19 结构体

    //创建新类型typedef struct { int age; ];//最大字节为 20 }Student; Student value2 = {,*strcpy(value2.name, &quo ...

  4. expdp 报The value (30) of MAXTRANS parameter ignored错误的原因诊断

    在使用expdp导出一个表的数据时遇到了下面情况,也不见其提示报错信息,一下子就执行完了,也没有导出我需要的数据 [oracle@getlnx01 dump_dir]$ expdp system/xx ...

  5. 搭建高可用的redis集群,避免standalone模式带给你的苦难

    现在项目上用redis的话,很少说不用集群的情况,毕竟如果生产上只有一台redis会有极大的风险,比如机器挂掉,或者内存爆掉,就比如我们生产环境 曾今也遭遇到这种情况,导致redis内存不够挂掉的情况 ...

  6. typedef 和 #define 的区别

    本文已迁移至: http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html typed ...

  7. Python写地铁的到站的原理简易版

    Python地铁的到站流程及原理(个人理解) 今天坐地铁看着站牌就莫名的想如果用Python写其工作原理 是不是很简单就小试牛刀了下大佬们勿喷纯属小弟个人理解 首先来看看地铁上显示的站牌如下: 就想这 ...

  8. 架构实例之Demo_JSP_JavaBean_Servlet

    架构实例之Demo_JSP_JavaBean_Servlet 1.开发工具和开发环境       开发工具: MyEclipse10,JDK1.6.0_13(32位),Tomcat7.0(32位),m ...

  9. WPF Freezable–How to improve your application's performances

    在给ImageBrush绑定动态图片是会报以下错误. Error    4    The provided DependencyObject is not a context for this Fre ...

  10. 【2016-11-15】【坚持学习】【Day26】【通用的SQLHelper】

    今天看DevDemo源码时候看到一个写得很好的SQLHelper 代码 public class SqlHelper<T, Command> where T : DbConnection ...