这玩意为什么需要6倍空间?
查看原帖
这玩意为什么需要6倍空间?
384214
esquigybcu楼主2021/7/13 18:57

RTRT.

AC:

#include <stdio.h>

#ifdef ONLINE_JUDGE
#define debug(...)
#else
#define debug(...) printf(__VA_ARGS__)
#endif

#define ls segtree[lson(i)]
#define rs segtree[rson(i)]
#define u  segtree[i]
#define length(v) (v.r - v.l)

typedef long long ll;
const int SIZE = 1e5 + 5;
int a[SIZE];

struct node
{
    int l, r;
    ll sum, lazy;
}
segtree[6 * SIZE];

inline int lson(int i){return i << 1; }
inline int rson(int i){return i << 1 | 1; }

void pushup(int i)
{
    debug("pushup(%d) called\n", i);
	if (length(u) == 0) return;
    u.sum = ls.sum + rs.sum;
    debug("segtree[%d].sum is now %lld\n", i, segtree[i].sum);
}

void pushdown(int i)
{
    debug("pushdown(%d) called\n", i);
    if (length(u) == 0) return;
    ls.lazy += u.lazy;
    ls.sum += u.lazy * length(ls);
    rs.lazy += u.lazy;
    rs.sum += u.lazy * length(rs);
    u.lazy = 0;
    debug("segtree[%d].lazy is now %lld\n", lson(i), segtree[lson(i)].lazy);
    debug("segtree[%d].sum is now %lld\n", lson(i), segtree[lson(i)].sum);
    debug("segtree[%d].lazy is now %lld\n", rson(i), segtree[rson(i)].lazy);
    debug("segtree[%d].sum is now %lld\n", rson(i), segtree[rson(i)].sum);
    debug("segtree[%d].lazy is now 0\n", i);
}

void build(int l, int r, int i)
{
    u.l = l, u.r = r;
    if (r - l == 1)
    {
        u.sum = a[l];
        debug("segtree[%d].sum is now %lld\n", i, a[l]);
        return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, lson(i));
    build(mid, r, rson(i));
    pushup(i);
}

ll query(int l, int r, int i)
{
	if (length(u) == 0) return 0;
    debug("query(%d, %d, %d) called\n", l, r, i);
    pushdown(i);
    int left = u.l, right = u.r;
    int mid = (left + right) >> 1;
    ll ret;
    if (l == left && r == right)
        ret = u.sum;
    else if (l >= left && r <= mid)
        ret = query(l, r, lson(i));
    else if (l >= mid && r <= right)
        ret = query(l, r, rson(i));
    else
        ret = query(l, mid, lson(i)) + query(mid, r, rson(i));
    debug("query(%d, %d, %d) returned %lld\n", l, r, i, ret);
    return ret;
}

void modify(int l, int r, int i, int delta)
{
	if (length(u) == 0) return;
    debug("modify(%d, %d, %d) called\n", l, r, i);
    int left = u.l, right = u.r;
    int mid = (left + right) >> 1;
    if (l == left && r == right)
    {
        u.lazy += delta, u.sum += delta * (segtree[i].r - segtree[i].l);
		debug("segtree[%d].lazy is now %lld\nsegtree[%d].sum is now %lld\n", i, segtree[i].lazy, i, segtree[i].sum);
    }
    else
    {
        pushdown(i);
        if (l >= left && r <= mid)
            modify(l, r, lson(i), delta);
        else if (l >= mid && r <= right)
            modify(l, r, rson(i), delta);
        else
            modify(l, mid, lson(i), delta), modify(mid, r, rson(i), delta);
        pushup(i);
    }
}

void dump(int i)
{
	#ifndef ONLINE_JUDGE
	if (u.l == u.r)
	    return;
    debug("segtree[%d]: left = %d, right = %d, sum = %lld, lazy = %lld\n", i, segtree[i].l, segtree[i].r, segtree[i].sum, segtree[i].lazy);
    dump(lson(i));
    dump(rson(i));
    #endif
}

int main()
{
    int n, q;
    scanf("%d %d", &n, &q);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    build(1, n + 1, 1);

    while (q--)
    {
        int op, x, y, k;
        scanf("%d", &op);
        if (op == 1)
            scanf("%d %d %d", &x, &y, &k), modify(x, y + 1, 1, k);
        else if (op == 2)
            scanf("%d %d", &x, &y), printf("%lld\n", query(x, y + 1, 1));
        debug("DUMP\n");
        dump(1);
    }
    return 0;
}

RE,70pts:

#include <stdio.h>

#ifdef ONLINE_JUDGE
#define debug(...)
#else
#define debug(...) printf(__VA_ARGS__)
#endif

#define ls segtree[lson(i)]
#define rs segtree[rson(i)]
#define u  segtree[i]
#define length(v) (v.r - v.l)

typedef long long ll;
const int SIZE = 1e5 + 5;
int a[SIZE];

struct node
{
    int l, r;
    ll sum, lazy;
}
segtree[5 * SIZE];

inline int lson(int i){return i << 1; }
inline int rson(int i){return i << 1 | 1; }

void pushup(int i)
{
    debug("pushup(%d) called\n", i);
	if (length(u) == 0) return;
    u.sum = ls.sum + rs.sum;
    debug("segtree[%d].sum is now %lld\n", i, segtree[i].sum);
}

void pushdown(int i)
{
    debug("pushdown(%d) called\n", i);
    if (length(u) == 0) return;
    ls.lazy += u.lazy;
    ls.sum += u.lazy * length(ls);
    rs.lazy += u.lazy;
    rs.sum += u.lazy * length(rs);
    u.lazy = 0;
    debug("segtree[%d].lazy is now %lld\n", lson(i), segtree[lson(i)].lazy);
    debug("segtree[%d].sum is now %lld\n", lson(i), segtree[lson(i)].sum);
    debug("segtree[%d].lazy is now %lld\n", rson(i), segtree[rson(i)].lazy);
    debug("segtree[%d].sum is now %lld\n", rson(i), segtree[rson(i)].sum);
    debug("segtree[%d].lazy is now 0\n", i);
}

void build(int l, int r, int i)
{
    u.l = l, u.r = r;
    if (r - l == 1)
    {
        u.sum = a[l];
        debug("segtree[%d].sum is now %lld\n", i, a[l]);
        return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, lson(i));
    build(mid, r, rson(i));
    pushup(i);
}

ll query(int l, int r, int i)
{
	if (length(u) == 0) return 0;
    debug("query(%d, %d, %d) called\n", l, r, i);
    pushdown(i);
    int left = u.l, right = u.r;
    int mid = (left + right) >> 1;
    ll ret;
    if (l == left && r == right)
        ret = u.sum;
    else if (l >= left && r <= mid)
        ret = query(l, r, lson(i));
    else if (l >= mid && r <= right)
        ret = query(l, r, rson(i));
    else
        ret = query(l, mid, lson(i)) + query(mid, r, rson(i));
    debug("query(%d, %d, %d) returned %lld\n", l, r, i, ret);
    return ret;
}

void modify(int l, int r, int i, int delta)
{
	if (length(u) == 0) return;
    debug("modify(%d, %d, %d) called\n", l, r, i);
    int left = u.l, right = u.r;
    int mid = (left + right) >> 1;
    if (l == left && r == right)
    {
        u.lazy += delta, u.sum += delta * (segtree[i].r - segtree[i].l);
		debug("segtree[%d].lazy is now %lld\nsegtree[%d].sum is now %lld\n", i, segtree[i].lazy, i, segtree[i].sum);
    }
    else
    {
        pushdown(i);
        if (l >= left && r <= mid)
            modify(l, r, lson(i), delta);
        else if (l >= mid && r <= right)
            modify(l, r, rson(i), delta);
        else
            modify(l, mid, lson(i), delta), modify(mid, r, rson(i), delta);
        pushup(i);
    }
}

void dump(int i)
{
	#ifndef ONLINE_JUDGE
	if (u.l == u.r)
	    return;
    debug("segtree[%d]: left = %d, right = %d, sum = %lld, lazy = %lld\n", i, segtree[i].l, segtree[i].r, segtree[i].sum, segtree[i].lazy);
    dump(lson(i));
    dump(rson(i));
    #endif
}

int main()
{
    int n, q;
    scanf("%d %d", &n, &q);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    build(1, n + 1, 1);

    while (q--)
    {
        int op, x, y, k;
        scanf("%d", &op);
        if (op == 1)
            scanf("%d %d %d", &x, &y, &k), modify(x, y + 1, 1, k);
        else if (op == 2)
            scanf("%d %d", &x, &y), printf("%lld\n", query(x, y + 1, 1));
        debug("DUMP\n");
        dump(1);
    }
    return 0;
}
2021/7/13 18:57
加载中...