zoukankan      html  css  js  c++  java
  • 线段树区间操作 lazy

     1 #include<iostream>
     2 #define ll long long
     3 using namespace std;
     4 ll n,m;
     5 struct sb
     6 {
     7     ll l,r,sum,add;
     8 }t[1000100*4];
     9 ll aa[1000100];
    10 void build(ll a,ll b,ll k)
    11 {
    12     t[k].l=a; t[k].r=b;
    13     if (a==b)
    14     {
    15         t[k].sum=aa[a];
    16         return;
    17     }
    18     else
    19     {
    20         ll mid=(a+b)/2;
    21         build(a,mid,k*2);
    22         build(mid+1,b,k*2+1);
    23         t[k].sum=t[k*2].sum+t[k*2+1].sum;
    24     }
    25     
    26 }
    27 void lazy(ll k,ll m)
    28 {
    29     if (t[k].add)
    30     {
    31         t[k*2].add+=t[k].add;
    32         t[k*2+1].add+=t[k].add;
    33         t[k*2].sum+=t[k].add*(m-(m/2));
    34         t[k*2+1].sum+=t[k].add*(m/2);
    35         t[k].add=0; 
    36     }
    37 }
    38 void change(ll x,ll y,ll z,ll k)
    39 {
    40     if (t[k].l>=x&&t[k].r<=y)
    41     {
    42         t[k].add+=z;
    43         t[k].sum+=z*(t[k].r-t[k].l+1);
    44         return;
    45     }
    46     lazy(k,t[k].r-t[k].l+1);
    47     ll mid=(t[k].l+t[k].r)/2;
    48     if (y<=mid) change(x,y,z,k*2);
    49     else if (x>mid) change(x,y,z,k*2+1);
    50     else
    51     {
    52         change(x,mid,z,k*2); 
    53         change(mid+1,y,z,k*2+1);
    54     }
    55     t[k].sum=t[k*2].sum+t[k*2+1].sum;
    56 }
    57 ll check(ll x,ll y,ll k)
    58 {
    59     if (t[k].l==x&&t[k].r==y)
    60         return t[k].sum;
    61     lazy(k,t[k].r-t[k].l+1);
    62     ll mid=(t[k].l+t[k].r)/2;
    63     if (y<=mid) return check(x,y,k*2);
    64     else if (x>mid) return check(x,y,k*2+1);
    65     else
    66         return check(x,mid,k*2)+check(mid+1,y,k*2+1);
    67 }
    68 int main ()
    69 {
    70     cin>>n;
    71     for (ll i=1;i<=n;i++)
    72        cin>>aa[i];
    73     build(1,n,1);
    74     cin>>m;
    75     for (ll i=1,w,x,y,z;i<=m;i++)
    76     {
    77         cin>>w;
    78         if (w==1)
    79         {
    80             cin>>x>>y>>z;
    81             change(x,y,z,1);
    82         }
    83         if (w==2)
    84         {
    85             cin>>x>>y;
    86             cout<<check(x,y,1)<<endl;
    87         }
    88     }
    89 }
    为何要逼自己长大,去闯不该闯的荒唐
  • 相关阅读:
    JavaScript常见注意点(一)
    jspServlet2.5和Servlet3的区别
    jspMVC案例
    jQuery入口函数的写法
    Servlet 简介
    jspMVC设计模式和Servlet2.5入门案例
    display 属性
    JSON简单使用
    Tomcat修改端口号
    php开发环境简单配置
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/10485948.html
Copyright © 2011-2022 走看看