刚学OI -114秒钟,线段树板子球调
  • 板块学术版
  • 楼主esquigybcu
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/7/10 21:19
  • 上次更新2023/11/4 15:07:36
查看原帖
刚学OI -114秒钟,线段树板子球调
384214
esquigybcu楼主2021/7/10 21:19

RTRT

调了一个下午,已经调废了

#include <stdio.h>

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

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

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

void pushup(int i)
{
    segtree[i].sum = segtree[lson(i)].sum + segtree[rson(i)].sum;
}

void build(int l, int r, int i)
{
    segtree[i].l = l, segtree[i].r = r;
    if (r - l == 1)
    {
        segtree[i].sum = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, lson(i));
    build(mid, r, rson(i));
    pushup(i);
}

void change(int l, int r, int i, int delta)
{
	//printf("change(%d, %d, %d, %d) called\n", l, r, i, delta); 
    int seg_left = segtree[i].l;
    int seg_right = segtree[i].r;
    int mid = (seg_left + seg_right) >> 1;
    if (l == seg_left && r == seg_right)
        segtree[i].lazy += i, segtree[i].sum += (long long)i * (seg_right - seg_left);
    else if (l >= seg_left && r <= mid)
        change(l, r, lson(i), delta);
    else if (l >= mid && r <= seg_right)
        change(l, r, lson(i), delta);
    else
    {
        change(l, mid, lson(i), delta);
        change(mid, r, rson(i), delta);
        pushup(i);
    }
}

void pushdown(int i)
{
	// segtree[i].sum += segtree[i].lazy * (r - l);
	// see line 49
	segtree[lson(i)].lazy += segtree[i].lazy;
    segtree[rson(i)].lazy += segtree[i].lazy;
    segtree[i].lazy = 0;
}

void dump(int i)
{
	if (segtree[i].l == segtree[i].r)
	    return;
    printf("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));
}

ll query(int l, int r, int i)
{
	printf("query(%d, %d, %d) called\n", l, r, i);
	pushdown(i);
    int seg_left = segtree[i].l;
    int seg_right = segtree[i].r;
    int mid = (seg_left + seg_right) >> 1;
    if (l == seg_left && r == seg_right)
        return segtree[i].sum;
    if (l >= seg_left && r <= mid)
        return query(l, r, lson(i));
    if (l >= mid && r <= seg_right)
        return query(l, r, rson(i));
    return query(l, mid, lson(i)) + query(mid, r, rson(i));
}

int main()
{
    int n, q, op, x, y, k;
    scanf("%d %d", &n, &q);

    for (int i = 1; i <= n; i++)
        scanf("%lld", &a[i]);
    build(1, n + 1, 1);
    //printf("I love qwq forever! \n");
    
    while (q--)
    {
        scanf("%d", &op);
        if (op == 1)
            scanf("%d %d %d", &x, &y, &k), change(x, y, 1, k);
        else
            scanf("%d %d", &x, &y), printf("%lld\n", query(x, y, 1));
        printf("DUMP\n");
        dump(1);
    }
    return 0;
}

// 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! 930! txdy! 
2021/7/10 21:19
加载中...