码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1754线段树基本操作,建树,更新,查询

时间:2016-02-15 10:32:42      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

代码线段树入门整理中有介绍、

 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线段树基本操作,建树,更新,查询

标签:

原文地址:http://www.cnblogs.com/sasuke-/p/5189952.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!