题目链接: 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。
在每个测试的第一行,有两个正整数 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 }