zoukankan      html  css  js  c++  java
  • 线段树

      1 void build(int l,int r,int rt) {
      2     lazyp[rt]=0;
      3     lazym[rt]=1;
      4     if (l == r) {
      5         sum[rt] = a[l];
      6         return;
      7     }
      8     int mid = (l + r) >> 1;
      9     build(l, mid, rt << 1);
     10     build(mid + 1, r, rt << 1 | 1);
     11     sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
     12 }
     13 
     14 void updata(int x,int d,int l,int r,int rt){
     15     if (l==r){
     16         sum[rt]+=d;
     17         return;
     18     }
     19     int mid=(l+r)>>1;
     20     updata(x,d,l,mid,rt<<1);
     21     updata(x,d,mid,r,rt<<1|1);
     22     sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
     23 }
     24 
     25 void update(int l,int r,int d,int L,int R,int rt) {
     26     if (l <= L && R <= r) {
     27         sum[rt] += (r - l + 1) * d;
     28         lazy[rt] += d;
     29         return;
     30     }
     31     int mid = (l + r) >> 1;
     32     pushdown(mid - l + 1, r - mid, rt);
     33     if (l <= mid) updata(l, r, d, L, mid, rt << 1);
     34     if (r > mid) updata(l, r, d, mid+1, R, rt << 1 | 1);
     35     sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
     36 }
     37 
     38 void update(int l,int r,int d,int L,int R,int rt) {
     39     if (l <= L && R <= r) {
     40         sum[rt] *=d;
     41         lazym[rt] *=d;
     42         lazyp[rt]*=d
     43         return;
     44     }
     45     int mid = (l + r) >> 1;
     46     pushdown(mid - l + 1, r - mid, rt);
     47     if (l <= mid) updata(l, r, d, L, mid, rt << 1);
     48     if (r > mid) updata(l, r, d, mid+1, R, rt << 1 | 1);
     49     sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
     50 }
     51 
     52 void update(int l,int r,int d,int L,int R,int rt) {
     53     if (l <= L && R <= r) {
     54         sum[rt] += (r - l + 1) * d;
     55         lazyp[rt] += d;
     56         return;
     57     }
     58     int mid = (l + r) >> 1;
     59     pushdown(mid - l + 1, r - mid, rt);
     60     if (l <= mid) updata(l, r, d, L, mid, rt << 1);
     61     if (r > mid) updata(l, r, d, mid+1, R, rt << 1 | 1);
     62     sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
     63 }
     64 
     65 void pushdown(int l,int r,int rt) {
     66     if (lazy[rt] == 0) {
     67         return;
     68     }
     69     lazy[rt << 1] += lazy[rt];
     70     lazy[rt << 1 | 1] += lazy[rt];
     71     lazy[rt] = 0;
     72     sum[rt << 1] += lazy[rt << 1] * l;
     73     sum[rt << 1 | 1] += lazy[rt << 1 | 1] * r;
     74 }
     75 
     76 void pushdown(int l,int r,int rt) {
     77     if (lazyp[rt]==0&&lazym[rt]==1){
     78         return;
     79     }
     80     sum[rt<<1]=(sum[rt<<1]*lazym[rt]+lazyp[rt]*l);
     81     sum[rt<<1|1]=(sum[rt<<1|1]*lazym[rt]+lazyp[rt]*l);
     82 
     83     lazym[rt << 1] =lazym[rt<<1]*lazym[rt];
     84     lazym[rt << 1|1] =lazym[rt<<1|1]*lazym[rt];
     85 
     86     lazyp[rt << 1] =lazyp[rt<<1]*lazym[rt]+lazyp[rt];
     87     lazyp[rt << 1|1] =lazyp[rt<<1|1]*lazym[rt]+lazyp[rt];
     88 
     89     lazyp[rt]==0;
     90     lazym[rt]==1;
     91 }
     92 
     93 int query(int l,int r,int L,int R,int rt) {
     94     if (l <= L && R <= r) {
     95         return sum[rt];
     96     }
     97     int mid = (l + r) >> 1;
     98     int ret = 0;
     99     pushdown(mid - l + 1, r - mid, rt);
    100     if (l <= mid) ret += query(l, r, L, mid, rt << 1);
    101     if (r > mid) ret += query(l, r, mid + 1, R, rt << 1 | 1);
    102     return ret;
    103 }
  • 相关阅读:
    Android 判断app何时是打开或者关闭的技术研究
    JSON返回DateTime/Date('123123123')/解决办法
    SpringMVC日期类型转换问题三大处理方法归纳
    jackson 转json. 过滤null值
    将java.util.Date类型转换成json时,使用JsonValueProcessor将date转换成希望的类型
    jackson 实体转json 为NULL或者为空不参加序列化
    美工与程序猿的Web工作怎样做到相对分离?
    jQuery 序列化表单数据 serialize() serializeArray()
    iOS开发- 隐藏状态栏(电池栏)
    《Programming Hive》读书笔记(一)Hadoop和hive环境搭建
  • 原文地址:https://www.cnblogs.com/Accpted/p/11203317.html
Copyright © 2011-2022 走看看