首页 > 代码库 > I Hate It(HDU1754)
I Hate It(HDU1754)
Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M (0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
学生ID编号分别从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
接下来有M行。每一行有一个字符 C (只取‘Q‘或‘U‘) ,和两个正整数A,B。
当C为‘Q‘的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
当C为‘U‘的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
Output
对于每一次询问操作,在一行里面输出最高成绩。
Sample Input
5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5
Sample Output
5
6
5
9
题目大意。。。。。。如红色部分。。。。
解题思路。。。。线段树的应用。。调用线段树模板,每个根节点储存它们子节点的最大值。每次遍历,只需要找到它们对应的位置,返回它们根节点储存的值即可。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
1 #include<stdio.h> 2 3 #define max(x1, y1) ((x1) > (y1) ? (x1) : (y1)) 4 5 struct node 6 7 { 8 9 int left , right , max; 10 11 } T[600010]; 12 13 int a[200005]; 14 15 void create (int u,int l,int r) //第u个节点的最左端为l,最右端为r。 16 17 { 18 19 T[u].left = l; 20 21 T[u].right = r; 22 23 int mid = (l+r)/2; 24 25 if( l == r) 26 27 { T[u].max = a[r]; return ; } 28 29 create(u+u ,l, mid ); 30 31 create(u+u + 1,mid + 1, r ); 32 33 T[u].max =max(T[u+u].max,T[u+u+1].max); //根节点储存它们子节点的最大成绩 34 35 } 36 37 int search_max(int l ,int r,int i) //查找区间[l,r]上的最大值,值函数里i应该写1 38 39 { 40 41 if(l <= T[i].left &&T[i].right<= r) 42 43 return T[i].max; 44 45 else 46 47 { 48 49 int ans1 = -9999999, ans2 =-9999999; 50 51 if(l <= T[i+i].right) ans1 = search_max(l,r,i+i); 52 53 if(r >= T[i+i+1].left) ans2 = search_max(l,r,i+i+1); 54 55 return max(ans1,ans2); 56 57 } 58 59 } 60 61 void change_tree(int order , int num,int i) //改变输入的数据中序号为order的值为num,同时更新该树 62 63 { 64 65 if(T[i].left == T[i].right) 66 67 { 68 69 T[i].max = num; 70 71 return ; 72 73 } 74 75 else 76 77 { 78 79 if( order <= T[i+i].right) change_tree(order,num,i+i); 80 81 else change_tree(order,num,i+i+1); 82 83 T[i].max = max(T[i+i].max,T[i+i+1].max); 84 85 } 86 87 } 88 89 int main () 90 91 { 92 93 int n,m,A,B; 94 95 char c; 96 97 int i; 98 99 while(scanf("%d%d",&n,&m)!=EOF)100 101 {102 103 for(i=1;i<=n;i++)104 105 scanf("%d",&a[i]);106 107 create(1,1,n);108 109 for(i=1;i<=m;i++)110 111 {112 113 getchar();114 115 scanf("%c%d%d",&c,&A,&B);116 117 if(c==‘Q‘)118 119 printf("%d\n",search_max(A,B,1));120 121 else122 123 {124 125 a[A] = B;126 127 change_tree(A,B,1);128 129 }130 131 }132 133 }134 135 return 0 ;136 137 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。