40pts疑似线段树打错求调
查看原帖
40pts疑似线段树打错求调
1134686
_me_楼主2025/2/4 20:04
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll M = 1e6 + 5, X = 5e9;
ll n, m, s[M], d, x, y, c;
struct Node{
    ll h, sum, qfg, mx = -M;
}t[4 * M];
void Build(ll a, ll b, ll num){
    t[num].qfg = -X;
    if(a == b){
        t[num].h = s[a];
        return;
    }ll m = (a + b) / 2;
    Build(a, m, num * 2);
    Build(m + 1, b, num * 2 + 1);
}
void Sum(ll a, ll b, ll c, ll l, ll r, ll num){
    //cout << num << ' ' << t[num].h << '\n';
    if(a <= l && r <= b) {
        t[num].sum += c;
        t[num].h += (r - l + 1) * c;
        return;
    }ll mid = (l + r) / 2;
    if(t[num].qfg != -X){
        //cout << num << " SUM\n";
        t[num].sum = 0;
        t[num * 2].h = t[num].qfg * (mid - l + 1);
        t[num * 2 + 1].h = t[num].qfg * (r - mid);
        t[num * 2].qfg = t[num].qfg;
        t[num * 2 + 1].qfg = t[num].qfg;
        t[num].qfg = 0;
    }
    if(t[num].sum){
        t[num * 2].h += t[num].sum * (mid - l + 1);
        t[num * 2 + 1].h += t[num].sum * (r - mid);
        t[num * 2].sum += t[num].sum;
        t[num * 2 + 1].sum += t[num].sum;
        t[num].sum = 0;
    }
    if(a <= mid) Sum(a, b, c, l, mid, num * 2);
    if(b > mid) Sum(a, b, c, mid + 1, r, num * 2 + 1);
    t[num].h = t[num * 2].h + t[num * 2 + 1].h;
}void Add(ll a, ll b, ll c, ll l, ll r, ll num){
    //cout << num << ' ' << t[num].h << '\n';
    if(a <= l && r <= b) {
        t[num].qfg = c;
        t[num].h = (r - l + 1) * c;
        return;
    }ll mid = (l + r) / 2;
    if(t[num].qfg != -X){
        t[num].sum = 0;
        t[num * 2].h = t[num].qfg * (mid - l + 1);
        t[num * 2 + 1].h = t[num].qfg * (r - mid);
        t[num * 2].qfg = t[num].qfg;
        t[num * 2 + 1].qfg = t[num].qfg;
        t[num].qfg = 0;
    }
    if(a <= mid) Add(a, b, c, l, mid, num * 2);
    if(b > mid) Add(a, b, c, mid + 1, r, num * 2 + 1);
    t[num].h = t[num * 2].h + t[num * 2 + 1].h;
}
ll FindMax(ll a, ll b, ll l, ll r, ll num){
    //cout << num << ' ' << t[num].h << '\n';
    if(a <= l && r <= b && l == r) return t[num].h;
    ll mid = (l + r) / 2, ans = -M;
    if(t[num].qfg != -X){
        t[num].sum = 0;
        t[num * 2].h = t[num].qfg * (mid - l + 1);
        t[num * 2 + 1].h = t[num].qfg * (r - mid);
        t[num * 2].qfg = t[num].qfg;
        t[num * 2 + 1].qfg = t[num].qfg;
        t[num].qfg = 0;
    }
    if(t[num].sum){
        t[num * 2].h += t[num].sum * (mid - l + 1);
        t[num * 2 + 1].h += t[num].sum * (r - mid);
        t[num * 2].sum += t[num].sum;
        t[num * 2 + 1].sum += t[num].sum;
        t[num].sum = 0;
    }
    if(a <= mid) ans = max(ans, FindMax(a, b, l, mid, num * 2));
    if(b > mid) ans = max(ans, FindMax(a, b, mid + 1, r, num * 2 + 1));
    return ans;
}
int main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for(ll i = 1; i <= n; i++){
        cin >> s[i];
    }Build(1, n, 1);
    while(m--){
        cin >> d;
        if(d == 1){
            cin >> x >> y >> c;
            Add(x, y, c, 1, n, 1);
        }if(d == 2){
            cin >> x >> y >> c;
            Sum(x, y, c, 1, n, 1);
        }if(d == 3){
            cin >> x >> y;
            cout << FindMax(x, y, 1, n, 1) << '\n';
        }
    }
    return 0;
}

2025/2/4 20:04
加载中...