码风良好,易懂,求调,提交是10分

P3372 【模板】线段树 1

szlh_Carey005 @ 2024-10-26 21:19:14

样例过了,只有10分,求调orz

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
long long n, m, q, x, y, k, a[MAXN+2];

struct tree{
    long long l, r, v, add;
}t[4*MAXN+2];

void bulid(long long p, long long l, long long r)
{
    t[p].l = l;
    t[p].r = r;
    if(l == r)
    {
        t[p].v = a[l];
        return;
    }
    long long mid = (l + r) >> 1;
    bulid(2*p, l, mid);
    bulid(2*p+1, mid+1, r);
    t[p].v = t[2*p].v + t[2*p+1].v;
}

void push_down(long long p)
{
    if(t[p].add)
    {
        t[2*p].v += t[p].add * (t[2*p].r - t[2*p].l + 1);
        t[2*p].add += t[p].add;
        t[2*p+1].v += t[p].add * (t[2*p+1].r - t[2*p].l + 1);
        t[2*p+1].add += t[p].add;
        t[p].add = 0;
    }
}

void update(long long p, long long x, long long y, long long z)
{
    if(x <= t[p].l && y >= t[p].r)
    {
        t[p].v += (long long)z*(t[p].r - t[p].l + 1);
        t[p].add += z;
        return;
    }
    push_down(p);
    long long mid = (t[p].l + t[p].r) >> 1;
    if(x <= mid) update(2*p, x, y, z);
    if(y > mid) update(2*p+1, x, y, z);
    t[p].v = t[2*p].v + t[2*p+1].v;
}

long long ask(long long p, long long x, long long y)
{
    if(x <= t[p].l && y >= t[p].r) return t[p].v;
    push_down(p);
    long long ans = 0, mid = (t[p].l + t[p].r) >> 1;
    if(x <= mid) ans += ask(2*p, x, y);
    if(y > mid) ans += ask(2*p+1, x, y);
    return ans;
}

int main()
{
    scanf("%d%d", &n, &m);
    for(long long i = 1; i <= n; i++) scanf("%d", & a[i]);
    bulid(1, 1, n);
    while(m--)
    {
        scanf("%d", &q);
        if(q == 1)
        {
            scanf("%d%d%d", &x, &y, &k);
            update(1, x, y, k);
        }
        else{
            scanf("%d%d", &x, &y);
            cout << ask(1, x, y) << endl;
        }
    }
    return 0;
}

感激不尽!!


by _Violet_Evergarden @ 2024-10-26 21:22:41


        t[2*p+1].v += t[p].add * (t[2*p+1].r - t[2*p].l + 1);

|