我是靠谱客的博主 矮小服饰,最近开发中收集的这篇文章主要介绍HDOJ 1754 ------线段树,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目大意:

       输入N,M,表示有N个学生,M次操作,操作主要有两种查询[A,B]内分数最高的学生 (2) 更新 将A学生的分数修改为 B。

算法思想:

      主要使用线段树的,单点更新,和区间查询操作。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt << 1|1
using namespace std;
const int MAXN=222222;
int Max[MAXN<<2];
void PushUp(int rt){
Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);//孩子节点中的最大值
}
void Build(int l,int r,int rt){
if(l==r){
scanf("%d",&Max[rt]);
return ;
}
int m=(l+r)>>1;
Build(lson);
Build(rson);
PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){//包含了所有区间
return Max[rt];
}
int m=(l+r)>>1;
int ret=0;
if(L<=m) ret=max(ret,Query(L,R,lson));
if(R>m) ret=max(ret,Query(L,R,rson));
return ret;
}
void Update(int p,int sc,int l,int r,int rt){
if(l==r)//只有一个节点
{
Max[rt]=sc;
return ;
}
int m=(l+r)>>1;
if(p<=m) Update(p,sc,lson);
else
Update(p,sc,rson);
PushUp(rt);
}
int main(){
int N,M,A,B;
char C;
while(scanf("%d%d",&N,&M)!=EOF)
{
Build(1,N,1);
while(M--){
char op[2];
scanf("%s%d%d",op,&A,&B);
if(op[0]=='Q')
printf("%dn",Query(A,B,1,N,1));
else
Update(A,B,1,N,1);
}
}
return 0;
}


最后

以上就是矮小服饰为你收集整理的HDOJ 1754 ------线段树的全部内容,希望文章能够帮你解决HDOJ 1754 ------线段树所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

相关文章

JavaWeb笔记-备份下Java中map的entrySet()方法返回的是什么内容啊?servlet 有参数的init方法和无参数的init方法一个常见错误List<Object>和List<String>
JavaWeb笔记-备份下Java中map的entrySet()方法返回的是什么内容啊?servlet 有参数的init方法和无参数的init方法一个常见错误List和List

评论列表共有 0 条评论