线段树 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项目,然后编译和打包,将.java文件编译为.class,.class编译为.dex,将所有文件打包为一个apk,只编译代码,不编译资源. .apk里面的.arsc是资源的索引, ...
- iOS crash 追终 ,iOS 如何定位crash 位置
https://developer.apple.com/library/ios/technotes/tn2151/_index.html 错误分析是基于设备中的crash log 与 编译文件时生成的 ...
- IT人经济思维之创业 - 创业与投资系列文章
前面笔者曾经写过文(IT从业者的职业规划),介绍了IT从业者的职业规划,对职业路做了规划.然后,又写了文(IT从业者的职业道路(从程序员到部门经理) - 项目管理系列文章),从技术到管理的一个笔者自己 ...
- HADOOP安装指南-Ubuntu15.10和hadoop2.7.2
Ubuntu15.10中安装hadoop2.7.2安装手册 太初 目录 1. Hadoop单点模式... 2 1.1 安装步骤... 2 0.环境和版本... 2 1.在ubu ...
- C#实现在图片上斜着写字
最近公司要搞微信活动页面,要实现图片上可以写自己名字的功能,于是就查了一下怎么实现,下面贴一下代码备忘,希望大家也能用到: 我是在控制台应用程序里进行试验的. using (Image bitmap ...
- xp_sendmail: 由于邮件错误 0x80004005 而失败
今天收到一封邮件说我们的一台SQL SERVER 2000服务器发送邮件有问题.我测试中发现了如下错误: exec xp_sendmail 'Konglb@esquel.com','hello, 12 ...
- nodejs处理get请求
主要记录下获取get请求里面的参数的问题. 假设有这样一个链接 urlString='hello?name=LiLei&position=general' 要从这个链接里提取出参数name和p ...
- RedHat6.2搭建FTP服务器
我的环境: A:Red Hat Enterprise 6.2 IP:192.168.16.12 此机作测试端 B:Red Hat Enterprise 6.2 IP:192.168.16.13 此机做 ...
- 电信行业的BI应用
截至2015年年底,我国三大运营商的移动用户数达到13.1亿户,4G /3G用户累计达到8.09亿户,再次创下新高.从三大运营商的年度财报来看,在具体业务方面,三大运营商的数据流量业务带来的收入均已超 ...
- Neutron 理解(14):Neutron ML2 + Linux bridge + VxLAN 组网
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...