线段树样例过不了,大佬求调

P2572 [SCOI2010] 序列操作

MorLeaves @ 2024-05-08 18:03:56

#include<iostream>
#include<cstdio>
#define ls p<<1
#define rs p<<1|1
const int N=114514;
using namespace std;
int n,m,a[N],op,x,y;
struct node {
    int l,r,sum,tag1,tag2,lmax1,rmax1,lmax0,rmax0,max1,max0,len;
}tr[N<<2];
void push_up(int p)
{
    tr[p].sum=tr[ls].sum+tr[rs].sum;
    tr[p].lmax1=(tr[ls].sum==tr[ls].len)?tr[ls].sum+tr[rs].lmax1:tr[ls].lmax1;
    tr[p].rmax1=(tr[rs].sum==tr[rs].len)?tr[rs].sum+tr[ls].rmax1:tr[rs].rmax1;
    tr[p].lmax0=(tr[ls].max0==tr[ls].len)?tr[ls].len+tr[rs].lmax0:tr[ls].lmax0;
    tr[p].rmax0=(tr[rs].max0==tr[rs].len)?tr[rs].len+tr[ls].rmax0:tr[rs].rmax0;
    tr[p].max1=max(tr[ls].rmax1+tr[rs].lmax1,max(tr[ls].max1,tr[rs].max1));
    tr[p].max0=max(tr[ls].rmax0+tr[rs].lmax0,max(tr[ls].max0,tr[rs].max0));
}
void push_down(int p)
{
    if (tr[p].tag1)
    {
        tr[ls].sum=tr[ls].lmax1=tr[ls].rmax1=tr[ls].max1=tr[ls].len*(tr[p].tag1-1);
        tr[ls].lmax0=tr[ls].rmax0=tr[ls].max0=tr[ls].len*((tr[p].tag1-1)^1);
        tr[ls].tag1=tr[p].tag1;
        tr[rs].sum=tr[rs].lmax1=tr[rs].rmax1=tr[rs].max1=tr[rs].len*(tr[p].tag1-1);
        tr[rs].lmax0=tr[rs].rmax0=tr[rs].max0=tr[rs].len*((tr[p].tag1-1)^1);
        tr[rs].tag1=tr[p].tag1;
        tr[p].tag1=tr[ls].tag2=tr[rs].tag2=0;
    }
    if (tr[p].tag2)
    {
        tr[ls].sum=tr[ls].len-tr[ls].sum;
        swap(tr[ls].lmax1,tr[ls].lmax0);
        swap(tr[ls].rmax1,tr[ls].rmax0);
        swap(tr[ls].max1,tr[ls].max0);
        if (tr[ls].tag1==1)
        {
            tr[ls].tag1=2;
        }
        else if (tr[ls].tag1==2)
        {
            tr[ls].tag1=1;
        }
        else
        {
            tr[ls].tag2^=1;
        }
        tr[rs].sum=tr[rs].len-tr[rs].sum;
        swap(tr[rs].lmax1,tr[rs].lmax0);
        swap(tr[rs].rmax1,tr[rs].rmax0);
        swap(tr[rs].max1,tr[rs].max0);
        if (tr[rs].tag1==1)
        {
            tr[rs].tag1=2;
        }
        else if (tr[rs].tag1==2)
        {
            tr[rs].tag1=1;
        }
        else
        {
            tr[rs].tag2^=1;
        }
        tr[p].tag2=0;
    }
}
void build(int s,int t,int p)
{
    tr[p].l=s;
    tr[p].r=t;
    tr[p].len=t-s+1;
    if (s==t)
    {
        tr[p].sum=tr[p].lmax1=tr[p].rmax1=tr[p].max1=a[s];
        tr[p].lmax0=tr[p].rmax0=tr[p].max0=(a[s]^1);
        return ;
    }
    int mid=s+((t-s)>>1);
    build(s,mid,ls);
    build(mid+1,t,rs);
    push_up(p);
}
void upd1(int s,int t,int p)
{
    if (s<=tr[p].l&&tr[p].r<=t)
    {
        tr[p].sum=tr[p].lmax1=tr[p].rmax1=tr[p].max1=0;
        tr[p].lmax0=tr[p].rmax0=tr[p].max0=tr[p].len;
        tr[p].tag1=1;
        tr[p].tag2=0;
        return ;
    }
    push_down(p);
    int mid=tr[p].l+((tr[p].r-tr[p].l)>>1);
    if (s<=mid)
    {
        upd1(s,t,ls);
    }
    if (t>mid)
    {
        upd1(s,t,rs);
    }
    push_up(p);
}
void upd2(int s,int t,int p)
{
    if (s<=tr[p].l&&tr[p].r<=t)
    {
        tr[p].sum=tr[p].lmax1=tr[p].rmax1=tr[p].max1=tr[p].len;
        tr[p].lmax0=tr[p].rmax0=tr[p].max0=0;
        tr[p].tag1=2;
        tr[p].tag2=0;
        return ;
    }
    push_down(p);
    int mid=tr[p].l+((tr[p].r-tr[p].l)>>1);
    if (s<=mid)
    {
        upd2(s,t,ls);
    }
    if (t>mid)
    {
        upd2(s,t,rs);
    }
    push_up(p);
}
void upd3(int s,int t,int p)
{
    if (s<=tr[p].l&&tr[p].r<=t)
    {
        tr[p].sum=tr[p].len-tr[p].sum;
        swap(tr[p].lmax1,tr[p].lmax0);
        swap(tr[p].rmax1,tr[p].rmax0);
        swap(tr[p].max1,tr[p].max0);
        if (tr[p].tag1==1)
        {
            tr[p].tag1=2;
        }
        else if (tr[p].tag1==2)
        {
            tr[p].tag1=1;
        }
        else
        {
            tr[p].tag2=!tr[p].tag2;
        }
        return ;
    }
    push_down(p);
    int mid=tr[p].l+((tr[p].r-tr[p].l)>>1);
    if (s<=mid)
    {
        upd3(s,t,ls);
    }
    if (t>mid)
    {
        upd3(s,t,rs);
    }
    push_up(p);
}
int getsum(int s,int t,int p)
{
    if (s<=tr[p].l&&tr[p].r<=t)
    {
        return tr[p].sum;
    }
    push_down(p);
    int mid=tr[p].l+((tr[p].r-tr[p].l)>>1),ans=0;
    if (s<=mid)
    {
        ans+=getsum(s,t,ls);
    }
    if (t>mid)
    {
        ans+=getsum(s,t,rs);
    }
    return ans;
}
int getmaxn(int s,int t,int p)
{
    if (s<=tr[p].l&&tr[p].r<=t)
    {
        return tr[p].max1;
    }
    push_down(p);
    int mid=tr[p].l+((tr[p].r-tr[p].l)>>1),ans=-2147483647;
    if (s<=mid)
    {
        ans=max(ans,getmaxn(s,t,ls));
    }
    if (t>mid)
    {
        ans=max(ans,getmaxn(s,t,rs));
    }
    return ans;
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    build(1,n,1);
    while(m--)
    {
        scanf("%d %d %d",&op,&x,&y);
        x++,y++;
        if (op==0)
        {
            upd1(x,y,1);
        }
        else if (op==1)
        {
            upd2(x,y,1);
        }
        else if (op==2)
        {
            upd3(x,y,1);
        }
        else if (op==3)
        {
            printf("%d\n",getsum(x,y,1));
        }
        else
        {
            printf("%d\n",getmaxn(x,y,1));
        }
    }
    return 0;
}

by ydkxj @ 2024-05-08 18:20:41

wc %%% bx/


by luxiaomao @ 2024-09-05 21:42:14

@MorLeaves 您写的题我四个月后才写啊 /bx


by MorLeaves @ 2024-09-05 22:27:45

@luxiaomao 给我假


|