首页 > 其他分享 >线段树

线段树

时间:2022-08-20 17:45:18浏览次数:40  
标签:rt ll int 线段 ans query scanf

https://www.luogu.com.cn/problem/P3372

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 #define lson l,mid,rt<<1
 5 #define rson mid+1,r,rt<<1|1 
 6 #define ll long long
 7 const int mac=1e5+50;
 8 ll tree[mac<<2],a[mac];
 9 ll lazy[mac<<2];
10 void push_up(int rt){
11     tree[rt]=tree[rt<<1]+tree[rt<<1|1];
12 }
13 void push_down(int l,int r,int rt){
14     if(lazy[rt]!=0){
15         int mid=(l+r)>>1;
16         tree[rt<<1]+=lazy[rt]*(mid-l+1);
17         tree[rt<<1|1]+=lazy[rt]*(r-mid);
18         lazy[rt<<1]+=lazy[rt];
19         lazy[rt<<1|1]+=lazy[rt];
20         lazy[rt]=0;
21     }
22 }
23 void build(int l,int r,int rt){
24     if(l==r){
25         scanf("%lld",&tree[rt]);
26         return ;
27     }
28     int mid=(l+r)>>1;
29     build(lson);
30     build(rson);
31     push_up(rt);
32 }
33 ll query(int l,int r,int rt,int L,int R,ll ans){
34     if(r<L||l>R)
35         return ans;
36     if(l>=L&&r<=R){
37         return ans+tree[rt];
38     }
39     push_down(l,r,rt);
40     int mid=(l+r)>>1;
41     if(L<=mid){
42         ans=query(lson,L,R,ans);
43     }
44     if(R>mid){
45         ans=query(rson,L,R,ans);
46     }
47     return ans;
48 }
49 void update(int l,int r,int rt,int L,int R,ll z){
50     if(l>R||r<L)
51         return;
52     if(l>=L&&r<=R){
53         tree[rt]+=(r-l+1)*z;
54         lazy[rt]+=z;
55         return ;
56     }
57     push_down(l,r,rt);
58     int mid=(l+r)>>1;
59     if(L<=mid){
60         update(lson,L,R,z);
61     }
62     if(R>mid){
63         update(rson,L,R,z);
64     }
65     push_up(rt);
66 }
67 int main(){
68     int i,n,m,k,x,y;
69     ll ans=0,z;
70     scanf("%d %d",&n,&m);
71     build(1,n,1);
72     while(m--){
73         scanf("%d",&k);
74         switch(k){
75             case 1:{
76                 scanf("%d %d %lld",&x,&y,&z);
77                 update(1,n,1,x,y,z);
78                 break;
79             }
80             case 2:{
81                 scanf("%d %d",&x,&y);
82                 ans=query(1,n,1,x,y,ans);
83                 printf("%lld\n",ans);
84                 ans=0;
85                 break;
86             }
87         }
88     }
89 }
View Code

 

标签:rt,ll,int,线段,ans,query,scanf
From: https://www.cnblogs.com/hcl6/p/16608245.html

相关文章

  • 势能线段树
    势能线段树什么是势能线段树所谓势能线段树,是指在懒标记无法正常使用的情况下,暴力到叶子将线段树当成数组一样用进行修改。大概就是先暴力,在暴力到一个状态的时候再用......
  • 线段树小结
    线段树线段树二分线段树分治可持久化线段树线段树合并线段树分裂线段树维护单调栈李超线段树势能线段树&吉司机线段树线段树套···都咕掉了。......
  • 李超线段树学习笔记
    这个hack数据是真的强。模板题的题解很重要哦,希望你能找到适合自己的。博客食用更佳哦李超线段树的定义对于李超线段树的定义,JHSeng大佬的定义简洁精炼:李超线段树是一......
  • #10007. 「一本通 1.1 练习 3」线段
    #include<bits/stdc++.h>usingnamespacestd;structnode{ intl,r;};boolcmp(nodex,nodey){ returnx.r<y.r;}classSolution{ public: intsolve(vector......
  • 开关(线段树区间异或板子)
    [TJOI2009]开关题目描述现有\(n\)盏灯排成一排,从左到右依次编号为:\(1\),\(2\),……,\(n\)。然后依次执行\(m\)项操作。操作分为两种:指定一个区间\([a,b]\),然后改变......
  • 172 树套树 线段树套平衡树
    视频链接:LuoguP3380【模板】二逼平衡树(树套树)//需要开O2#include<iostream>#include<algorithm>usingnamespacestd;#defineN2000010#defineINF21474836......
  • 线段树模板【带懒标记】
    #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e5+10;inta[N];structnode{  intl,r;  lladd,sum;  node(){  ......
  • YbtOJ 「数据结构」第4章 线段树
    不想dp了怎么办?开个新坑吧。例题1.求区间和树状数组不香吗,28行解决(bushi所以懒得打线段树了。code#include<bits/stdc++.h>#defineintlonglongusingnamespac......
  • 洛谷 P6242 【模板】线段树 3 吉司机线段树 区间取最小值 维护历史最大值和区间和
    题目背景本题是线段树维护区间最值操作与区间历史最值的模板。题目描述给出一个长度为 nn 的数列 AA,同时定义一个辅助数组 BB,BB 开始与 AA 完全相同。接下来......
  • 线段树----区间问题的神
    《标准线段树》  普通的线段树,其区间一般都是一个序列的数的个数,但还是要根据不同题目来判断注意:tr[]空间是N*4,N为最大范围《单点修改,区间查询》原题:https://www.......