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

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(); } } 
       
      
      
     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值