您的位置:首页 > 理论基础 > 数据结构算法

线段树模板

2017-06-25 21:00 183 查看
昨天又刷了一遍线段树的基础题,复习了一下模板,贴出来以便以后复习。

#include <iostream>
#include <cstdio>
#include <cstring>
#define mid ((l + r) >> 1)
#define lson id << 1
#define rson id << 1 | 1

using namespace std;

long long sum[1000010], lazy[1000010];

inline void PushUp(int id)
{
sum[id] = sum[lson] + sum[rson];
}

void Build(int l, int r, int id)
{
if(l == r)
{
scanf("%lld", &sum[id]);
return ;
}
Build(l, mid, lson);
Build(mid + 1, r, rson);
PushUp(id);
}

void PushDown(int id, int num)
{
lazy[lson] += lazy[id];
lazy[rson] += lazy[id];
sum[lson] += (num - num / 2) * lazy[id];
sum[rson] += (num / 2) * lazy[id];
lazy[id] = 0;
}

void Update(int l, int r, int id, int cl, int cr, long long v)
{
if(l > cr || r < cl)
return ;
if(lazy[id])
PushDown(id, r - l + 1);
if(l >= cl && r <= cr)
{
sum[id] += (r - l + 1) * v;
lazy[id] += v;
return ;
}
Update(l, mid, lson, cl, cr, v);
Update(mid + 1, r, rson, cl, cr, v);
PushUp(id);
}

long long QuerySum(int l, int r, int id, int ql, int qr)
{
if(l > qr || r < ql)
return 0;
if(lazy[id])
PushDown(id, r - l + 1);
if(l >= ql && r <= qr)
return sum[id];
return QuerySum(l, mid, lson, ql, qr) + QuerySum(mid + 1, r, rson, ql, qr);
}

int main()
{
int n, optimes;
long long add;
char c;
while(~scanf("%d %d", &n, &optimes))
{
memset(sum, 0, sizeof(sum));
memset(lazy, 0, sizeof(lazy));
Build(1, n, 1);
getchar();
int l, r;
while(optimes --)
{
scanf("%c", &c);
if(c == 'Q')
{
scanf("%d %d", &l, &r);
printf("%lld\n", QuerySum(1, n, 1, l, r));
}
if(c == 'C')
{
scanf("%d %d %lld", &l, &r, &add);
Update(1, n, 1, l, r, add);
}
getchar();
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线段树 数据结构