HDU1754 线段树模板题
Posted findview
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1754 线段树模板题相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
题目分析:对于给出的一个很长的区间,对其进行单点更新值和区间求最大值的操作,由于查询的区间很大,且查询次数多,这里用线段树求解将是十分合适的
注意点:1.对于存放线段树的数组大小需要开大一些
2.对于c语言的字符输入%c之前需要加一个空格保证输入准确
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 5 const int N = 200005; 6 int grade[N]; 7 int tree[N<<2]; //这里建立的树的数组大小需要是N的4倍 否则不够用 8 int n, m; 9 10 int max(int a, int b){ 11 if(a > b) return a; 12 else return b; 13 } 14 15 void build_tree(int start, int end, int node){ //线段树的建立 16 if(start == end){ 17 tree[node] = grade[start]; 18 }else{ 19 int mid = (start + end) / 2; 20 int left_node = node*2; 21 int right_node = node*2+1; 22 23 build_tree(start, mid, left_node); 24 build_tree(mid+1, end, right_node); 25 tree[node] = max(tree[left_node], tree[right_node]); 26 } 27 } 28 29 void update_tree(int start, int end, int node, int index, int value){ //单点更新值 30 if(start == end){ 31 tree[node] = value; 32 }else{ 33 int mid = (start + end) / 2; 34 int left_node = node*2; 35 int right_node = node*2+1; 36 37 if(index <= mid) 38 update_tree(start, mid, left_node, index, value); 39 else 40 update_tree(mid+1, end, right_node, index, value); 41 tree[node] = max(tree[left_node], tree[right_node]); 42 } 43 } 44 45 int search_tree(int start, int end, int node, int l, int r){ //区间查询最大值 46 if(l > end || r < start){ 47 return 0; 48 }else if(l <= start && r >= end){ 49 return tree[node]; 50 }else if(start == end){ //这里的个递归出口放在后面是有原因的,有可能存在start==end 但是l和r根本和start end没有交集的情况,所以先判去了后者 51 return tree[node]; 52 } 53 int mid = (start + end) / 2; 54 int left_node = node*2; 55 int right_node = node*2+1; 56 57 int left_max = search_tree(start, mid, left_node, l, r); 58 int right_max = search_tree(mid+1, end, right_node, l, r); 59 int ans = max(left_max, right_max); 60 return ans; 61 } 62 63 int main(){ 64 while(scanf("%d%d", &n, &m) != EOF){ 65 for(int i = 1; i <= n; i++) 66 scanf("%d", &grade[i]); 67 build_tree(1, n, 1); 68 for(int i = 1; i <= m; i++){ 69 char c; 70 int a, b; 71 scanf(" %c %d %d", &c, &a, &b); //对于c语言的输入字符在%c之前需要一个空格,否则c就读取不到需要的字符了 72 if(c == ‘U‘) update_tree(1, n, 1, a, b); 73 else{ 74 int ans = search_tree(1, n, 1, a, b); 75 printf("%d ", ans); 76 } 77 } 78 } 79 return 0; 80 }
以上是关于HDU1754 线段树模板题的主要内容,如果未能解决你的问题,请参考以下文章