0分求调

P3372 【模板】线段树 1

mbzdf @ 2023-11-28 18:47:58

#include <iostream>
#include <cstdio>
using namespace std;
struct node
{
    int l, r;
    long long v;
    long long lazy = 0;
}d[400005];
int n, m;
long long int a[400005];
void mt(int p, int l, int r)
{
    d[p].l = l, d[p].r = r;
    if(l == r)
    {
        d[p].v = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    mt(p << 1, l, mid), mt(p << 1 | 1, mid + 1, r);
    d[p].v = d[p << 1].v + d[p << 1 | 1].v;
    return;
}
long long query(int p, int l, int r){
    if(l <= d[p].l && d[p].r <= r) return d[p].v;
    if(d[p].lazy){
        d[p << 1].v += d[p].lazy * (d[p << 1].r - d[p << 1].l + 1);
        d[p << 1 | 1].v += d[p].lazy * (d[p << 1 | 1].r - d[p << 1 | 1].l + 1);
        d[p << 1].lazy += d[p].lazy;
        d[p << 1 | 1].lazy += d[p].lazy;
        d[p].lazy = 0;
    }
    int mid = (d[p].l + d[p].r) >> 1;
    long long int ans = 0;
    if(l <= mid) ans += query(p << 1, l, r);
    if(mid < r) ans += query(p << 1 | 1, l, r);
    return ans;
}
void at(int p, int l, int r, int x)
{
    if(l <= d[p].l && d[p].r <= r)
    {
        d[p].lazy += (long long) x *(d[p].r - d[p].l + 1);
        d[p].v += x;
        return;
    }
    if(d[p].lazy){
        d[p << 1].v += d[p].lazy * (d[p << 1].r - d[p << 1].l + 1);
        d[p << 1 | 1].v += d[p].lazy * (d[p << 1 | 1].r - d[p << 1 | 1].l + 1);
        d[p << 1].lazy += d[p].lazy;
        d[p << 1 | 1].lazy += d[p].lazy;
        d[p].lazy = 0;
    }
    int mid = (d[p].l + d[p].r) >> 1;
    if(l <= mid) at(p << 1, l, r, x);
    if(mid < r) at(p << 1 | 1, l, r, x);
    d[p].v = d[p << 1].v + d[p << 1 | 1].v;
    return;
}
int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) cin >> a[i];
    mt(1, 1, n);
    while(m--)
    {
        int op;
        cin >> op;
        if(op == 1)
        {
            int l, r, x;
            cin >> l >> r>> x;
            at(1, l, r, x);
        }
        else
        {
            int l, r;
            cin >> l >> r;
            cout << query(1, l, r) << endl;
        }
    }
    return 0;
}

by 0907_WDS_0731 @ 2023-11-28 19:00:28

#include <iostream>
#include <cstdio>
using namespace std;
struct node
{
    int l, r;
    long long v;
    long long lazy = 0;
}d[400005];
int n, m;
long long int a[400005];
void mt(int p, int l, int r)
{
    d[p].l = l, d[p].r = r;
    if(l == r)
    {
        d[p].v = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    mt(p << 1, l, mid), mt(p << 1 | 1, mid + 1, r);
    d[p].v = d[p << 1].v + d[p << 1 | 1].v;
//  return;
}
long long query(int p, int l, int r){
    if(l <= d[p].l && d[p].r <= r) return d[p].v;
    if(d[p].lazy){
        d[p << 1].v += d[p].lazy * (d[p << 1].r - d[p << 1].l + 1);
        d[p << 1 | 1].v += d[p].lazy * (d[p << 1 | 1].r - d[p << 1 | 1].l + 1);
        d[p << 1].lazy += d[p].lazy;
        d[p << 1 | 1].lazy += d[p].lazy;
        d[p].lazy = 0;
    }
    int mid = (d[p].l + d[p].r) >> 1;
    long long int ans = 0;
    if(l <= mid) ans += query(p << 1, l, r);
    if(mid < r) ans += query(p << 1 | 1, l, r);
    return ans;
}
void at(int p, int l, int r, int x)
{
    if(l <= d[p].l && d[p].r <= r)
    {
    //  d[p].lazy += (long long) x *(d[p].r - d[p].l + 1);
    //  d[p].v += x;
        d[p].v += (long long) x *(d[p].r - d[p].l + 1);
        d[p].lazy += x;
        return;
    }
    if(d[p].lazy){
        d[p << 1].v += d[p].lazy * (d[p << 1].r - d[p << 1].l + 1);
        d[p << 1 | 1].v += d[p].lazy * (d[p << 1 | 1].r - d[p << 1 | 1].l + 1);
        d[p << 1].lazy += d[p].lazy;
        d[p << 1 | 1].lazy += d[p].lazy;
        d[p].lazy = 0;
    }
    int mid = (d[p].l + d[p].r) >> 1;
    if(l <= mid) at(p << 1, l, r, x);
    if(mid < r) at(p << 1 | 1, l, r, x);
    d[p].v = d[p << 1].v + d[p << 1 | 1].v;
    return;
}
int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) cin >> a[i];
    mt(1, 1, n);
    while(m--)
    {
        int op;
        cin >> op;
        if(op == 1)
        {
            int l, r, x;
            cin >> l >> r>> x;
            at(1, l, r, x);
        }
        else
        {
            int l, r;
            cin >> l >> r;
            cout << query(1, l, r) << endl;
        }
    }
    return 0;
}

在第44-45行处,该下标的懒标记应该加上传过来的懒标记x,该位置的值应该加上懒标记的和(at函数


|