I Hate It HDOJ---1754

I Hate It

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 29528    Accepted Submission(s): 11703


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
 
思路:线段树,一开始TLE了好几次,不知道为啥,最后比较的时候我用了个getmax函数,其他都一样,居然Accepted了,就不超时了。神奇。。。
AC代码:
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define L(x) (x << 1)
 4 #define R(x) (x << 1|1)
 5 #define MAX 200000
 6 typedef struct
 7 {
 8     int left;
 9     int right;
10     int temp_max;
11 }Node;
12 Node node[3*MAX];
13 int max;
14 int getmax(int x,int y)
15 {
16     return x <y?y:x;
17 }
18 
19 void build(int l,int r,int k)
20 {
21     node[k].left = l;
22     node[k].right = r;
23     node[k].temp_max = 0;
24     if(l == r)
25         return ;
26     int mid = (l+r) >> 1;
27     build(l,mid,L(k));
28     build(mid+1,r,R(k));
29 }
30 
31 void insert(int pos,int val,int k)
32 {
33     if(pos >= node[k].left && pos <= node[k].right)
34     {
35         node[k].temp_max = getmax(val,node[k].temp_max);
36     }
37     if(node[k].left == node[k].right)
38         return ;
39     if(pos < node[R(k)].left)
40         insert(pos,val,L(k));
41     else
42         insert(pos,val,R(k));
43 }
44 
45 int get_result(int l,int r,int k)
46 {
47     if(l == node[k].left && r == node[k].right)
48     {
49         return max = node[k].temp_max;
50     }
51     if(node[k].left == node[k].right)
52         return max;
53     if(r < node[R(k)].left)
54         get_result(l,r,L(k));
55     else if(l > node[L(k)].right)
56         return get_result(l,r,R(k));
57     else
58         return max = getmax(get_result(l,node[L(k)].right,L(k)),get_result(node[R(k)].left,r,R(k)));
59 }
60 
61 int main()
62 {
63     int n,m,i,j,k;
64     char str[5];
65     while(~scanf("%d%d",&n,&m))
66     {
67         build(1,n,1);
68         memset(str,0,sizeof(str));
69         for(i = 1;i <= n;i ++)
70         {
71             scanf("%d",&j);
72             insert(i,j,1);
73         }
74         for(i = 1;i <= m;i ++)
75         {
76             scanf("%s",str);
77             if(!strcmp(str,"Q"))
78             {
79                 max = 0;
80                 scanf("%d%d",&j,&k);
81                 get_result(j,k,1);
82                 printf("%d
",max);
83             }
84             else
85             {
86                 scanf("%d%d",&j,&k);
87                 insert(j,k,1);
88             }
89             memset(str,0,sizeof(str));
90         }
91     }
92     return 0;
93 }
原文地址:https://www.cnblogs.com/anhuizhiye/p/3410306.html