线段树 HDU 3397(真)
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(真)的更多相关文章
- 线段树 HDU 3397
5种操作 具体看代码 #include<iostream> #include<stdio.h> #include<string.h> #include<alg ...
- 敌兵布阵(线段树HDU 1166)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...
- 主席树[可持久化线段树](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 ...
- 最大矩阵覆盖权值--(静态连续最大子段 (线段树) )-HDU(6638)Snowy Smile
这题是杭电多校2019第六场的题目 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6638 题意:给你平面上n个点,每个点都有权值(有负权),让你计算一 ...
- HDU 6464 权值线段树 && HDU 6468 思维题
免费送气球 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- 区间第k大问题 权值线段树 hdu 5249
先说下权值线段树的概念吧 权值平均树 就是指区间维护值为这个区间内点出现次数和的线段树 用这个加权线段树 解决第k大问题就很方便了 int query(int l,int r,int rt,int k ...
- 线段树 HDU 3308
t 题目大意:给你n个数,m个操作.操作有两种:1.U x y 将数组第x位变为y 2. Q x y 问数组第x位到第y位连续最长子序列的长度.对于每次询问,输出一个答案 #include< ...
- 二维线段树 HDU 1823最简单的入门题
xiaoz 征婚,首先输入M,表示有M个操作. 借下来M行,对每一行 Ih a l I 表示有一个MM报名,H是高度, a是活泼度,L是缘分. 或 Q h1 h2 a1 a2 求 ...
- bzoj 3038: 上帝造题的七分钟2 线段树||hdu 4027
3038: 上帝造题的七分钟2 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1066 Solved: 476[Submit][Status][Dis ...
随机推荐
- Android—实现自定义相机倒计时拍照
这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: 两个TextView是用来显示提示信息和倒计时的 ...
- iOS 9 强制横屏
首先在plist 文件中 Supported interface orientations 选项 只留下一个 portrait 屏幕强制横屏 使用以下代码 self.navigationControl ...
- 学习ES6生成器(Generator)
背景 在JS的使用场景中,异步操作的处理是一个不可回避的问题,如果不做任何抽象.组织,只是“跟着感觉走”,那么面对“按顺序发起3个ajax请求”的需求,很容易就能写出如下代码(假设已引入jQuery) ...
- CoreData的一些简单运用
1.首先创建一个新的工程 记得勾选下面的 Use Core Data 万恶分割线———————————————————————— 然后点击Add Entity 创建一个类似于表名. 万恶分割线———— ...
- APP上架证书无效:解决
转发:http://www.cnblogs.com/pruple/p/5523767.html 转发:http://blog.csdn.net/sunnyboy9/article/details/50 ...
- TortoiseSVN和VisualSVN-Server的配置使用,外网访问SVN版本库
TortoiseSVN和VisualSVN-Server的配置使用,外网访问SVN版本库 SVN客户端程序:TortoiseSVN SVN服务器程序:VisualSVN-Server ######## ...
- 【转】Hive的insert操作
insert 语法格式为: 1. 基本的插入语法: insert overwrite table tablename [partition(partcol1=val1,partclo2=val2)] ...
- Zookeeper(一)从抽屉算法到Quorum (NRW)算法
一.抽屉算法 抽屉算法,又名鸽巢原理,它是德国数学家狄利克雷首先明确的提出来并用以证明一些数论中的问题,因此,也称为狄利克雷原则.它是组合数学中一个重要的原理. 具体算法讲的是: 第一抽屉算法: 如果 ...
- Object.observe将不加入到ES7
先请看 Object.observe 的 API Object.observe(obj, callback[, acceptList]) 它用来监听对象的变化,当给该对象添加属性,修改属性时都会被依次 ...
- WSTMall网站系统最新官方版
WSTMall V1.0是在thinkphp 的经典版本3.2.2基础上进行优化开发的, TP 3.2.2不是thinkphp的一个最新的版本,却是thinkphp最金典的一个版本,正所谓站在巨人的肩 ...