您的位置:首页 > 其它

poj3468:A Simple Problem with Integers(线段树lazy)

2017-10-29 11:44 471 查看
poj3468 :A Simple Problem with Integers

普通的线段树区间更新,打上lazy标签即可,一个节点记录三个值,一个是区间的值,一个是lazy标签,记录了还未往下传递的值,另外一个是这个区间的长度(长度乘以传下来的lazy即是这个区间增加的值,建树的时候可以算出)。注意开好long long即可。

#include
#include
#include
#include
#include
#define MAXN 400000
using namespace std;
struct node
{
long long value;
long long lazy;
int len;
};
node tree[MAXN << 1]{};
long long value[MAXN];
int left_, right_;
int length;
long long buildtree(int index, int left, int right)
{
tree[index].len = right - left + 1;
if (left == right)
{
tree[index].value = value[left];
}
else
{
int mid = (left + right) >> 1;
tree[index].value = buildtree(index << 1, left, mid)
+ buildtree(index << 1 | 1, mid + 1, right);
}
return tree[index].value;
}
long long getvalue(int index, int templeft, int tempright)
{
int lson = index << 1;
int rson = index << 1 | 1;
int mid = (templeft + tempright) >> 1;
if (templeft >= left_ && tempright <= right_)
return tree[index].value;
if (templeft > right_ || tempright < left_)
return 0;
if (tree[index].lazy)
{
long long &lazy = tree[index].lazy;
tree[lson].lazy += lazy;
tree[lson].value += lazy * tree[lson].len;
tree[rson].lazy += lazy;
tree[rson].value += lazy * tree[rson].len;
lazy = 0;
}
return getvalue(lson, templeft, mid) + getvalue(rson, mid + 1, tempright);
}
void modify(int index, long long value, int templeft, int tempright)
{
if (templeft >= left_ && tempright <= right_)
{
tree[index].lazy += value;
tree[index].value += value*tree[index].len;
return;
}
if (templeft > right_ || tempright < left_)
return;
int mid = (templeft + tempright) >> 1;
int lson = index << 1;
int rson = index << 1 | 1;
if (tree[index].lazy)
{
long long &lazy = tree[index].lazy;
tree[lson].lazy += lazy;
tree[lson].value += lazy * tree[lson].len;
tree[rson].lazy += lazy;
tree[rson].value += lazy * tree[rson].len;
lazy = 0;
}
modify(lson, value, templeft, mid);
modify(rson, value, mid + 1, tempright);
tree[index].value = tree[lson].value + tree[rson].value;
}

int main()
{
int size, opr;
scanf("%d%d", &size, &opr);
for (int i = 1; i <= size; i++)
scanf("%lld", &value[i]);
buildtree(1, 1, size);
char ch;
int a, b;
long long c;
getchar();
while (opr--)
{
ch = getchar();
if (ch == 'Q')
{
scanf("%d%d", &a, &b);
left_ = a; right_ = b;
printf("%lld\n", getvalue(1, 1, size));
}
else
{
scanf("%d%d%lld", &a, &b, &c);
left_ = a; right_ = b;
modify(1, c, 1, size);
}
getchar();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: