P2572 求助!
  • 板块学术版
  • 楼主lijunxi_luqiao
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/13 14:37
  • 上次更新2024/8/13 16:27:16
查看原帖
P2572 求助!
1006406
lijunxi_luqiao楼主2024/8/13 14:37

温馨提示:本人蒟蒻
同学给我推荐的题,写完之后116行满江红本人测试点

本人代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005],tree[3][500005],add[500005];
void pushup(int rt)
{
    tree[0][rt]=tree[0][rt<<1]+tree[0][rt<<1|1];
    tree[1][rt]=max(tree[1][rt<<1],tree[1][rt<<1|1]);
    tree[2][rt]=max(tree[2][rt<<1],tree[2][rt<<1|1]);
}
void pushdown(int rt,int len)
{
    if(add[rt]==0)
    {
        tree[0][rt<<1]=tree[0][rt<<1|1]=
        tree[1][rt<<1]=tree[1][rt<<1|1]=0,
        tree[2][rt<<1]=tree[2][rt<<1|1]=len,
        add[rt]=-1,add[rt<<1]=add[rt<<1|1]=0;
    }
    if(add[rt]==1)
    {
        tree[0][rt<<1]=tree[1][rt<<1]=
        tree[0][rt<<1|1]=tree[1][rt<<1|1]=len,
        tree[2][rt<<1]=tree[2][rt<<1|1]=0,
        add[rt]=-1,add[rt<<1]=add[rt<<1|1]=1;
    }
    if(add[rt]==2)
    {
        tree[0][rt<<1]=(len+1>>1)-tree[0][rt<<1],
        tree[0][rt<<1|1]=(len>>1)-tree[0][rt<<1|1],
        add[rt<<1]=add[rt<<1|1]=2,add[rt]=-1;
        swap(tree[1][rt<<1],tree[2][rt<<1]);
        swap(tree[1][rt<<1|1],tree[2][rt<<1|1]);
    }
}
void build(int l,int r,int rt)
{
    if(l==r)
    {
        tree[0][rt]=tree[1][rt]=a[l],tree[2][rt]=!a[l];
        return ;
    }
    int mid=l+r>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
    pushup(rt);
}
void update(int ul,int ur,int k,int l,int r,int rt)
{
    if(ul<=l&&ur>=r)
    {
        if(k==0||k==1)
            tree[0][rt]=tree[1][rt]=k*(r-l+1),
            tree[2][rt]=!k*(r-l+1),add[rt]=k;
        else if(k==2)
        {
            tree[0][rt]=r-l+1-tree[0][rt],add[rt]=k;
            swap(tree[1][rt],tree[2][rt]);
        }
        return ;
    }
    int mid=l+r>>1;
    pushdown(rt,r-l+1);
    if(ul<=mid)
        update(ul,ur,k,l,mid,rt<<1);
    if(ur>mid)
        update(ul,ur,k,mid+1,r,rt<<1|1);
    pushup(rt);
}
int query3(int ql,int qr,int l,int r,int rt)
{
    if(ql<=l&&qr>=r)
        return tree[0][rt];
    int mid=l+r>>1,cnt=0;
    pushdown(rt,r-l+1);
    if(ql<=mid)
        cnt+=query3(ql,qr,l,mid,rt<<1);
    if(qr>mid)
        cnt+=query3(ql,qr,mid+1,r,rt<<1|1);
    return cnt;
}
int query4(int ql,int qr,int l,int r,int rt)
{
    if(ql<=l&&qr>=r)
        return tree[1][rt];
    int mid=l+r>>1,cnt=INT_MIN;
    pushdown(rt,r-l+1);
    if(ql<=mid)
        cnt=max(cnt,query4(ql,qr,l,mid,rt<<1));
    if(qr>mid)
        cnt=max(cnt,query4(ql,qr,mid+1,r,rt<<1|1));
    return cnt;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    memset(add,-1,sizeof(add));
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    build(1,n,1);
    for(int i=1;i<=m;i++)
    {
        int op,x,y;
        cin>>op>>x>>y;
        switch(op)
        {
            case 0:update(x,y,0,1,n,1);break;
            case 1:update(x,y,1,1,n,1);break;
            case 2:update(x,y,2,1,n,1);break;
            case 3:cout<<query3(x,y,1,n,1)<<'\n';break;
            case 4:cout<<query4(x,y,1,n,1)<<'\n';break;
            default :break;
        }
    }
    return 0;
}

望相助!

2024/8/13 14:37
加载中...