线段树模板(待补充)

Posted Yeader

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树模板(待补充)相关的知识,希望对你有一定的参考价值。

先放一个吧,过两天在写几个补充完整。

区间求最值:

 

 1 #include<iostream>
 2 #define LC(a)  ((a<<1))
 3 #define RC(a)  ((a<<1)+1)
 4 #define MID(a,b) ((a+b)>>1)
 5 using namespace std;
 6 typedef long long ll;
 7 const int N=1e4*4;
 8 
 9 ll mmin,mmax;
10 
11 struct node{
12     ll l,r;
13     ll mmin,mmax;    
14 }tree[N];
15 
16 ll num[N];
17 
18 void pushup(ll p)  
19 {  
20     tree[p].mmin=min(tree[LC(p)].mmin, tree[RC(p)].mmin);
21     tree[p].mmax=max(tree[LC(p)].mmax,tree[RC(p)].mmax);
22 }
23 
24 void build(ll p,ll l,ll r){
25     tree[p].l=l;
26     tree[p].r=r;
27     tree[p].mmax=0;
28     tree[p].mmin=1e10;
29     if(l==r){
30         //单点最大最小值就是本身 
31         tree[p].mmax=tree[p].mmin=num[l];
32         return;
33     }
34     build(LC(p),l,MID(l,r));
35     build(RC(p),MID(l,r)+1,r);
36     pushup(p);//自底向上推 
37 }
38 
39 void updata(ll p,ll l,ll r,ll num){
40     //不在更新区域内 
41     if(r<tree[p].l||l>tree[p].r)
42         return;
43     //在更新区域内  
44     if(l<=tree[p].l&&r>=tree[p].r){ 
45         tree[p].mmin=tree[p].mmax=num;
46         return;
47     }
48     updata(LC(p),l,r,num);
49     updata(RC(p),l,r,num);
50     pushup(p);
51 }
52 
53 void query(ll p,ll l,ll r){
54     //不在更新区域内 
55     if(r<tree[p].l||l>tree[p].r)
56         return;
57     //在更新区域内 
58     if(l<=tree[p].l&&r>=tree[p].r){
59         mmin=min(tree[p].mmin,mmin);
60         mmax=max(tree[p].mmax,mmax);
61         return;
62     }
63     query(LC(p),l,r);
64     query(RC(p),l,r);
65 }
66 
67 int main(){
68     int t;
69     cin>>t;
70     while(t--){
71         int n,q;
72         cin>>n>>q;
73         for(int i=1;i<=n;i++){
74             cin>>num[i];
75         }
76         //建树 
77         build(1,1,n);
78         for(int i=1;i<=q;i++){
79             int p;
80             cin>>p;
81             if(p==1){
82                 ll l,r;
83                 cin>>l>>r;
84                 //初始化最大最小值 
85                 mmin=1e18;
86                 mmax=0;
87                 query(1,l,r);
88                 //最大最小值差 
89                 cout<<mmax-mmin<<endl; 
90             }
91             else{
92                 ll idx,num;    
93                 cin>>idx>>num;
94                 //用num替换第idx个点的值 
95                 updata(1,idx,idx,num);
96             }
97         }
98     } 
99 }

 

相关题目:

① NOJ1680,单点修改求区间最值,模板题

https://ac.2333.moe/Problem/view.xhtml?id=1680

以上是关于线段树模板(待补充)的主要内容,如果未能解决你的问题,请参考以下文章

[模板]洛谷T3373 线段树 模板2

[模板]洛谷T3372 线段树 模板1

[数据结构] 主席树初识(理论,代码待补)

待更新算法

洛谷P3402 模板可持久化并查集(可持久化线段树,线段树)

线段树笔记的补充(一些不太一样的线段树)