HDU-1754 I Hate It ( 线段树 )

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1754

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
 
单点更新,没什么坑点。
之前都是用指针写得的树,尝试一下用数组写的。
 
 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int MAX = 200005;
 5 class Node{
 6 public:
 7     int l,r,v;
 8 }node[MAX * 3];
 9 int num[MAX];
10 
11 int max( int a,int b ){
12     return a > b ? a : b;
13 }
14 
15 void Creat( int i, int z, int y ){
16     node[i].l = z;
17     node[i].r = y;
18     
19     if( z == y ){
20         node[i].v = num[z];
21         return;
22     }
23 
24     int mid = ( z + y ) >> 1;
25     Creat( i << 1, z, mid );
26     Creat( ( i << 1 ) + 1, mid + 1, y );
27     node[i].v = max( node[i << 1].v, node[( i << 1 ) + 1].v );
28 }
29 
30 void Insert( int i, int x, int n ){
31     if( node[i].l == node[i].r ){
32         node[i].v = n;
33         return;
34     }
35 
36     int mid = ( node[i].l + node[i].r ) >> 1;
37     if( x <= mid ) Insert( i << 1, x, n );
38     else Insert( ( i << 1 ) + 1, x, n );
39 
40     node[i].v = max( node[i << 1].v, node[( i << 1 ) + 1].v );
41 }
42 
43 int Ask( int i, int z, int y ){
44     if( node[i].l == z && node[i].r == y )
45         return node[i].v;
46 
47     int mid = ( node[i].l + node[i].r ) >> 1;
48 
49     if( y <= mid )
50         return Ask( i << 1, z, y );
51     else if( z > mid )
52         return Ask( ( i << 1 ) + 1, z, y );
53     else 
54         return max( Ask( i << 1, z, mid ), Ask( ( i << 1 ) + 1, mid + 1, y ) );
55 }
56 
57 int main(){
58     ios::sync_with_stdio( false );
59     
60     int N, M;
61     while( cin >> N >> M ){
62         
63         for( int i = 1; i <= N; i++ )
64             cin >> num[i];
65         Creat( 1, 1, N );
66 
67         char k;
68         int a, b;
69 
70         for( int i = 1; i <= M; i++ ){
71             cin >> k >> a >> b;
72 
73             if( k == 'Q' ) cout << Ask( 1, a, b) << endl;
74             else Insert( 1, a, b );
75         }
76     }
77     return 0;
78 }

 

posted @ 2016-03-28 22:44  「空白」物语  阅读(115)  评论(0编辑  收藏  举报