HDU 1754线段树基本操作,建树,更新,查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1754线段树基本操作,建树,更新,查询相关的知识,希望对你有一定的参考价值。
代码线段树入门整理中有介绍、
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 const int MAXNODE=1<<19; 7 const int MAX=1000003; 8 struct NODE{ 9 int left,right; 10 int value; 11 }node[MAXNODE]; 12 int father[MAX]; 13 void buildtree(int i,int left,int right) 14 { 15 node[i].left=left; 16 node[i].right=right; 17 node[i].value=0; 18 if(left==right){ 19 father[left]=i; 20 return; 21 } 22 buildtree(i<<1, left, (int)floor( (right+left) / 2.0)); 23 buildtree((i<<1) + 1, (int)floor( (right+left) / 2.0) + 1, right); 24 25 } 26 void updatatree(int ri) 27 { 28 if(ri==1) return; 29 int fi=ri/2; 30 int a=node[fi<<1].value; 31 int b=node[(fi<<1)+1].value; 32 node[fi].value=a>b?a:b; 33 updatatree(ri/2); 34 } 35 int maxn; 36 void query(int i,int l,int r) 37 { 38 if(node[i].left==l&&node[i].right==r){ 39 maxn=(maxn<node[i].value)?node[i].value:maxn; 40 return; 41 } 42 i=i<<1; 43 if(l<=node[i].right) 44 if(r<=node[i].right) 45 query(i,l,r); 46 else 47 query(i,l,node[i].right); 48 i+=1; 49 if(r>=node[i].left) 50 if(l>=node[i].left) 51 query(i,l,r); 52 else 53 query(i,node[i].left,r); 54 } 55 int main() 56 { 57 int n,m; 58 while(~scanf("%d %d",&n,&m)){ 59 buildtree(1,1,n); 60 int grade; 61 for(int i=1;i<=n;++i){ 62 scanf("%d",&grade); 63 node[father[i]].value=grade; 64 updatatree(father[i]); 65 } 66 while(m--){ 67 int x,y;char str[5]; 68 scanf("%s %d %d",str,&x,&y); 69 if(str[0]==‘U‘){ 70 node[father[x]].value=y; 71 updatatree(father[x]); 72 } 73 else{ 74 maxn=0; 75 query(1,x,y); 76 printf("%d\n",maxn); 77 } 78 } 79 } 80 }
以上是关于HDU 1754线段树基本操作,建树,更新,查询的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1754 I Hate It(线段树单点更新区间查询最值)