B - I Hate It
题目:

题目网址:Problem - 1754 (hdu.edu.cn)
思路:
利用线段树存储区间内的最大值对应操作进行输出;
代码实现:
#include <iostream> #include <algorithm> using namespace std; const int maxn=200005; int s[maxn],tree[maxn*4]; void bj(int rt)//对左右孩子进行最值判断 { tree[rt]=max(tree[rt*2],tree[rt*2+1]); } void build(int l,int r,int rt)//构造线段树 { if(l==r)//递归出口 { tree[rt]=s[l]; return ; } int mid=(l+r)/2;//区间中间值 build(l,mid,rt*2);//对左右孩子进行递归 build(mid+1,r,rt*2+1); bj(rt); } int query(int L,int R,int l,int r,int rt)//查询 { if(L<=l && R>=r)//递归出口区间在所给区间内 return tree[rt]; int mid=(l+r)/2; int ret=0; if(L<=mid)//判断递归左右孩子 ret=max(ret,query(L,R,l,mid,rt*2)); if(R>mid) ret=max(ret,query(L,R,mid+1,r,rt*2+1)); return ret; } void update(int L,int s,int l,int r,int rt)//更新数据 { if(l==r)//递归出口 { tree[rt]=s; return ; } int mid=(l+r)/2; if(L<=mid)//判断递归方向 update(L,s,l,mid,rt*2); else update(L,s,mid+1,r,rt*2+1); bj(rt); } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1; i<=n; i++) scanf("%d",&s[i]);//数据都存入 build(1,n,1);//线段树的构建 int a,b; char ch; while(m--) { scanf(" %c%d%d",&ch,&a,&b);//操作输入 if(ch=='Q')//对应操作进行处理 printf("%d\n",query(a,b,1,n,1)); else update(a,b,1,n,1); } } return 0; }

浙公网安备 33010602011771号