题意:根据输入要求,更新对应学生的分数或者输出某区间内学生的最高分
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
思路:单纯的单点更新,区间查询的线段树模板
注意点:无特别的注意点,直接套模板的,感觉优化还不够,不过还是卡着时间过了。希望大神批评指正。
以下为AC代码:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
11723320 | 2014-09-24 23:47:56 | Accepted | 1754 | 2859MS | 2396K | 1683 B | G++ | luminous11 |
#include <iostream>
using namespace std;
const int n = 200005;
int tree[4 * n];
int t, a, b;
void update ( int l, int r, int root )
{
if ( r < a || l > a )
{
return;
}
if ( r == l )
{
tree[root] = b;
return;
}
int mid = ( l + r ) >> 1;
update ( l, mid, root << 1 );
update ( mid + 1, r, root << 1 | 1 );
tree[root] = max ( tree[root << 1 ], tree[root << 1 | 1] );
}
int query ( int l, int r, int root )
{
if ( l > b || r < a )
{
return 0;
}
if ( l >= a && r <= b )
{
return tree[root];
}
int mid = ( l + r ) >> 1;
return max ( query( l, mid, root << 1 ), query( mid + 1, r, root << 1 | 1 ) );
}
void print ( )
{
cout << endl;
for ( int i = 0; i < 10; i ++ )
{
cout << i << ' ';
}
cout << endl;
for ( int i = 0; i < 11; i ++ )
{
cout << tree[i] << ' ';
}
cout << endl;
}
int main()
{
int m, k;
ios::sync_with_stdio( false );
while ( cin >> m >> k )
{
for ( int i = 1; i <= m; i ++ )
{
a = i;
cin >> b;
update( 1, m, 1 );
// print ();
}
char ch;
for ( int i = 0; i < k; i ++ )
{
cin.clear();
cin >> ch;
cin >> a >> b;
if ( ch == 'Q' )
{
cout << query( 1, m, 1 ) << endl;
}
else if ( ch == 'U' )
{
update ( 1, m, 1 );
}
// print ( );
}
}
return 0;
}