样例没过,玄关

P2572 [SCOI2010] 序列操作

xgw120121 @ 2024-07-07 13:30:43

#include<bits/stdc++.h>
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;
int n,m,opt,x,y;
int a[100010];
struct node
{
    int sum,lazy,rev;
    int ans[5],l[5],r[5];
}t[100010<<2];
void pushup(int id,int l,int r)
{
    int mid=l+r>>1;
    t[id].sum=t[ls].sum+t[rs].sum;
    for(int i=0;i<=1;i++)
    {
        t[id].l[i]=t[ls].l[i];t[id].r[i]=t[rs].r[i];
        if(i==1&&t[ls].sum==mid-l+1) t[id].l[i]+=t[rs].l[i];
        if(i==0&&t[ls].sum==0) t[id].l[i]+=t[rs].l[i];
        if(i==1&&t[rs].sum==r-mid) t[id].r[i]+=t[ls].r[i];
        if(i==0&&t[rs].sum==0) t[id].r[i]+=t[ls].r[i];
        t[id].ans[i]=max(t[ls].ans[i],t[rs].ans[i]);
        t[id].ans[i]=max(t[id].ans[i],t[ls].r[i]+t[rs].l[i]);
    }
}
void pushdown(int id,int l,int r)
{
    int mid=l+r>>1;
    if(t[id].lazy!=-1)
    {
        t[id].rev=0;
        int tag=t[id].lazy;
        t[ls].sum=(mid-l+1)*tag;
        t[rs].sum=(r-mid)*tag;
        t[ls].lazy=t[rs].lazy=tag;
        t[ls].rev=t[rs].rev=0;
        t[ls].ans[tag]=t[ls].l[tag]=t[ls].r[tag]=(mid-l+1);
        t[rs].ans[tag]=t[rs].l[tag]=t[rs].r[tag]=(r-mid);
        tag^=1;
        t[ls].ans[tag]=t[ls].l[tag]=t[ls].r[tag]=0;
        t[rs].ans[tag]=t[rs].l[tag]=t[rs].r[tag]=0;
        tag^=1;
        t[id].lazy=-1;
    }
    if(t[id].rev)
    {
        t[ls].sum=mid-l+r-t[ls].sum;
        t[rs].sum=r-mid-t[rs].sum;
        if(t[ls].lazy!=-1) t[ls].lazy^=1;
        if(t[rs].lazy!=-1) t[rs].lazy^=1;
        swap(t[ls].ans[0],t[ls].ans[1]);
        swap(t[ls].l[0],t[ls].l[1]);
        swap(t[ls].r[0],t[ls].r[1]);
        swap(t[rs].ans[0],t[rs].ans[1]);
        swap(t[rs].l[0],t[rs].l[1]);
        swap(t[rs].r[0],t[rs].r[1]);
        t[id].rev=0;
    }
}
void build(int id,int l,int r)
{
    t[id].lazy=-1;
    if(l==r)
    {
        cin>>a[l];
        t[id].sum=(a[l]==1);
        t[id].ans[0]=t[id].l[0]=t[id].r[0]=(a[l]==0);
        t[id].ans[1]=t[id].l[1]=t[id].r[1]=(a[l]==1);
        return;
    }
    int mid=l+r>>1;
    build(ls,l,mid);build(rs,mid+1,r);
    pushup(id,l,r);
}
void update(int id,int l,int r)
{
    pushdown(id,l,r);
    if(x<=l&&r<=y)
    {
        if(opt<=1)
        {
            t[id].sum=(r-l+1)*opt;
            t[id].lazy=opt;
            t[id].ans[0]=t[id].l[0]=t[id].r[0]=(r-l+1)*(opt==0);
            t[id].ans[1]=t[id].l[1]=t[id].r[1]=(r-l+1)*(opt==1);
        }
        else
        {
            t[id].sum=(r-l+1)-t[id].sum;
            t[id].rev^=1;
            swap(t[id].ans[0],t[id].ans[1]);swap(t[id].l[0],t[id].l[1]);swap(t[id].r[0],t[id].r[1]);
        }
        return;
    }
    int mid=l+r>>1;
    if(x<=mid) update(ls,l,mid);
    if(mid+1<=y) update(rs,mid+1,r);
    pushup(id,l,r);
}
int query_sum(int id,int l,int r)
{
    pushdown(id,l,r);
    if(x<=l&&r<=y) return t[id].sum;
    int mid=l+r>>1,ans=0;
    if(x<=mid) ans+=query_sum(ls,l,mid);
    if(mid+1<=y) ans+=query_sum(rs,mid+1,r);
//  pushup(id,l,r);
    return ans;
}
node query_tree(int id,int l,int r)
{
    pushdown(id,l,r);
    if(x<=l&&r<=y) return t[id];
    int mid=l+r>>1;
    if(y<=mid) return query_tree(ls,l,mid);
      else if(mid+1<=x) return query_tree(rs,mid+1,r);
        else
        {
            node tree,lt=query_tree(ls,l,mid),rt=query_tree(rs,mid+1,r);
            for(int i=0;i<=1;i++)
            {
                tree.l[i]=lt.l[i];tree.r[i]=rt.r[i];
                if(i==1&&lt.sum==mid-l+1) tree.l[i]+=rt.l[i];
                if(i==0&&lt.sum==0) tree.l[i]+=rt.l[i];
                if(i==1&&rt.sum==r-mid) tree.r[i]+=lt.r[i];
                if(i==0&&rt.sum==0) tree.r[i]+=lt.r[i];
                tree.ans[i]=max(lt.ans[i],rt.ans[i]);
                tree.ans[i]=max(tree.ans[i],lt.r[i]+rt.l[i]);
            }   
            return tree;
        } 
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    build(1,1,n);
    while(m--)
    {
        cin>>opt>>x>>y;
        if(opt<=2) update(1,1,n);
          else if(opt==3) cout<<query_sum(1,1,n)<<'\n';
            else cout<<query_tree(1,1,n).ans[1]<<'\n';
    }
}

by xgw120121 @ 2024-07-07 13:31:05

@xgw120121 拜托了


|