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;
}
思路:
线段树,实现单点更新,区间最值查询
注意:
注意字符的处理,要么用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;
}
相关文章推荐
- kuangbin专题七 : B题 :HDU 1754 I Hate It(线段树单点更新区间查询最值)
- hdu 1754 I Hate It(线段树单点更新及区间最值)
- HDU 1754 I hate it(线段树。单点更新, 区间查询)
- HDU 1754 I Hate It(线段树单点更新区间最值查询)
- hdu 1754 I Hate It(线段树单点更新(a位置的值变成b)+区间求最值)
- HDU 1754 I Hate It(线段树单点更新+区间求最值)
- hdu 1754 I Hate It(线段树单点更新求区间最大值)
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
- HDU 1754-I Hate It(线段树:单点更新,区间最值)
- hdu 1754 I Hate It(线段树之 单点更新+区间最值)
- HDU - 1754 I Hate It(简单线段树 单点更新+区间查询)
- HDU 1754 I Hate It(简单线段树-单点更新,区间询问)
- HDU 1754 I Hate It(线段树:单点更新,求区间最大值)
- HDU 1754 I Hate It(线段树 单点更新 区间最大值)
- hdu 1754 I Hate It(线段树,单点更新,区间最值)
- HDU - 1754 I Hate It (线段树 单点更新区间查询)
- hdu 1754 I Hate It 线段树 单点更新
- HDOJ 题目1754 I Hate It(线段树单点更新,求区间最大值)
- 线段树单点更新 hdu 1754 I Hate It
- 线段树(单点更新) HDU 1754 I Hate It