#include <iostream>
#define N 1145141919810
#define int long long
using namespace std;
int n,q,a[10000001],d[10000001],f1[10000001],f2[10000001];//f1表示覆盖的标记,f2表示增加的标记 

void build_tree(int s,int t,int p){
    if(s == t){
        d[p] = a[s];
        f1[p]=N;
        return;
    }
    int m = (s+t)/2;
    build_tree(s,m,2*p);
    build_tree(m+1,t,2*p+1);
    d[p] = max(d[2*p],d[2*p+1]);
    f1[p]=N;
}

void pushdamn(int p){
    if (f1[p]!=N){
        f2[p*2]=0;
        f2[p*2+1]=0;
        
        d[p*2]=f1[p];
        d[p*2+1]=f1[p];

        f1[p*2]=f1[p];
        f1[p*2+1]=f1[p];

        f1[p]=N;
    }
    d[p*2]+=f2[p];
    d[p*2+1]+=f2[p];
    f2[p*2]+=f2[p];
    f2[p*2+1]+=f2[p];
    f2[p]=0;
}

void fugai(int s,int t,int p,int l,int r,int x){
    if(l <= s && t <= r){
        f1[p]=x;
        f2[p]=0;
        d[p]=x;
        return;
    }
    pushdamn(p);
    int m = (s+t)/2;
    if (l<=m)fugai(s,m,2*p,l,r,x);
    if (m<r)fugai(m+1,t,2*p+1,l,r,x);
    d[p] = max(d[2*p],d[2*p+1]);    
}

void _add(int s, int t, int p, int l, int r, int x){
    if(l <= s && t <= r){
        if (f1[p]!=N){
            f1[p]+=x;
            d[p]=f1[p];
        }else{
            f2[p]+=x;
            d[p]+=x;
        }
        return;
    }
    pushdamn(p);
    int m = (s+t)/2;
    if (l<=m)_add(s,m,2*p,l,r,x);
    if (m<r)_add(m+1,t,2*p+1,l,r,x);
    d[p] = max(d[2*p],d[2*p+1]);
}

int get_max(int s,int t,int p,int l,int r){
    if (l<=s && t<=r){
        return d[p];
    }
    pushdamn(p);
    int mid=(s+t)>>1;
    int maxx=-N;
    if (l<=mid)maxx=max(maxx,get_max(s,mid,p*2,l,r));
    if (mid<r)maxx=max(maxx,get_max(mid+1,t,p*2+1,l,r));
    return maxx;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    build_tree(1,n,1);
    while(q--){
        int op;
        cin >> op;
        if(op == 1){
            int l,r,x;
            cin >> l >> r >> x;
            fugai(1,n,1,l,r,x);
        }else if(op == 2){  
            int l,r,x;
            cin >> l >> r >> x;
            _add(1,n,1,l,r,x);
        }else if(op == 3){  
            int l,r;
            cin >> l >> r;
            cout << get_max(1,n,1,l,r) << "\n";
        } 
    }

    return 0;
}

1 comments

  • @ 2025-1-6 13:59:29

    就是 pushdamn 和 更新函数写错了

    你的正确代码

    #include <iostream>
    #define N 1145141919810000ULL 
    #define int long long
    using namespace std;
    int n,q;
    int a[10000001];
    int d[10000001];
    int f1[10000001];//f1表示覆盖的标记
    int f2[10000001];//f2表示增加的标记 
    
    void build_tree(int s,int t,int p){
    	f1[p]=N;
        if(s == t){
            d[p] = a[s];
            return;
        }
        int m = (s+t)/2;
        build_tree(s,m,2*p);
        build_tree(m+1,t,2*p+1);
        d[p] = max(d[2*p],d[2*p+1]);
    }
    
    void pushdamn(int p){
        if (f1[p]!=N){
        	d[p*2]=f1[p]+f2[p];
            d[p*2+1]=f1[p]+f2[p];
            f1[p*2]=f1[p];
            f1[p*2+1]=f1[p];
            f2[p*2]=f2[p];
            f2[p*2+1]=f2[p];
            f1[p]=N;
        }
        else
        {
        	d[p*2]+=f2[p];
    		d[p*2+1]+=f2[p];
    		f2[p*2]+=f2[p];
    		f2[p*2+1]+=f2[p];
    	}
    	f2[p]=0;
    }
    
    void fugai(int s,int t,int p,int l,int r,int x){
        if(l <= s && t <= r){
        	d[p]=x;
            f1[p]=x;
            f2[p]=0;
            return;
        }
        pushdamn(p);
        int m = (s+t)/2;
        if (l<=m)fugai(s,m,2*p,l,r,x);
        if (m<r)fugai(m+1,t,2*p+1,l,r,x);
        d[p] = max(d[2*p],d[2*p+1]);    
    }
    
    void _add(int s, int t, int p, int l, int r, int x){
        if(l <= s && t <= r){
            d[p]+=x;
            f2[p]+=x;
            return;
        }
        pushdamn(p);
        int m = (s+t)/2;
        if (l<=m)_add(s,m,2*p,l,r,x);
        if (m<r)_add(m+1,t,2*p+1,l,r,x);
        d[p] = max(d[2*p],d[2*p+1]);
    }
    
    int get_max(int s,int t,int p,int l,int r){
        if (l<=s && t<=r){
            return d[p];
        }
        pushdamn(p);
        int mid=(s+t)>>1;
        int maxx=-N;
        if (l<=mid)maxx=max(maxx,get_max(s,mid,p*2,l,r));
        if (mid<r)maxx=max(maxx,get_max(mid+1,t,p*2+1,l,r));
        return maxx;
    }
    
    signed main(){
        ios::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
        cin >> n >> q;
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
        }
        build_tree(1,n,1);
        while(q--){
            int op;
            cin >> op;
            if(op == 1){
                int l,r,x;
                cin >> l >> r >> x;
                fugai(1,n,1,l,r,x);
            }else if(op == 2){  
                int l,r,x;
                cin >> l >> r >> x;
                _add(1,n,1,l,r,x);
            }else if(op == 3){  
                int l,r;
                cin >> l >> r;
                cout << get_max(1,n,1,l,r) << "\n";
            } 
        }
    
        return 0;
    }
    
    
    
    • 1

    Information

    ID
    294
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    # Submissions
    105
    Accepted
    6
    Uploaded By