您的位置:首页 > 其它

hdu1754 I Hate It(线段树,单点更新,区间最值)

2016-08-19 19:58 429 查看
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1754

思路:

线段树,实现单点更新,区间最值查询

注意:

注意字符的处理,要么用getchar()来处理,要么用字符数组来处理。

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>

using namespace std;
const int maxn = 200000;
int tree[4*maxn+5];

void build(int pos, int l, int r){
if(l==r){
scanf("%d", &tree[pos]);
}
else{
int mid = (l+r)>>1;
build(pos<<1, l, mid);
build(pos<<1|1, mid+1, r);
tree[pos] = max(tree[pos<<1], tree[pos<<1|1]);
}
return;
}

void update(int pos, int root, int val, int l, int r){
if(l==r){
tree[root] = val;
}
else{
int mid = (l+r)>>1;
if(pos <= mid)
update(pos, root<<1, val, l, mid);
else
update(pos, root<<1|1, val, mid+1, r);
tree[root] = max(tree[root<<1], tree[root<<1|1]);
}
return;
}

int query(int pos, int x, int y, int l, int r){
if(x<=l && r<=y)
return tree[pos];
else{
int mid = (l+r)>>1, tmp=0;
if(x<=mid)
tmp = max(tmp, query(pos<<1, x, y, l, mid));
if(y>mid)
tmp = max(tmp, query(pos<<1|1, x, y, mid+1, r));
return tmp;
}
}

int main(){
char operat;
int n, m, a, b;
while(scanf("%d%d", &n, &m)!=EOF){
build(1, 1, n);
while(m--){
getchar();
scanf("%c%d%d", &operat, &a, &b);
if(operat=='Q'){
printf("%d\n", query(1, a, b, 1, n));
}
if(operat=='U'){
update(a, 1, b, 1, n);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: