• 模板:线段树(1)——加法,求和


    https://www.luogu.org/problemnew/show/P3372

     区间加法修改,区间查询

      1 #include<iostream>
      2 #include<cstdio>
      3 #define INF 99999999
      4 #define ls (root<<1)
      5 #define rs (root<<1|1)
      6 using namespace std;
      7 typedef long long ll; 
      8 struct node{
      9     ll val;
     10     ll len;
     11     ll lazy;
     12     ll l, r;
     13 }tree[300005];
     14 ll a[100005];
     15 ll n, m;
     16 int kd(){
     17     int r=0, f=1;
     18     char c=getchar();
     19     while(c<'0'||c>'9'){
     20         if(c=='-') f=-1;
     21         c=getchar();
     22     }
     23     while(c>='0'&&c<='9'){
     24         r=(r<<1)+(r<<3)+c-'0';
     25         c=getchar();
     26     }
     27     return f*r;
     28 }
     29 void build(ll root, ll l, ll r){
     30     ll mid;
     31     tree[root].lazy=0;
     32     tree[root].l=l;
     33     tree[root].r=r;
     34     tree[root].len=r-l+1;
     35     if(l==r) tree[root].val=a[l];
     36     else{
     37         mid=(l+r)/2;
     38         build(ls, l, mid);
     39         build(rs, mid+1, r);
     40         tree[root].val=tree[ls].val+tree[rs].val;
     41     }
     42 }
     43 void pushdown(ll root){
     44     if(tree[root].lazy){
     45         tree[ls].lazy+=tree[root].lazy;
     46         tree[rs].lazy+=tree[root].lazy;
     47         tree[ls].val+=tree[ls].len*tree[root].lazy;
     48         tree[rs].val+=tree[rs].len*tree[root].lazy;
     49         tree[root].lazy=0; 
     50     }
     51 }
     52 void add(ll root,ll id,ll addv){
     53     ll mid;
     54     if(tree[root].l==tree[root].r){
     55         tree[root].val+=addv;
     56         return;
     57     }
     58     else{
     59         mid=(tree[root].l+tree[root].r)/2;
     60         if(id<=mid)     add(ls,id,addv);
     61         else            add(rs,id,addv);
     62         tree[root].val=tree[ls].val+tree[rs].val;
     63     }
     64 }
     65 ll query(ll root,ll l,ll r){
     66     ll mid;
     67     if(tree[root].l>=l && tree[root].r<=r)  return tree[root].val;
     68     if(tree[root].l>r || tree[root].r<l)    return 0;
     69     if(tree[root].lazy)                     pushdown(root);
     70     return query(ls, l, r)+query(rs, l, r);
     71 }
     72 void update(ll root,ll l,ll r,ll addv){
     73     ll mid;
     74     if(tree[root].l>=l && tree[root].r<=r){
     75         tree[root].lazy+=addv;
     76         tree[root].val+=tree[root].len*addv;
     77         return;
     78     }
     79     if(tree[root].l>r || tree[root].r<l)    return;
     80     if(tree[root].lazy)     pushdown(root);
     81     update(ls, l, r,addv);
     82     update(rs, l, r, addv);
     83     tree[root].val=tree[ls].val+tree[rs].val;
     84 }
     85 int main(){
     86     ll i, x, y, k;
     87     char z;
     88     n=kd();
     89     m=kd();
     90     for(i=1; i<=n; i++){
     91         a[i]=kd();
     92     }
     93     build(1, 1, n);
     94     for(i=1; i<=m; i++){
     95         cin>>z;
     96         if(z=='1'){
     97             x=kd();
     98             y=kd();
     99             k=kd();
    100             update(1,x,y,k);
    101         }
    102         else{
    103             x=kd();
    104             y=kd();
    105             printf("%lld
    ",query(1,x,y));
    106         }
    107     }
    108     return 0;
    109 }
    "Hello World!"
  • 相关阅读:
    控制器之间的通信(传值方法)以及多次调用通信
    关于ios项目沙盒中的文件和Xcode项目创建的文件
    解决cell循环利用造成的重复勾选
    让TabelView视图中自定义的Toolbar固定(不随cell的移动而移动)
    jsonString转NSDictionary
    日期字符串转换 and 两个日期相减
    Java虚拟机 简介
    浅谈操作系统对内存的管理(转)
    Java虚拟机规范(Java SE 7)笔记
    StringUtils
  • 原文地址:https://www.cnblogs.com/Aze-qwq/p/9337624.html
Copyright © 2020-2023  润新知