- 扶苏的问题
- 60wa
- @ 2024-12-31 13:51:56
#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
- 
   C23panweiming LV 6 @ 2025-1-6 13:59:29Edited C23panweiming LV 6 @ 2025-1-6 13:59:29Edited就是 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
 
      