HDU -1754线段树
2013-07-30 15:12
190 查看
一道经典线段树入门题:query: 区间最大,Update: 单点更新;
#include<cstdio>
#define M 220000
struct node{
int l,r;
int val;
}tree[M*4];
inline int max(int a,int b){ //为了提高运行速度,加内置函数,另外,除法用移位代替。
return a>b?a:b; //乘法用加法代替。
}
void build(int l,int r,int d){
tree[d].l=l;
tree[d].r=r;
tree[d].val=0;
if(l==r){
scanf("%d",&tree[d].val);
return;
}
int mid=(r+l)>>1;
build(l,mid,d<<1); //移位>加,减法> 乘,除法(运算速度)
build(mid+1,r,d+d+1);
tree[d].val=max(tree[d<<1].val,tree[d+d+1].val);
}
void Update(int p,int date,int d){
if(tree[d].r==p&&tree[d].l==p){
tree[d].val=date;
return ;
}
int mid=(tree[d].l+tree[d].r)>>1;
if(p<=mid) Update(p,date,d<<1);
if(p>mid) Update(p,date,d+d+1);
tree[d].val=max(tree[d<<1].val,tree[d+d+1].val);
}
int search(int l,int r,int d){
if(tree[d].l==l&&tree[d].r==r){
return tree[d].val;
}
int mid=(tree[d].l+tree[d].r)>>1;
if(r<=mid) return search(l,r,d<<1);
if(l>mid) return search(l,r,d+d+1); //严重注意d<<1+1是不行的啊,这相当于d*4。
if(l<=mid&&r>mid)
return max(search(l,mid,d<<1),search(mid+1,r,d+d+1));
}
int main(){
int i,n,m,l,r;
char op[2];
while(~scanf("%d %d",&n,&m)){
build(1,n,1);
while(m--){
scanf("%s %d %d",op,&l,&r);
if(op[0]=='Q') printf("%d\n",search(l,r,1));
else Update(l,r,1);
}
}
return 0;
}
#include<cstdio>
#define M 220000
struct node{
int l,r;
int val;
}tree[M*4];
inline int max(int a,int b){ //为了提高运行速度,加内置函数,另外,除法用移位代替。
return a>b?a:b; //乘法用加法代替。
}
void build(int l,int r,int d){
tree[d].l=l;
tree[d].r=r;
tree[d].val=0;
if(l==r){
scanf("%d",&tree[d].val);
return;
}
int mid=(r+l)>>1;
build(l,mid,d<<1); //移位>加,减法> 乘,除法(运算速度)
build(mid+1,r,d+d+1);
tree[d].val=max(tree[d<<1].val,tree[d+d+1].val);
}
void Update(int p,int date,int d){
if(tree[d].r==p&&tree[d].l==p){
tree[d].val=date;
return ;
}
int mid=(tree[d].l+tree[d].r)>>1;
if(p<=mid) Update(p,date,d<<1);
if(p>mid) Update(p,date,d+d+1);
tree[d].val=max(tree[d<<1].val,tree[d+d+1].val);
}
int search(int l,int r,int d){
if(tree[d].l==l&&tree[d].r==r){
return tree[d].val;
}
int mid=(tree[d].l+tree[d].r)>>1;
if(r<=mid) return search(l,r,d<<1);
if(l>mid) return search(l,r,d+d+1); //严重注意d<<1+1是不行的啊,这相当于d*4。
if(l<=mid&&r>mid)
return max(search(l,mid,d<<1),search(mid+1,r,d+d+1));
}
int main(){
int i,n,m,l,r;
char op[2];
while(~scanf("%d %d",&n,&m)){
build(1,n,1);
while(m--){
scanf("%s %d %d",op,&l,&r);
if(op[0]=='Q') printf("%d\n",search(l,r,1));
else Update(l,r,1);
}
}
return 0;
}
相关文章推荐
- HDU 1754 - I Hate It (线段树 单点更新)
- HDU 1754 I Hate It 【线段树 (单点替换 区间最值】
- hdu1754___I Hate It (线段树)
- hdu 1754 线段树区间最大值 单点更新
- HDU 1754 I Hate It(线段树:单点替换,区间最值)
- HDU 1754 I Hate It (RMQ线段树)
- HDU 1754 I Hate It 线段树入门
- HDU--1754(线段树,单点更新)
- hdu1754(线段树)
- HDU1754_I Hate It(线段树/单点更新)
- hdu 1754 I Hate It (线段树--求区间最大值)(基础)
- 【线段树】HDU 1754---I Hate It
- hdu_1754,线段树单点更新,求区间最值
- HDU 1754 I Hate It (线段树)
- hdu 1754(线段树)
- HDU 1754 I hate it(线段树。单点更新, 区间查询)
- HDU 1754:I Hate It(线段树-单点更新)
- HDU 1754 I Hate It(基础线段树~)
- HDU 1754 I Hate It(线段树:单点替换,区间最值)
- 【线段树 Splay】 hdu 1754 I Hate It