zoukankan      html  css  js  c++  java
  • kb-07线段树-05-区间整体修改查询;(水)

     1 /*
     2   
     3 
     4  */
     5 #include<iostream>
     6 #include<cstring>
     7 #include<cstdio>
     8 using namespace std;
     9 struct P
    10 {
    11     int l,r,value;
    12     int add;
    13 }tr[400005];
    14 void Pushup(int rt)
    15 {
    16     tr[rt].value=tr[rt<<1].value+tr[rt<<1|1].value;
    17 }
    18 void build(int rt,int l,int r)
    19 {
    20     tr[rt].l=l;
    21     tr[rt].r=r;
    22     tr[rt].add=0;
    23     if(l==r)
    24     {
    25         tr[rt].value=1;
    26         return ;
    27     }
    28     int mid=(l+r)/2;
    29     build(rt<<1,l,mid);
    30     build(rt<<1|1,mid+1,r);
    31     Pushup(rt);
    32 }
    33 /*
    34    区间修改,整体改成一个数,所以只需要记录这个数就可以了,区间的和可以用这个数乘以区间长度来求;
    35  */
    36 void Pushdown(int rt)
    37 {
    38     if(tr[rt].add<=0)
    39         return ;
    40     tr[rt<<1].value=tr[rt].add*(tr[rt<<1].r-tr[rt<<1].l+1);
    41     tr[rt<<1|1].value=tr[rt].add*(tr[rt<<1|1].r-tr[rt<<1|1].l+1);
    42     tr[rt<<1].add=tr[rt].add;
    43     tr[rt<<1|1].add=tr[rt].add;
    44     tr[rt].add=0;
    45 }
    46 void Update(int rt,int l,int r,int begin,int end,int x)
    47 {
    48     if(begin<=l&&end>=r)
    49     {
    50         tr[rt].add=x;
    51         tr[rt].value=x*(r-l+1);//把区间更新成x
    52         return ;
    53     }
    54     Pushdown(rt);
    55     if(begin <=tr[rt<<1].r)
    56     {
    57         Update(rt<<1,l,tr[rt<<1].r,begin,end,x);
    58     }
    59     if(end >=tr[rt<<1|1].l)
    60     {
    61         Update(rt<<1|1,tr[rt<<1|1].l,r,begin,end,x);
    62     }
    63     Pushup(rt);//区间下面的值发生变化,所以要pushup
    64 
    65 }
    66 int main()
    67 {
    68     int T,k=1;
    69     scanf("%d",&T);
    70     while(T--)
    71     {
    72         int n,q;
    73         scanf("%d%d",&n,&q);
    74         memset(tr,0,sizeof(tr));
    75         build(1,1,n);
    76         for(int i=0;i<q;i++)
    77         {
    78             int ll,rr,v;
    79             scanf("%d%d%d",&ll,&rr,&v);
    80             Update(1,1,n,ll,rr,v);
    81 //            for(int j=1;j<=25;j++)
    82 //                printf("%d:%d
    ",j,tr[j].value);
    83         }
    84         int ans=tr[1].value;
    85         printf("Case %d: The total value of the hook is %d.
    ",k++,ans);
    86     }
    87     return 0;
    88 }
  • 相关阅读:
    Android kotlin jsoup解析网页html代码
    Android kotlin 判断网络状态
    ASP.NET设计模式笔记1
    C# SMTP发送邮件
    SQL连接数和CPU使用情况查询
    Grafana笔记
    Docker笔记
    solidity学习(四)---storage和memory关键字
    e-book
    solidity学习(四)-- Require(), Assert(), Revert()的用法和区别
  • 原文地址:https://www.cnblogs.com/by-1075324834/p/4541280.html
Copyright © 2011-2022 走看看