5种操作

具体看代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; #define lson u<<1
#define rson u<<1|1
#define MAXN 100010 int dat[MAXN]; struct Node {
int lef,rig;
int lsum,rsum,msum;//左端最长连续1,右端最长连续1,区间最长连续1
int lz,rz,mz;//左端最长连续0,右端最长连续0,区间最长连续0
int sum;//区间1的个数
int COVER,XOR;
}T[MAXN<<]; void makeXOR(int u){//翻转操作
swap(T[u].lsum,T[u].lz);
swap(T[u].rsum,T[u].rz);
swap(T[u].msum,T[u].mz);
T[u].sum=T[u].rig-T[u].lef+-T[u].sum;
} void PushUp(int u){
if(T[u].lef==T[u].rig)return;
int len=T[u].rig-T[u].lef+;
T[u].lsum=T[lson].lsum;
T[u].rsum=T[rson].rsum;
if(T[u].lsum==(len+)>>)T[u].lsum+=T[rson].lsum;
if(T[u].rsum==len>>)T[u].rsum+=T[lson].rsum;
T[u].msum=max(T[lson].msum,T[rson].msum);
T[u].msum=max(T[u].msum,T[lson].rsum+T[rson].lsum); T[u].lz=T[lson].lz;
T[u].rz=T[rson].rz;
if(T[u].lz==(len+)>>)T[u].lz+=T[rson].lz;
if(T[u].rz==len>>)T[u].rz+=T[lson].rz;
T[u].mz=max(T[lson].mz,T[rson].mz);
T[u].mz=max(T[u].mz,T[lson].rz+T[rson].lz); T[u].sum=T[lson].sum+T[rson].sum;
} void PushDown(int u){
if(T[u].lef==T[u].rig)return;
if(T[u].COVER!=-){
int len=T[u].rig-T[u].lef+;
T[lson].COVER=T[rson].COVER=T[u].COVER;
T[lson].XOR=T[rson].XOR=;
T[lson].lsum=T[lson].rsum=T[lson].msum=T[u].COVER?(len+)>>:;
T[lson].lz=T[lson].rz=T[lson].mz=T[u].COVER?:(len+)>>;
T[lson].sum=T[u].COVER?(len+)>>:; T[rson].lsum=T[rson].rsum=T[rson].msum=T[u].COVER?len>>:;
T[rson].lz=T[rson].rz=T[rson].mz=T[u].COVER?:len>>;
T[rson].sum=T[u].COVER?len>>:; T[u].COVER=-;
}
if(T[u].XOR){
T[u].XOR=;
T[lson].XOR^=;
T[rson].XOR^=;
makeXOR(lson);
makeXOR(rson);
}
} void Build(int u,int l,int r){
T[u].lef=l;
T[u].rig=r;
T[u].COVER=-;
T[u].XOR=;
if(l==r){
T[u].lsum=T[u].rsum=T[u].msum=(dat[l]==);
T[u].lz=T[u].rz=T[u].mz=(dat[l]==);
T[u].sum=dat[l];
T[u].COVER=dat[l];
return;
}
int mid=(l+r)>>;
Build(lson,l,mid);
Build(rson,mid+,r);
PushUp(u);
} void Update(int u,int l,int r,int op){
PushDown(u);//这里应该先pushdown
if(l<=T[u].lef&&T[u].rig<=r){
if(op<){//覆盖操作
int len=T[u].rig-T[u].lef+;
T[u].COVER=op;
T[u].lsum=T[u].rsum=T[u].msum=op?len:;
T[u].lz=T[u].rz=T[u].mz=op?:len;
T[u].sum=op?len:;
}
else {
T[u].XOR=;
makeXOR(u);
}
}
else {
if(l<=T[lson].rig)Update(lson,l,r,op);
if(r>=T[rson].lef)Update(rson,l,r,op);
PushUp(u);
}
} int Query(int u,int l,int r,int op){
PushDown(u);//应该先 pushdown,以防错误
if(l<=T[u].lef&&T[u].rig<=r){
if(op==)return T[u].sum;
else return T[u].msum;
}
else {
if(r<=T[lson].rig)return Query(lson,l,r,op);
if(l>=T[rson].lef)return Query(rson,l,r,op);
if(op==) return Query(lson,l,T[lson].rig,op)+Query(rson,T[rson].lef,r,op); int ret=min(T[lson].rsum,T[lson].rig-l+)+min(T[rson].lsum,r-T[rson].lef+);
int ans=max(Query(lson,l,T[lson].rig,op),Query(rson,T[rson].lef,r,op));
return max(ans,ret); }
} int main(){ int t;
scanf("%d",&t);
while(t--){
int n,m;
int cmd,a,b; scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",dat+i);
Build(,,n); while(m--){
scanf("%d%d%d",&cmd,&a,&b);
a++,b++;
if(cmd<)Update(,a,b,cmd);
else printf("%d\n",Query(,a,b,cmd));
}
}
return ;
}

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

  1. 线段树 HDU 3397(真)

    5 种操作  0 1 然后 异或 似乎这种2个更新的先后每次都搞不清 覆盖有覆盖就可以不异或 也不知道为什么 #include<stdio.h> #include<string.h& ...

  2. 主席树[可持久化线段树](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 ...

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

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

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

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

  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. iOS之2016面试题二

    前言 招聘高峰期来了,大家都非常积极地准备着跳槽,那么去一家公司面试就会有一堆新鲜的问题,可能不会,也可能会,但是了解不够深.本篇文章为群里的小伙伴们去要出发公司的笔试题,由笔者整理并提供笔者个人参考 ...

  2. windows server2012 R2 本地策略编辑

    进入本地策略编辑器: 1.win + R 2.输入命令行:gpedit.msc 密码期限设置: 1.windows设置 2.安全设置 3.账户策略 4.密码策略 5.密码最长使用期限 赋值 0 交互登 ...

  3. 软件工程--界面UI 的原型设计

    经过今天的讨论, 我们组初步给出了设计方案. 安装了一晚上的 mockupBuilder 终于绘制了几份界面的原型图, 这里需要吐槽下 mockupBuilder, 这个软件很好用, 不过网页版和单机 ...

  4. git review & devops过程

    自己搭建的devops环境是gitlab/gerrit/jenkins 1. 首先自己checkout一个自己的代码分支,一般不要在master上做直接修改 2. 修改后git add file,   ...

  5. Linq专题之提高编码效率—— 第一篇 Aggregate方法

    我们知道linq是一个很古老的东西,大家也知道,自从用了linq,我们的foreach少了很多,但有一个现实就是我们在实际应用中使用到的却是屈指可数 的几个方法,这个系列我会带领大家看遍linq,好的 ...

  6. .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(三)

    阅读目录: 7.HtmlHelper.HtmlHelper<T>中的ViewModel的类型推断 8.控制ViewModel中的某个属性的呈现(使用PartialView部分视图细粒度控制 ...

  7. sql server之ROW_NUMBER() OVER()取每组的第N行数据

    先看个例子: document_id card_holder_id created_date document_type_id 1 1 2015-7-1 1 2 4 2015-7-2 1 3 4 20 ...

  8. APUE环境配置

    1.到http://www.apuebook.com/选择相应的版本下载源码,我的是2013版的 2.将apue.h拷到/usr/include目录下 3.将error.c拷到源文件下,编译的时候带上 ...

  9. Linux基础命令操作

    显示日期与时间:date date +%Y/%m/%d date +%H:%M 显示日历:cal 显示一整年(cal 2009) 显示一年中的某一个月 (cal [[month]] year) 例如 ...

  10. docker-9 supervisord 参考docker从入门到实战

    参考docker从入门到实战 使用 Supervisor 来管理进程 Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务.但我们经常需要在一个机 ...