NBUT 1680 卖瓜(线段树)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NBUT 1680 卖瓜(线段树)相关的知识,希望对你有一定的参考价值。
题目链接:https://ac.2333.moe/Problem/view.xhtml?id=1680
题意:中文题
现在看觉得就是道水题,罒ω罒。
但是几天前比赛的时候没写出来,写下题解纪念一波,≡ ̄﹏ ̄≡。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 int ans1,ans2; 6 const int INF=0x3f3f3f3f; 7 const int N=11111; 8 struct Tree{ 9 int l,r; 10 int MAX,MIN; 11 }; 12 Tree tree[4*N]; 13 14 void pushup(int x){ 15 int tmp=x<<1; 16 tree[x].MAX=max(tree[tmp].MAX,tree[tmp+1].MAX); 17 tree[x].MIN=min(tree[tmp].MIN,tree[tmp+1].MIN); 18 } 19 20 void build(int l,int r,int x){ 21 tree[x].l=l; 22 tree[x].r=r; 23 if(l==r){ 24 scanf("%d",&tree[x].MAX); 25 tree[x].MIN=tree[x].MAX; 26 return ; 27 } 28 int tmp=x<<1; 29 int mid=(l+r)>>1; 30 build(l,mid,tmp); 31 build(mid+1,r,tmp+1); 32 pushup(x); 33 } 34 35 void update(int l,int r,int value,int x){ 36 if(tree[x].l>r||tree[x].r<l) return ; 37 if(l==tree[x].l&&r==tree[x].r){ 38 tree[x].MAX=value; 39 tree[x].MIN=value; 40 return ; 41 } 42 int tmp=x<<1; 43 update(l,r,value,tmp); 44 update(l,r,value,tmp+1); 45 pushup(x); 46 } 47 48 void query(int l,int r,int x){ 49 if(r<tree[x].l||l>tree[x].r) return ; 50 if(l<=tree[x].l&&r>=tree[x].r){ 51 ans1=max(ans1,tree[x].MAX); 52 ans2=min(ans2,tree[x].MIN); 53 return ; 54 } 55 int tmp=x<<1; 56 int mid=(tree[x].l+tree[x].r)>>1; 57 if(r<=mid) query(l,r,tmp); 58 else if(l>mid) query(l,r,tmp+1); 59 else{ 60 query(l,mid,tmp); 61 query(mid+1,r,tmp+1); 62 } 63 } 64 65 int main(){ 66 int t,n,q; 67 scanf("%d",&t); 68 for(int k=1;k<=t;k++){ 69 scanf("%d %d",&n,&q); 70 build(1,n,1); 71 int op,l,r; 72 for(int i=1;i<=q;i++){ 73 scanf("%d %d %d",&op,&l,&r); 74 if(op==1){ 75 ans1=-1; 76 ans2=INF; 77 query(l,r,1); 78 printf("%d\n",ans1-ans2); 79 } 80 else if(op==2){ 81 update(l,l,r,1); 82 } 83 } 84 } 85 return 0; 86 }
以上是关于NBUT 1680 卖瓜(线段树)的主要内容,如果未能解决你的问题,请参考以下文章