您的位置:首页 > 其它

hdu 3911 线段树的区间合并

2017-07-01 15:30 716 查看
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 500010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int s1
,s2
,l1
,r1
,l2
,r2
,d
;
inline int MAX(int a,int b)
{
return a>b?a:b;
}
inline int MIN(int a,int b)
{
return a<b?a:b;
}

void diverse(int rt)
{
swap(l1[rt],l2[rt]);
swap(r1[rt],r2[rt]);
swap(s1[rt],s2[rt]);
}
void pushup(int l,int r,int rt)
{int m=(l+r)>>1;
l1[rt]=l1[rt<<1];
l2[rt]=l2[rt<<1];
if(l1[rt<<1]==(m-l+1))
l1[rt]+=l1[rt<<1|1];
if(l2[rt<<1]==(m-l+1))
l2[rt]+=l2[rt<<1|1];

r1[rt]=r1[rt<<1|1];
r2[rt]=r2[rt<<1|1];
if(r1[rt<<1|1]==(r-m))
r1[rt]+=r1[rt<<1];
if(r2[rt<<1|1]==(r-m))
r2[rt]+=r2[rt<<1];

s1[rt]=MAX(r1[rt<<1]+l1[rt<<1|1],MAX(s1[rt<<1],s1[rt<<1|1]));
s2[rt]=MAX(r2[rt<<1]+l2[rt<<1|1],MAX(s2[rt<<1],s2[rt<<1|1]));
}
void pushdown(int rt)
{
if(d[rt])
{
d[rt<<1]^=1;
d[rt<<1|1]^=1;
d[rt]=0;
diverse(rt<<1);
diverse(rt<<1|1);
}
}
void build(int l,int r,int rt)
{
d[rt]=0;
if(l==r)
{
int t;
scanf("%d",&t);
l1[rt]=r1[rt]=s1[rt]=t;
l2[rt]=r2[rt]=s2[rt]=!t;
return ;
}
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(l,r,rt);
}
void update(int a,int b,int l,int r,int rt)
{
if(b<l||a>r)
return ;
if(a<=l&&r<=b)
{
d[rt]^=1;
diverse(rt);
return ;
}
pushdown(rt);
int m=(l+r)>>1;
update(a,b,lson);
update(a,b,rson);
pushup(l,r,rt);
}
int query(int a,int b,int l,int r,int rt)
{
if(b<l||a>r)
return 0;
if(a<=l&&r<=b)
return s1[rt];
pushdown(rt);
int m=(l+r)>>1;
int res1=query(a,b,lson);
int res2=query(a,b,rson);
return MAX(MIN(m-a+1,r1[rt<<1])+MIN(b-m,l1[rt<<1|1]),MAX(res1,res2));
}
int main()
{
int n;
while(~scanf("%d",&n))
{
build(1,n,1);
int q;
scanf("%d",&q);
while(q--)
{
int t,a,b;
scanf("%d%d%d",&t,&a,&b);
if(t)update(a,b,1,n,1);
else printf("%d\n",query(a,b,1,n,1));
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: