请问这题为什么我开4倍空间过不去,8倍能过
查看原帖
请问这题为什么我开4倍空间过不去,8倍能过
886832
legend2003楼主2024/10/16 16:51
#include<bits/stdc++.h>
using namespace std;
const char n1='\n',n2=' ';
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,n,a) for (int i=n;i>=a;i--)
#define de1(a) cout<<#a<<" = "<<a<<n1;
#define de2(a) cout<<#a<<" = "<<a<<n2;
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define all1(x) (x).begin()+1,(x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
#define sz0(x) sz(x)-1
#define me(a,x) memset(a,x,sizeof(a))
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<bool> vb;
typedef vector<double> vd;
typedef vector<string> vs;
typedef pair<int,int> pii;
typedef map<ll,ll> mll;
typedef pair<ll,ll> pll;
typedef map<int,int> mii;
const int N=200010;
struct info{
    int pre[2];
    int suf[2];
    int mx[2];
    int sum[2];
    int tot;
    bool ept;
    info(){ept=true;}
    info operator +(const info &b)const{
        if(ept)return b;
        if(b.ept)return *this;
        info ret;
        ret.ept=false;
        ret.tot=tot+b.tot;
        rep(i,0,1){
            ret.sum[i]=sum[i]+b.sum[i];
            ret.pre[i]=pre[i]+(pre[i]==tot?b.pre[i]:0);
            ret.suf[i]=b.suf[i]+(b.suf[i]==b.tot?suf[i]:0);
            ret.mx[i]=max({mx[i],b.mx[i],suf[i]+b.pre[i]});
        }
        return ret;
    } 
};
int a[N];
struct sgt{
    #define mid (l+r>>1)
    #define ls u<<1
    #define rs u<<1|1
    #define up(u) tr[u]=tr[ls]+tr[rs]
    int n;
    vector<info> tr;
    vi tag,re;
    sgt(int n):n(n),tr(n<<3),re(n<<3),tag(n<<3,-1){}
    void bd(int u,int l,int r){
        if(l==r){
            tr[u].tot=1;
            tr[u].ept=false;
            int t=a[l];
            rep(i,0,1){
                tr[u].pre[i]=tr[u].suf[i]=tr[u].mx[i]=tr[u].sum[i]=(i==t);
            }
            return;
        }
        bd(ls,l,mid);
        bd(rs,mid+1,r);
        up(u);
    }
    void take(int u,int c){
        if(c==0||c==1){
            tr[u].sum[c]=tr[u].mx[c]=tr[u].pre[c]=tr[u].suf[c]=tr[u].tot;
            tr[u].sum[c^1]=tr[u].mx[c^1]=tr[u].pre[c^1]=tr[u].suf[c^1]=0;
            tag[u]=c;
            re[u]=0;
        }
        else{
            swap(tr[u].pre[0],tr[u].pre[1]);
            swap(tr[u].suf[0],tr[u].suf[1]);
            swap(tr[u].sum[0],tr[u].sum[1]);
            swap(tr[u].mx[0],tr[u].mx[1]);
            if(tag[u]!=-1){
                tag[u]^=1;
            }
            else{
                re[u]^=1;
            }
        }
    }
    void pd(int u){
        if(tag[u]!=-1){
            take(ls,tag[u]);
            take(rs,tag[u]);
            re[u]=0;
            tag[u]=-1;
        }
        if(re[u]){
            take(ls,2);
            take(rs,2);
            re[u]=0;
        }
    }
    void modify(int u,int l,int r,int ql,int qr,int c){
        pd(u);
        if(l>=ql&&r<=qr){
            take(u,c);
            return;
        }
        if(ql<=mid){
            modify(ls,l,mid,ql,qr,c);
        }
        if(mid<qr){
            modify(rs,mid+1,r,ql,qr,c);
        }
        up(u);
    }
    info query(int u,int l,int r,int ql,int qr){
        if(l>=ql&&r<=qr){
            return tr[u];
        }
        pd(u);
        info ret;
        if(ql<=mid){
            ret=query(ls,l,mid,ql,qr);
        }
        if(mid<qr){
            ret=ret+query(rs,mid+1,r,ql,qr);
        }
        return ret;
    }
};
void solve(){ 
    int n,q;
    cin>>n>>q;
    rep(i,1,n)cin>>a[i];
    sgt tr(n);
    tr.bd(1,1,n);
    while(q--){
        int op,l,r;
        cin>>op>>l>>r;
        l++,r++;
        if(op<=2){
            tr.modify(1,1,n,l,r,op);
        }
        else{
            int res;
            if(op==3){
                res=tr.query(1,1,n,l,r).sum[1];
            }
            else{
                res=tr.query(1,1,n,l,r).mx[1];
            }
            cout<<res<<n1;
        }
    }
}   
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T=1;
    // cin>>T;
    while(T--)solve();
    return 0;
}                                                             

代码风格不是很好,希望大佬别拷打马蜂

2024/10/16 16:51
加载中...