HDU 1754 I Hate It (线段树)

I Hate It
Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit  Status  Practice  HDU 1754
Appoint description: 

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
 
 
 
单点更新,模板题没什么好说的。
 1 #include <iostream>

 2 #include <cstdio>

 3 #include <string>

 4 #include <queue>

 5 #include <vector>

 6 #include <map>

 7 #include <algorithm>

 8 #include <cstring>

 9 #include <cctype>

10 #include <cstdlib>

11 #include <cmath>

12 #include <ctime>

13 #include <climits>

14 using    namespace    std;

15 

16 const    int    SIZE = 200005;

17 int    TREE[SIZE * 4],N,M;

18 

19 void    build(int,int,int);

20 void    update(int,int,int,int,int);

21 int    que(int,int,int,int,int);

22 int    main(void)

23 {

24     int    a,b;

25     char    op;

26 

27     while(~scanf("%d%d",&N,&M))

28     {

29         build(1,1,N);

30         while(M --)

31         {

32             scanf(" %c%d%d",&op,&a,&b);

33             if(op == 'Q')

34                 printf("%d\n",que(a,b,1,1,N));

35             else

36                 update(a,1,1,N,b);

37         }

38     }

39 

40     return    0;

41 }

42 

43 void    build(int node,int left,int right)

44 {

45     if(left == right)

46         scanf("%d",&TREE[node]);

47     else

48     {

49         int    mid = (left + right) >> 1;

50         build(node * 2,left,mid);

51         build(node * 2 + 1,mid + 1,right);

52         TREE[node] = max(TREE[node * 2],TREE[node * 2 + 1]);

53     }

54 }

55 

56 void    update(int n,int node,int left,int right,int add)

57 {

58     if(left == n && right == n)

59     {

60         TREE[node] = add;

61         return    ;

62     }

63     else    if(right < n || left > n)

64         return    ;

65 

66     int    mid = (left + right) >> 1;

67     update(n,node * 2,left,mid,add);

68     update(n,node * 2 + 1,mid + 1,right,add);

69     TREE[node] = max(TREE[node * 2],TREE[node * 2 + 1]);

70 }

71 

72 int    que(int L,int R,int node,int left,int right)

73 {

74     if(left >= L && right <= R)

75         return    TREE[node];

76     if(right < L || left > R)

77         return    0;

78 

79     int    mid = (left + right) >> 1;

80     return    max(que(L,R,node * 2,left,mid),que(L,R,node * 2 + 1,mid + 1,right));

81 }

 

你可能感兴趣的:(HDU)