zoukankan      html  css  js  c++  java
  • 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372

     1 //线段树  询问区间和,支持区间修改
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6  struct treetype
     7  {
     8      int l,r;
     9      long long sum,d;
    10  };
    11 
    12 const int maxn=1000010;
    13 
    14 treetype a[maxn<<2];
    15 long long num[maxn];
    16 
    17 void build(int k,int l,int r)
    18 {
    19     a[k].l=l;a[k].r=r;a[k].d=0;
    20     if (a[k].l==a[k].r)
    21     {
    22         a[k].sum=num[l];
    23         return;
    24     }
    25     int mid=(l+r)>>1,i=k<<1;
    26     build(i,l,mid);
    27     build(i+1,mid+1,r);
    28     a[k].sum=a[i].sum+a[i+1].sum;
    29 }
    30 void pushdown(int k)
    31 {
    32     if (a[k].l==a[k].r) a[k].d=0;
    33     if (a[k].d==0) return;
    34     //int i=k<<1;long long t=a[i].r-a[i].l+1;a[i].sum+=t*a[k].d;a[i].d+=a[k].d;
    35     //i++;t=a[i].r-a[i].l+1;a[i].sum+=t*a[k].d;a[i].d+=a[k].d;
    36     int i=k<<1;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
    37     i++;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
    38     a[k].d=0;
    39 }
    40 void change(int k,int l,int r,long long d)
    41 {
    42     pushdown(k);
    43     if (l<=a[k].l && a[k].r<=r)
    44     {
    45         //long long t=a[k].r-a[k].l+1;
    46         a[k].sum+=(a[k].r-a[k].l+1)*d;a[k].d=d;
    47         return;
    48     }
    49     int mid=(a[k].l+a[k].r)>>1,i=k<<1;
    50     if (l<=mid) change(i,l,r,d);
    51     if (mid<r) change(i+1,l,r,d);
    52     a[k].sum=a[i].sum+a[i+1].sum;
    53 }
    54 long long query(int k,int l,int r)
    55 {
    56     pushdown(k);
    57     if (l<=a[k].l && a[k].r<=r) return a[k].sum;
    58     int mid=(a[k].l+a[k].r)>>1,i=k<<1;
    59     long long ans=0;
    60     if (l<=mid) ans=query(i,l,r);
    61     if (mid<r) ans+=query(i+1,l,r);
    62     return ans;
    63 }
    64 
    65 int main()
    66 {
    67     int n,m;
    68     scanf("%d%d",&n,&m);
    69     for (int i=1;i<=n;i++) scanf("%lld",&num[i]);
    70     build(1,1,n);
    71     for (int i=1;i<=m;i++)
    72     {
    73         int p,x,y;
    74         scanf("%d%d%d",&p,&x,&y);
    75         if (p==1)
    76         {
    77             long long k;
    78             scanf("%lld",&k);
    79             change(1,x,y,k);
    80         }
    81         else printf("%lld
    ",query(1,x,y));
    82     }
    83     return 0;
    84 }

    poj3468

     1 //线段树  询问区间和,支持区间修改
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6  struct treetype
     7  {
     8      int l,r;
     9      long long sum,d;
    10  };
    11 
    12 const int maxn=100010;
    13 
    14 treetype a[maxn<<2];
    15 long long num[maxn];
    16 
    17 void build(int k,int l,int r)
    18 {
    19     a[k].l=l;a[k].r=r;a[k].d=0;
    20     if (a[k].l==a[k].r)
    21     {
    22         a[k].sum=num[l];
    23         return;
    24     }
    25     int mid=(l+r)>>1,i=k<<1;
    26     build(i,l,mid);
    27     build(i+1,mid+1,r);
    28     a[k].sum=a[i].sum+a[i+1].sum;
    29 }
    30 void pushdown(int k)
    31 {
    32     if (a[k].l==a[k].r) a[k].d=0;
    33     if (a[k].d==0) return;
    34     int i=k<<1;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
    35     i++;a[i].sum+=(a[i].r-a[i].l+1)*a[k].d;a[i].d+=a[k].d;
    36     a[k].d=0;
    37 }
    38 void change(int k,int l,int r,long long d)
    39 {
    40     pushdown(k);
    41     if (l<=a[k].l && a[k].r<=r)
    42     {
    43         a[k].sum+=(a[k].r-a[k].l+1)*d;a[k].d=d;
    44         return;
    45     }
    46     int mid=(a[k].l+a[k].r)>>1,i=k<<1;
    47     if (l<=mid) change(i,l,r,d);
    48     if (mid<r) change(i+1,l,r,d);
    49     a[k].sum=a[i].sum+a[i+1].sum;
    50 }
    51 long long query(int k,int l,int r)
    52 {
    53     pushdown(k);
    54     if (l<=a[k].l && a[k].r<=r) return a[k].sum;
    55     int mid=(a[k].l+a[k].r)>>1,i=k<<1;
    56     long long ans=0;
    57     if (l<=mid) ans=query(i,l,r);
    58     if (mid<r) ans+=query(i+1,l,r);
    59     return ans;
    60 }
    61 
    62 int main()
    63 {
    64     int n,m;
    65     scanf("%d%d",&n,&m);
    66     for (int i=1;i<=n;i++) scanf("%lld",&num[i]);
    67     build(1,1,n);
    68     for (int i=1;i<=m;i++)
    69     {
    70         char p;scanf("%c",&p);
    71         int x,y;
    72         scanf("%c%d%d",&p,&x,&y);
    73         if (p=='C')
    74         {
    75             long long k;
    76             scanf("%lld",&k);
    77             change(1,x,y,k);
    78         }
    79         else printf("%lld
    ",query(1,x,y));
    80     }
    81     return 0;
    82 }
  • 相关阅读:
    Day 03
    Day 03 作业
    Day 02 作业
    Day 02
    Day 01
    Day 10 面向对象基础
    Spring学习-- Bean 的作用域
    一、基本知识
    cloud-init使用技巧
    如何在KVM中管理存储池
  • 原文地址:https://www.cnblogs.com/Currier/p/11270810.html
Copyright © 2011-2022 走看看