zoukankan      html  css  js  c++  java
  • kb-07线段树-03--区间修改查询--lazy思想

      1 /*
      2    区间修改,区间查询和;
      3    第一次使用lazy思想;
      4    poj3468
      5  */
      6 #include<iostream>
      7 #include<cstdio>
      8 #include<cstring>
      9 #include<algorithm>
     10 #define ll long long
     11 using namespace std;
     12 typedef struct
     13 {
     14     int l,r;
     15     ll add;
     16     ll value;
     17 }V;
     18 
     19 int n,m,a[100005]={0};
     20 
     21 V tr[400010]={0};
     22 void Pushup(int rt)
     23 {
     24     tr[rt].value=tr[rt<<1].value+tr[(rt<<1)|1].value;
     25 }
     26 void Pushdown(int rt,int m)
     27 {
     28     if(tr[rt].add)
     29     {
     30         tr[rt<<1].add+=tr[rt].add;
     31         tr[(rt<<1)|1].add+=tr[rt].add;
     32         tr[rt<<1].value+=tr[rt].add*(m-(m>>1));
     33         tr[(rt<<1)|1].value+=tr[rt].add*(m>>1);
     34         tr[rt].add=0;
     35     }
     36 }
     37 void build(int i,int l,int r)
     38 {
     39     tr[i].l=l;
     40     tr[i].r=r;
     41     tr[i].add=0;
     42     if(l==r)
     43     {
     44         tr[i].value=a[l];
     45         return ;
     46     }
     47     int mid=(l+r)/2;
     48     build(i<<1,l,mid);
     49     build((i<<1)|1,mid+1,r);
     50     Pushup(i);
     51 }
     52 void Update(int i,int l,int r,int x)
     53 {
     54      if(tr[i].l==l&&tr[i].r==r)
     55      {
     56          tr[i].add+=x;
     57          tr[i].value+=(ll)x*(r-l+1);
     58          return ;
     59      }
     60      if(tr[i].l==tr[i].r)
     61          return ;
     62      Pushdown(i,tr[i].r-tr[i].l+1);
     63      int t=i<<1;
     64      if(l<=tr[t].r)
     65      {
     66          if(r<=tr[t].r)
     67              Update(t,l,r,x);
     68          else
     69              Update(t,l,tr[t].r,x);
     70      }
     71      t+=1;
     72      if(r>=tr[t].l)
     73      {
     74          if(l>=tr[t].l)
     75              Update(t,l,r,x);
     76          else
     77              Update(t,tr[t].l,r,x);
     78      }
     79      Pushup(i);
     80 }
     81 ll  Query(int i,int l,int r)
     82 {
     83     if(tr[i].l==l&&tr[i].r==r)
     84     {
     85         return tr[i].value;
     86     }
     87     Pushdown(i,tr[i].r-tr[i].l+1);
     88     ll ans=0;
     89     i=i<<1;
     90     if(l<=tr[i].r)
     91     {
     92         if(r<=tr[i].r)
     93             ans+=Query(i,l,r);
     94         else
     95             ans+=Query(i,l,tr[i].r);
     96     }
     97     i+=1;
     98     if(r>=tr[i].l)
     99     {
    100         if(l>=tr[i].l)
    101             ans+=Query(i,l,r);
    102         else
    103             ans+=Query(i,tr[i].l,r);
    104     }
    105     return ans;
    106 }
    107 int main()
    108 {
    109    while(scanf("%d%d",&n,&m)!=EOF)
    110    {
    111         memset(a,0,sizeof(a));
    112         memset(tr,0,sizeof(tr));
    113         for(int i=1;i<=n;i++)
    114             scanf("%d",&a[i]);
    115         build(1,1,n);
    116         for(int i=0;i<m;i++)
    117         {
    118             char s[2];
    119             int x1,x2,x3;
    120             scanf("%s",s);
    121             if(s[0]=='C')
    122             {
    123                 scanf("%d%d%d",&x1,&x2,&x3);
    124                 Update(1,x1,x2,x3);
    125             }
    126             else
    127             {
    128                 scanf("%d%d",&x1,&x2);
    129                 printf("%I64d
    ",Query(1,x1,x2));
    130             }
    131         }
    132    }
    133     return 0;
    134 }
  • 相关阅读:
    mybatis SQL 根据in条件语句排序
    Redis面试总结
    数据库优化之分库分表
    jdk1.6 Synchronized 优化总结
    CounDownLatch、CyclicBarrier、Semaphore
    java锁总结
    Redis 与 MySQL 双写一致性如何保证
    dubbo总结
    一、全国大学生电子设计竞赛测控(无人机)方向___基础篇
    编解码KL变换详解和哥伦布k阶编解码
  • 原文地址:https://www.cnblogs.com/by-1075324834/p/4541193.html
Copyright © 2011-2022 走看看