10pts救救孩子吧

P2572 [SCOI2010] 序列操作

fly_me_2_the_moon @ 2020-11-10 22:29:01

#include<bits/stdc++.h>
#define ll long long
#define ri register int
#define mid ((l+r)>>1)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define maxn 500000
using namespace std;
ll read()
{
    ll x=0,f=1;char c=getchar();
    while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
    while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
    return f*x;
}
inline void print(ll x)
{
    static ll cnt;
    static ll a[15];
    cnt=0;
    do
    {
        a[++cnt]=x%10;
        x/=10;
    }while(x);
    for(ll i=cnt;i>=1;i--)putchar(a[i]+'0');
    puts("");
}
ll n,m,x,y,op,res;
ll w[maxn];
struct tywl
{
    ll a[3],l[3],r[3],sa,len,laz,fa;
}t[maxn];
inline void up1(ll rt)
{
    t[rt].sa=t[rt<<1].sa+t[rt<<1|1].sa;
    for(int i=0;i<=1;i++)
    {
        t[rt].l[i]=t[rt<<1].l[i];
        if(i==1&&t[rt<<1].sa==t[rt<<1].len)
            t[rt].l[1]=t[rt<<1].sa+t[rt<<1|1].l[1];
        else if(i==0&&t[rt<<1].sa==0)
            t[rt].l[0]=t[rt<<1].len+t[rt<<1|1].l[0];
        t[rt].r[i]=t[rt<<1|1].r[i];
        if(i==1&&t[rt<<1|1].sa==t[rt<<1|1].len)
            t[rt].r[1]=t[rt<<1|1].sa+t[rt<<1].r[1];
        else if(i==0&&t[rt<<1|1].sa==0)
            t[rt].r[0]=t[rt<<1|1].len+t[rt<<1].r[0];
        t[rt].a[i]=max(t[rt<<1].r[i]+t[rt<<1|1].l[i],max(t[rt<<1].a[i],t[rt<<1|1].a[i]));
    }
}
inline void pd(ll rt,ll l,ll r)
{
    if(t[rt].laz!=-1)
    {
        //cout<<23333<<" "<<l<<" "<<r<<" "<<t[rt].laz<<" "<<t[rt].sa<<endl;
        t[rt].fa=0;
        ll za=t[rt].laz;
        t[rt<<1].sa=t[rt<<1].len*za,t[rt<<1|1].sa=t[rt<<1|1].len*za;
        t[rt<<1].laz=t[rt<<1|1].laz=za;
        t[rt<<1].fa=t[rt<<1|1].fa=0;
        t[rt<<1].a[za]=t[rt<<1].l[za]=t[rt<<1].r[za]=t[rt<<1].len;
        t[rt<<1].a[za^1]=t[rt<<1].l[za^1]=t[rt<<1].r[za^1]=0;
        t[rt<<1|1].a[za]=t[rt<<1|1].l[za]=t[rt<<1|1].r[za]=t[rt<<1].len;
        t[rt<<1|1].a[za^1]=t[rt<<1|1].l[za^1]=t[rt<<1|1].r[za^1]=0;
        t[rt].laz=-1;
    }
    else if(t[rt].fa!=0)
    {
        t[rt<<1].sa=t[rt<<1].len-t[rt<<1].sa;
        t[rt<<1|1].sa=t[rt<<1|1].len-t[rt<<1|1].sa;
        if(t[rt<<1].laz!=-1)
            t[rt<<1].laz^=1;
        else
            t[rt<<1].fa^=1;
        if(t[rt<<1|1].laz!=-1)
            t[rt<<1|1].laz^=1;
        else
            t[rt<<1|1].fa^=1;
        swap(t[rt<<1].a[1],t[rt<<1].a[0]);
        swap(t[rt<<1].l[1],t[rt<<1].l[0]);
        swap(t[rt<<1].r[1],t[rt<<1].r[0]);
        swap(t[rt<<1|1].a[1],t[rt<<1|1].a[0]);
        swap(t[rt<<1|1].l[1],t[rt<<1|1].l[0]);
        swap(t[rt<<1|1].r[1],t[rt<<1|1].r[0]);
        t[rt].fa=0;
    }
}
inline void build(ll rt,ll l,ll r)
{
    t[rt].len=r-l+1,t[rt].laz=-1;
    if(l==r)
    {
        t[rt].sa=w[l];
        t[rt].a[1]=t[rt].l[1]=t[rt].r[1]=t[rt].sa==1;
        t[rt].a[0]=t[rt].l[0]=t[rt].r[0]=t[rt].sa==0;
        t[rt].fa=0,t[rt].laz=-1;

        return ;
    }
    build(rson);
    build(lson);
    up1(rt);
    return ;
}
inline void up(ll rt,ll l,ll r,ll L,ll R,ll x2)
{
    pd(rt,l,r);
    if(L<=l&&r<=R)
    {
        if(x2==1||x2==0)
        {
            t[rt].sa=t[rt].len*x2;
            t[rt].laz=x2;
            t[rt].a[x2]=t[rt].l[x2]=t[rt].r[x2]=t[rt].len;
            t[rt].a[x2^1]=t[rt].l[rt]=t[rt].r[x2^1]=0;
        }
        else
        {
            t[rt].sa=t[rt].len-t[rt].sa;
            t[rt].fa^=1;
            swap(t[rt].a[1],t[rt].a[0]);
            swap(t[rt].l[1],t[rt].l[0]);
            swap(t[rt].r[1],t[rt].r[0]);
        }
        return ;
    }
    if(L<=mid)
        up(lson,L,R,x2);
    if(R>mid)
        up(rson,L,R,x2);
    up1(rt);
}
inline ll que(ll rt,ll l,ll r,ll L,ll R)
{
    pd(rt,l,r);
    if(l==L&&r==R)
        return t[rt].sa;
    else if(mid<L)
        return que(rson,L,R);
    else if(R<=mid)
        return que(lson,L,R);
    else
        return que(lson,L,mid)+que(rson,mid+1,R);
}
inline tywl que1(ll rt,ll l,ll r,ll L,ll R)
{
    pd(rt,l,r);
    if(L==l&&r==R)
        return t[rt];
    if(R<=mid)
        return que1(lson,L,R);
    else if(L>mid)
        return que1(rson,L,R);
    else
    {
        tywl c,a=que1(lson,L,mid),b=que1(rson,mid+1,R);
        c.sa=a.sa+b.sa;
        for(int i=0;i<=1;i++)
        {
            c.l[i]=a.l[i];
            if(i==1&&a.sa==a.len)
                c.l[1]=a.sa+b.l[1];
            else if(i==0&&a.sa==0)
                c.l[0]=a.len+b.l[0];
            c.r[i]=b.r[i];
            if(i==1&&b.sa==b.len)
                c.r[1]=b.sa+a.r[1];
            else if(i==0&&b.sa==0)
                c.r[0]=b.len+a.r[0];
            c.a[i]=max(b.l[i]+a.r[i],max(a.a[i],b.a[i]));
            //cout<<l<<" "<<r<<" "<<c.a[i]<<" "<<c.r[i]<<" "<<c.l[i]<<" "<<a.a[i]<<" "<<b.a[i]<<" "<<a.l[i]<<" "<<b.r[i]<<endl;
        }
        return c;
    }
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++)
        w[i]=read();
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        op=read(),x=read(),y=read();
        x++,y++;
        if(op==0)
            up(1,1,n,x,y,0);    
        else if(op==1)
            up(1,1,n,x,y,1);
        else if(op==2)
            up(1,1,n,x,y,2);
        else if(op==3)
            cout<<que(1,1,n,x,y)<<endl; 
        else if(op==4)
            cout<<que1(1,1,n,x,y).a[1]<<endl;       
    }
}

by Purple_wzy @ 2020-11-10 23:31:56

再查查up函数吧,rt和x2貌似混了的说。。


by Purple_wzy @ 2020-11-10 23:32:20

@fly_me_2_the_moon


by fly_me_2_the_moon @ 2020-11-11 14:52:24

@Purple_wzy 谢谢dalao,已过


|