您的位置:首页 > 理论基础 > 数据结构算法

HDU1754-线段树(点更新区间查询)-I Hate It

2017-08-14 12:58 399 查看
https://vjudge.net/problem/HDU-1754

注意,1每次更新的时候要维护最大值

2 查询有三种情况。每种只能进行一个

#include <bits/stdc++.h>
using namespace std;
const int maxn=200006;
struct Node{
int l,r;
int v;//极值
}node[maxn*4];
int a[maxn];
void build(int num,int lef,int rig){
node[num].l=lef;//赋值。
node[num].r=rig;//赋值
if(lef==rig){
node[num].v=a[lef];
return ;
}
int mid=(lef+rig)/2;
build(num<<1,lef,mid);//生成左子树
build(num<<1|1,mid+1,rig);//生成右子树
node[num].v=max(node[num<<1].v,node[num<<1|1].v);//极值
}
void update(int num,int pos,int gg){
//点更新,写成node一样吧
int lef=node[num].l;
int rig=node[num].r;
if(lef==pos&&rig==pos){
node[num].v=gg;
return ;
}
int mid=(lef+rig)/2;
if(mid>=pos)
update(num<<1,pos,gg);
else
update(num<<1|1,pos,gg);//更新右节点。
node[num].v=max(node[num<<1].v,node[num<<1|1].v);
}
int  query(int num,int le,int re){
int lef=node[num].l;
int rig=node[num].r;
if(le==lef&&re==rig){
return node[num].v;
}
//cout<<num<<endl;
int mid=(lef+rig)/2;
int all=-1;
if(mid>=re){//左区间完全包含。
all=max(all,query(num<<1,le,re));
}
else if(mid<le){//右区间完全包含
all=max(all,query(num<<1|1,le,re));
}
else//在其中找最大值
{  all=max(query(num<<1,le,mid),query(num<<1|1,mid+1,re));
}
return all;
}
int main()
{   int m,n;
char c;
int a1,b1;
while(~scanf("%d%d",&m,&n)){
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
}
build(1,1,m);
for(int i=0;i<n;i++){
cin>>c;
scanf("%d%d",&a1,&b1);
if(c=='U'){
update(1,a1,b1);
}
else if(c=='Q'){
printf("%d\n",query(1,a1,b1));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息