您的位置:首页 > 其它

hdu 3911 Black And White

2011-08-09 00:16 288 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3911

好吧,纠结很久才发现的那个错误。泪奔。。。。。

用到了线段树中的懒操作,具体的话,就看线段树里面的结点信息吧==!

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <vector>
using namespace std;

const int maxn = 100005;
struct node
{
int l;
int r;
int maxb;   //最长的黑色连续长度
int maxw;   //最长的白色连续长度
int lmax;   //左边的连续最大长度
int rmax;   //右边的连续最大长度
int lcor;   //左边的颜色
int rcor;   //右边的颜色
int tag;    //左右儿子是否将要改变  1是 0否
}T[4*maxn];
int N;
int a[maxn];

void Build(int t,int l,int r)
{
T[t].l=l;
T[t].r=r;
T[t].tag=0;
T[t].lmax=0;
T[t].rmax=0;
T[t].lcor=0;
T[t].rcor=0;
T[t].maxb=0;
T[t].maxw=0;
if(l<r)
{
int mid=(l+r)/2;
Build(2*t,l,mid);
Build(2*t+1,mid+1,r);
}
return ;
}
void Change(int t)
{
T[t].lcor=T[t].lcor^1;
T[t].rcor=T[t].rcor^1;
int temp=T[t].maxb;
T[t].maxb=T[t].maxw;
T[t].maxw=temp;
T[t].tag=T[t].tag^1;
}
void Update_t(int t)
{
T[t].lcor=T[2*t].lcor;
T[t].rcor=T[2*t+1].rcor;
T[t].lmax=T[2*t].lmax;
//if(T[2*t].lcor==T[2*t].rcor && T[2*t].rcor==T[2*t+1].lcor)  一直WA在这里
//    T[t].lmax=T[2*t].lmax+T[2*t+1].lmax;
if(T[2*t].lmax==(T[2*t].r-T[2*t].l+1) && T[2*t].rcor==T[2*t+1].lcor)
T[t].lmax=T[2*t].lmax+T[2*t+1].lmax;

T[t].rmax=T[2*t+1].rmax;
if( (T[2*t+1].rmax==T[2*t+1].r-T[2*t+1].l+1) && T[2*t].rcor==T[2*t+1].lcor )
T[t].rmax=T[2*t+1].rmax+T[2*t].rmax;

T[t].maxb=max(T[2*t].maxb,T[2*t+1].maxb);
T[t].maxw=max(T[2*t].maxw,T[2*t+1].maxw);
if(T[2*t].rcor==T[2*t+1].lcor && T[2*t+1].lcor==1)
T[t].maxb=max(T[t].maxb,T[2*t].rmax+T[2*t+1].lmax);
if(T[2*t].rcor==T[2*t+1].lcor && T[2*t+1].lcor==0)
T[t].maxw=max(T[t].maxw,T[2*t].rmax+T[2*t+1].lmax);
}

void Init_T(int t)
{
if(T[t].l==T[t].r)
{
T[t].tag=0;
T[t].lmax=T[t].rmax=1;
if(a[T[t].l]==1)
{
T[t].maxw=0;
T[t].maxb=1;
T[t].lcor=T[t].rcor=1;
}
else
{
T[t].maxb=0;
T[t].maxw=1;
T[t].lcor=T[t].rcor=0;
}
return ;
}
Init_T(2*t);
Init_T(2*t+1);
Update_t(t);
return ;
}

void Update(int t,int l,int r)
{
if(T[t].l==l && T[t].r==r)
{
Change(t);
return ;
}
if(T[t].tag==1)
{
Change(2*t);
Change(2*t+1);
T[t].tag=0;
}
int mid=(T[t].l+T[t].r)/2;
if(r<=mid)
Update(2*t,l,r);
else if(l>=mid+1)
Update(2*t+1,l,r);
else
{
Update(2*t,l,mid);
Update(2*t+1,mid+1,r);
}

Update_t(t);
return ;
}

int Query(int t,int l,int r)
{
if(T[t].l==l && T[t].r==r)
return T[t].maxb;
if(T[t].tag==1)
{
Change(2*t);
Change(2*t+1);
T[t].tag=0;
}
int t1=0,t2=0,t3=0,t4=0,t5=0;
int mid=(T[t].l+T[t].r)/2;
if(r<=mid)
t1=Query(2*t,l,r);
else if(l>=mid+1)
t2=Query(2*t+1,l,r);
else
{
t3= Query(2*t,l,mid);
t4= Query(2*t+1,mid+1,r);
if(T[2*t].rcor==1 && T[2*t+1].lcor==1)
t5= min(mid-l+1,T[2*t].rmax)+min(r-mid,T[2*t+1].lmax);
}
Update_t(t);
return max(t1,max(max(t2,t3),max(t4,t5)));
}

int main()
{
int m,x,l,r;
while(scanf("%d",&N)!=EOF)
{
for(int i=1;i<=N;i++)
scanf("%d",&a[i]);
Build(1,1,N);
Init_T(1);
scanf("%d",&m);
while(m--)
{
scanf("%d %d %d",&x,&l,&r);
if(x==0)
{
int sum=Query(1,l,r);
printf("%d\n",sum);
}
else
Update(1,l,r);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: