线段树 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 ...
随机推荐
- 两种方法设置disabled属性
//两种方法设置disabled属性 $('#fileup').attr("disabled",true); $('#fileup').attr("disabled&qu ...
- Java异常之自定义异常
哎呀,妈呀,又出异常了!俗话说:"代码虐我千百遍,我待代码如初恋". 小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常.Java异 ...
- Ajax.BeginForm参数详解
在Asp.Net的MVC中的语法,在Razor页面中使用,替代JQuery的Ajax使用,方便快捷. 使用Ajax.BeginForm方法会生成一个form表单,最后以Ajax的方式提交表单数据:需要 ...
- SQL SERVER 中如何用脚本管理作业
在SQL SERVER中用脚本管理作业,在绝大部分场景下,脚本都比UI界面管理作业要高效.简洁.打个简单的比方,如果你要查看作业的运行时长,如果用UI界面查看,100个作业,你就得在历史记录里面至少查 ...
- 在服务器上发布MVC5的应用
如果在Windows server 2012R2上发布MVC应用,步骤稍微简单一些: 安装Win Server2012R2 增加角色IIS和asp.net4.5, IIS里增加asp.net4.5支持 ...
- WPF 自定义绕圈进度条
在设计界面时,有时会遇到进度条,本次讲解如何设计自定义的绕圈进度条,直接上代码: 1.控件界面 <UserControl x:Class="ProgressBarControl&quo ...
- java反射 cglib asm相关资料
有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...
- jsp/servlet 中sendRedirect,include,forward区别
1 sendRedirect response.sendRedirect(); 服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求新的地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以sess ...
- spring security oauth2.0 实现
oauth应该属于security的一部分.关于oauth的的相关知识可以查看阮一峰的文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html ...
- Windows共享作为公司文件服务器的案例
1.目录结构 → 主管 部门 → 员工 → Public 2.实现效果 每个部门一个目录 部门主管可以访问自己和部门员工的目录 部门员工只可访问自己的目录 公共目录Public部门所有人都可访问 3. ...