先放一个吧,过两天在写几个补充完整。
区间求最值:
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
时间: 2024-10-12 03:00:30