ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

洛谷P3372 【模板】线段树 1

2022-05-28 12:02:52  阅读:148  来源: 互联网

标签:洛谷 标记 int ll long build lmid P3372 模板


两个操作,第一个打懒标记处理,第二个直接询问即可,线段树中每个节点存的是区间内所有元素之和。

 1 //p3372
 2 #include<bits/stdc++.h>
 3 typedef long long ll;
 4 using namespace std;
 5 #define lson k<<1,l,mid
 6 #define rson k<<1|1,mid+1,r
 7 const int N=1e5+10;
 8 int n,m;
 9 struct node{
10     int l,r;
11     ll sum,tag;
12 }t[N<<2];
13 
14 void rev(int k,ll x){
15     t[k].sum+=x*(t[k].r-t[k].l+1);
16     t[k].tag+=x;
17 }
18 
19 void pushdown(int k){
20     rev(k<<1,t[k].tag);
21     rev(k<<1|1,t[k].tag);
22     t[k].tag=0;
23 }
24 
25 void pushup(int k){
26     t[k].sum=t[k<<1].sum+t[k<<1|1].sum;
27 }
28 
29 void build(int k,int l,int r){
30     t[k].l=l;t[k].r=r;
31     if(l==r){
32         scanf("%d",&t[k].sum);
33         return ;
34     }
35     int mid=(l+r)>>1;
36     build(lson);build(rson);
37     pushup(k);
38 }
39 
40 void change(int k,int l,int r,ll x){
41     if(t[k].l>=l && t[k].r<=r){
42         rev(k,x);return ;
43     }
44     pushdown(k);
45     int mid=(t[k].l+t[k].r)>>1;
46     if(l<=mid) change(k<<1,l,r,x);
47     if(r>mid) change(k<<1|1,l,r,x);
48     pushup(k);
49 }
50 
51 ll query(int k,int l,int r){
52     if(t[k].l>=l && t[k].r<=r) return t[k].sum;
53     pushdown(k);ll ans=0;
54     int mid=(t[k].l+t[k].r)>>1;
55     if(l<=mid) ans+=query(k<<1,l,r);
56     if(r>mid) ans+=query(k<<1|1,l,r);
57     return ans;
58 }
59 
60 int main(){
61     scanf("%d%d",&n,&m);
62     build(1,1,n);
63     for(int i=1;i<=m;i++){
64         int p,x,y,z;
65         scanf("%d",&p);
66         if(p==1){
67             scanf("%d%d%d",&x,&y,&z);
68             change(1,x,y,z);
69         }
70         else{
71             scanf("%d%d",&x,&y);
72             cout<<query(1,x,y)<<endl;
73         }
74     }
75     return 0;
76 }

注意对一个节点打标记时,该区间内的元素已经被修改了,之后再下传标记。

标签:洛谷,标记,int,ll,long,build,lmid,P3372,模板
来源: https://www.cnblogs.com/yhxnoerror/p/16320238.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有