您的位置:首页 > 其它

hdu 1754 I Hate It(线段树 点更新 最大值)

2017-03-11 20:38 405 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

I Hate It

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 70810    Accepted Submission(s): 27401


[align=left]Problem Description[/align]
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。

这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
 

[align=left]Input[/align]
本题目包含多组测试,请处理到文件结束。

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

 

[align=left]Output[/align]
对于每一次询问操作,在一行里面输出最高成绩。
 

[align=left]Sample Input[/align]

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

 

[align=left]Sample Output[/align]
5
6
5
9

HintHuge input,the C function scanf() will work better than cin

线段树,求最大值,点更新,模板

但是做了好久答案不对,终于发现是忘了getchar(),一个大写的懵逼

代码:

#define _CRT_SBCURE_MO_DEPRECATE
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<string>
#include<string.h>
#include<set>
#include<queue>
#include<stack>
#include<functional>
using namespace std;
const int maxn = 10000000 + 10;
const int INF = 0x3f3f3f3f;
typedef long long ll;
using namespace std;
const int mxn = 1000000 + 20;

struct node {
int l, r, maxn, sum;
}tree[mxn << 2];

int t, n, q, v;
char m;
int x, y;
int a[mxn];

void build(int m, int l, int r) {
tree[m].l = l;
tree[m].r = r;
if (l == r) {
tree[m].maxn = a[l];
return;
}
int mid = (l + r) >> 1;
build(m << 1, l, mid);
build((m << 1) + 1, mid + 1, r);
tree[m].maxn = max(tree[m << 1].maxn, tree[(m << 1) + 1].maxn);
}

void update(int m, int a, int val) {
if (tree[m].l == a && tree[m].r == a) {
tree[m].maxn = val;
tree[m].sum = val;
return;
}
int mid = (tree[m].l + tree[m].r) >> 1;
if (a <= mid)
update(m << 1, a, val);
else
update((m << 1) + 1, a, val);
tree[m].maxn = max(tree[m << 1].maxn, tree[(m << 1) + 1].maxn);
tree[m].sum = tree[m << 1].sum + tree[(m << 1) + 1].sum;
}

int query_max(int m, int l, int r) {
if (l == tree[m].l && r == tree[m].r)
return tree[m].maxn;
int mid = (tree[m].l + tree[m].r) >> 1;
if (r <= mid)
return query_max(m << 1, l, r);
if (l > mid)
return query_max((m << 1) + 1, l, r);
return max(query_max(m << 1, l, mid), query_max((m << 1) + 1, mid + 1, r));

}

int main()
{

while (scanf("%d %d", &n, &q) != EOF) {
memset(a, 0, sizeof(a));
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
build(1, 1, n);
while (q--) {
getchar();
scanf("%c", &m);
if (m == 'U') {
scanf("%d %d", &x, &y);
update(1, x, y);
}
else if (m == 'Q') {
scanf("%d %d", &x, &y);
printf("%d\n", query_max(1, x, y));
}
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息