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(线段树单点更新区间查询最值)

HDU1754 线段树模板题

HDU 1754 I Hate It(线段树之单点更新 区间最值查询)

codevs 4927 线段树练习5 线段树基本操作模板

hdu1754 线段树

HDU 1754区间最值 & SPLAY