zoukankan      html  css  js  c++  java
  • HIHO线段树(成段)

     1 #include <stdio.h>
     2 #define lson l,mid,id<<1 
     3 #define rson mid+1,r,id<<1|1
     4 const int MM = 100001;
     5 int num[MM<<2],lazy[MM<<2];
     6 
     7 void push_down(int l,int r,int id)
     8 {
     9     int mid=(l+r)>>1;
    10     num[id<<1]=lazy[id]*(mid-l+1);
    11     num[id<<1|1]=lazy[id]*(r-mid);
    12     lazy[id<<1]=lazy[id<<1|1]=lazy[id];
    13     lazy[id]=0;
    14 }
    15 void build_tree(int l,int r,int id)
    16 {
    17     lazy[id]=0;
    18     if(l==r)
    19     {
    20         scanf("%d",&num[id]);
    21         return;
    22     }
    23     else
    24     {
    25         int mid=(l+r)>>1;
    26         build_tree(lson);
    27         build_tree(rson);
    28         num[id]=num[id<<1]+num[id<<1|1];
    29     }
    30 }
    31 
    32 void Update(int L,int R,int e,int l,int r,int id)
    33 {
    34     if(L<=l&&r<=R)
    35     {
    36         num[id]=(r-l+1)*e;
    37         lazy[id]=e;
    38         return;
    39     }
    40     if(lazy[id])push_down(l,r,id);
    41     int mid=(l+r)>>1;
    42     if(L<=mid)
    43         Update(L,R,e,lson);
    44     if(R>mid)
    45         Update(L,R,e,rson);
    46     num[id]=num[id<<1]+num[id<<1|1];
    47 
    48 }
    49 int Query(int L,int R,int l,int r,int id)
    50 {
    51     if(L<=l&&r<=R)
    52     {
    53         return num[id];
    54     }
    55     if(lazy[id])push_down(l,r,id);
    56     int mid=(l+r)>>1;
    57     int ret=0;
    58     if(L<=mid)ret+=Query(L,R,lson);
    59     if(R>mid)ret+=Query(L,R,rson);
    60     num[id]=num[id<<1]+num[id<<1|1];
    61     return ret;
    62 }
    63 int main()
    64 {
    65     int n,m,op,x,y,z;
    66     scanf("%d",&n);
    67     build_tree(1,n,1);
    68     scanf("%d",&m);
    69     while(m--)
    70     {
    71         scanf("%d",&op);
    72         if(op==1)
    73         {
    74             scanf("%d %d %d",&x,&y,&z);
    75             Update(x,y,z,1,n,1);
    76         }
    77         else 
    78         {
    79             scanf("%d %d",&x ,&y);
    80             int ans=Query(x,y,1,n,1);
    81             printf("%d
    ",ans );
    82         }
    83     }
    84 }
  • 相关阅读:
    SpringMVC视图解析器
    JavaEE PO VO BO DTO POJO DAO 整理总结
    Android Studio JNI开发入门教程
    javah的使用
    右键“在此处打开命令行窗口”的一个小秘密
    URL和URI的区别
    自学使用
    Ribbon使用
    Eureka集群搭建
    ssm常见面试题
  • 原文地址:https://www.cnblogs.com/sylvialucy/p/4135592.html
Copyright © 2011-2022 走看看