HDU 3911

来源:互联网 发布:win10笔记本必备软件 编辑:程序博客网 时间:2024/04/29 09:56

  在这题上我WA了无数次。。。。。。

题意大概: 给你一个只包含1和0的长度为N的数列。。

        然后有M个操作   每个操作前包含一个0或者1 然后是I J

   如果是1就是把区间[i,j]内的所有0变成1所有1变成0

 然后0就是询问区间[i,j]内最多有多少个连续的1




思路:建立一个长度为n的结构体。结构体内要存 从前开始算有多少个0 有多少个1 从后算有多少个0 有多少个1 还有就是该区间内最多的连续个1和连续个0

      然后就是根据区间更新的思想来做。。。。。

贴上代码。。。

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int m,k;struct tree{   int left;   int right;   int lm0,lm1,mm0,mm1,rm0,rm1;   int ss;   int cishu;   int flag;   int lazy;}tree[400000];void inset(int inst,int le,int ri){    tree[inst].left=le;    tree[inst].right=ri;    tree[inst].lm0=0;    tree[inst].lm1=0;    tree[inst].rm1=0;    tree[inst].rm0=0;    tree[inst].mm1=0;    tree[inst].mm0=0;    tree[inst].ss=2;    tree[inst].cishu=0;    tree[inst].flag=0;    tree[inst].lazy=0;    if(le==ri) return ;    int mid=(le+ri)>>1;    inset(2*inst,le,mid);    inset(2*inst+1,mid+1,ri);}void add(int inst,int k,int l){  //cout<<tree[2].left<<endl;    if(k!=tree[inst].ss)    {tree[inst].cishu++;    }    if(tree[inst].cishu==1)    {  tree[inst].ss=k;        if(k==1)        {            tree[inst].lm1++;            tree[inst].mm1++;            tree[inst].rm1++;        }        else        {            tree[inst].lm0++;            tree[inst].mm0++;            tree[inst].rm0++;        }    }    else if(k!=tree[inst].ss)        {           tree[inst].ss=k;           if(k==1)          { tree[inst].mm1=max(tree[inst].mm1,tree[inst].rm1);              tree[inst].rm1=1;              tree[inst].rm0=0;              tree[inst].mm1=max(tree[inst].mm1,tree[inst].rm1);          }          else {                tree[inst].mm0=max(tree[inst].mm0,tree[inst].rm0);                tree[inst].rm0=1;                tree[inst].rm1=0;                tree[inst].mm0=max(tree[inst].mm0,tree[inst].rm0);                }    }    else if(k==tree[inst].ss)    {        if(k==1)        {tree[inst].rm1++;        tree[inst].mm1=max(tree[inst].mm1,tree[inst].rm1);        }        else {tree[inst].rm0++;        tree[inst].mm0=max(tree[inst].mm0,tree[inst].rm0);        }    }    if(tree[inst].left==tree[inst].right) return ;    int mid=(tree[inst].left+tree[inst].right)>>1;    if(l<=mid)        add(2*inst,k,l);    else add(2*inst+1,k,l);}void lazy(int inst){    swap(tree[inst].lm1,tree[inst].lm0);        swap(tree[inst].mm1,tree[inst].mm0);        swap(tree[inst].rm1,tree[inst].rm0);}void flag(int inst){  //cout<<inst<<"   1"<<endl;       //cout<<inst<<endl;        //return ;         tree[inst].flag=0;         if(tree[2*inst].flag!=0)           flag(2*inst);           if(tree[2*inst+1].flag!=0)              flag(2*inst+1);              //cout<<inst<<endl;        tree[inst].lm1=tree[2*inst].lm1;       //cout<<"lm1 "<<tree[inst].lm1<<" "<<tree[2*inst].lm1<<endl;       tree[inst].lm0=tree[2*inst].lm0;      //cout<<"lm0 "<<tree[inst].lm0<<" "<<tree[2*inst].lm0<<endl;       tree[inst].rm1=tree[2*inst+1].rm1;     //cout<<"rm1 "<<tree[inst].rm1<<" "<<tree[2*inst+1].rm1<<endl;       tree[inst].rm0=tree[2*inst+1].rm0;      //cout<<"rm0 "<<tree[inst].rm0<<" "<<tree[2*inst+1].rm0<<endl;        tree[inst].mm1=max(tree[2*inst].mm1,max(tree[2*inst+1].mm1,tree[2*inst].rm1+tree[2*inst+1].lm1));        tree[inst].mm0=max(tree[2*inst].mm0,max(tree[2*inst+1].mm0,tree[2*inst].rm0+tree[2*inst+1].lm0));        if(tree[2*inst].lm1==(tree[2*inst].right-tree[2*inst].left+1))              tree[inst].lm1=tree[2*inst].lm1+tree[2*inst+1].lm1;        if(tree[2*inst].lm0==(tree[2*inst].right-tree[2*inst].left+1))              tree[inst].lm0=tree[2*inst].lm0+tree[2*inst+1].lm0;        if(tree[2*inst+1].rm1==(tree[2*inst+1].right-tree[2*inst+1].left+1))             tree[inst].rm1=tree[2*inst].rm1+tree[2*inst+1].rm1;        if(tree[2*inst+1].rm0==(tree[2*inst+1].right-tree[2*inst+1].left+1))             tree[inst].rm0=tree[2*inst].rm0+tree[2*inst+1].rm0;}void fz(int inst,int le,int ri){    if(tree[inst].left==le&&tree[inst].right==ri)    {     //cout<<le<<" "<<ri<<endl;          if(tree[inst].flag!=0)           flag(inst);           lazy(inst);           //cout<<inst<<" "<<tree[inst].mm1<<endl;        tree[inst].lazy++;        return ;    }    else if(tree[inst].left==tree[inst].right) return ;    else       {   //cout<<inst<<endl;           //cout<<le<<" "<<ri<<endl;           //cout<<tree[inst].left<<" "<<tree[inst].right<<endl;           tree[inst].flag=1;       }    if(tree[inst].lazy%2==1)    {        lazy(2*inst);lazy(2*inst+1);        tree[2*inst].lazy+=tree[inst].lazy;        tree[2*inst+1].lazy+=tree[inst].lazy;        tree[inst].lazy=0;    }    else tree[inst].lazy=0;    int mid=(tree[inst].left+tree[inst].right)>>1;   if(ri<=mid)    fz(2*inst,le,ri);   else if(le>mid)    fz(2*inst+1,le,ri);   else   {       fz(2*inst,le,mid);       fz(2*inst+1,mid+1,ri);   }}void query(int inst,int le,int ri){    if(tree[inst].left==le&&tree[inst].right==ri)    {   //cout<<inst<<" "<<tree[inst].mm1<<" "<<tree[inst].flag<<endl;        if(tree[inst].flag!=0)        flag(inst);      //cout<<1<<endl;        if(tree[inst].mm1==(ri-le+1))        {            m=max(m,k+tree[inst].mm1);            k+=tree[inst].mm1;        }        else        {            m=max(max(m,tree[inst].mm1),k+tree[inst].lm1);            k=tree[inst].rm1;        }        return ;    }    else if(tree[inst].left==tree[inst].right)    {  if(le>=tree[inst].left&&le<=tree[inst].right||ri<=tree[inst].right&&ri>=tree[inst].left)        m=tree[inst].mm1;return ;    }    if(tree[inst].lazy%2==1)    {        lazy(2*inst);lazy(2*inst+1);        tree[2*inst].lazy+=tree[inst].lazy;        tree[2*inst+1].lazy+=tree[inst].lazy;        tree[inst].lazy=0;    }    else tree[inst].lazy=0;    int mid=(tree[inst].left+tree[inst].right)>>1;    if(ri<=mid)        query(2*inst,le,ri);    else if(le>mid)        query(2*inst+1,le,ri);    else    {        query(2*inst,le,mid);        query(2*inst+1,mid+1,ri);    }}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {   int a;       inset(1,1,n);       for(int i=1;i<=n;i++)        {            scanf("%d",&a);            add(1,a,i);        } /*for(int i=1;i<=7;i++)        cout<<tree[i].flag<<endl;*/        int h;        scanf("%d",&h);        //cout<<h<<endl;        while(h--)        {            int x,t,y;            scanf("%d%d%d",&x,&t,&y);           // cout<<x<<" "<<t<<" "<<y<<" "<<h<<endl;            if(x==1)                fz(1,t,y);            else            {                m=0;k=0;                query(1,t,y);                printf("%d\n",m);            }        }     //   for(int i=1;i<=7;i++)   // cout<<tree[i].left<<" "<<tree[i].right<<" "<<tree[i].mm1<<" "<<tree[i].flag<<" "<<tree[i].lm1<<" "<<tree[i].rm1<<" "<<tree[i].mm0<<" "<<tree[i].lm0<<" "<<tree[i].rm0<<endl;    }}


  

原创粉丝点击