Problem Description

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input

本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
学生ID编号分别从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。
当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。

Output

对于每一次询问操作,在一行里面输出最高成绩。

Sample Input

5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5

Sample Output

5
6
5
9

解题思路:这是线段树的一道入门题目,关于线段树的讲解,看看大牛之作吧,线段树详解 (原理,实现与应用) 每次看都有深刻的理解,好了,相关注解就看代码吧!

AC代码:

 #include<bits/stdc++.h>
using namespace std;//思路:将编号划分区间,进行建树,然后有数据的更新,删除,查询
const int maxn = ;
int a,b,q[maxn],t[maxn<<];//a,b是操作数,q是存放学生成绩,t是建树的节点数,t数组的长度一般是原数据的长度的4倍,来记录区间的最大值
void build(int l,int r,int x)//建树
{
int mid=(l+r)>>;//取中间值
if(l==r){//区间只有一个正数,即叶子节点的值就是q数组中保存的值
t[x]=q[mid];
return;
}
build(l,mid,x<<);//递归建立左子树2*x
build(mid+,r,x<<|);//递归建立右子树2*x+1
t[x]=max(t[x<<],t[x<<|]);//建立完左子树和右子树之后返回到父节点,此时父节点的值等于左右子树的最大值
}
int query(int l,int r,int x)//查询
{//[a,b]、[l,r]
if(a<=l && b>=r)return t[x];//如果该节点表示的区间恰好是要查询的区间,直接返回结果,即[l,r]是[a,b]的一个子集,直接返回最大值
else{
int mid=(l+r)>>;
if(b<=mid)return query(l,mid,x<<);//判断(编号)区间在哪棵子树上[a,b]在[l,r]的左子树[l,mid]上
else if(a>mid)return query(mid+,r,x<<|);//[a,b]在[l,r]的右子树[mid+1,r]上
else return max(query(l,mid,x<<),query(mid+,r,x<<|));//表示[a,b],有一部分在[l,mid]上,有一部分在[mid+1,r]上,直接返回左右区间的最大值
}
}
void modify(int l,int r,int x)//更新节点,更改值,x为编号
{//[l,r],此时的a为学生编号ID、b为成绩值
if(l==r){//找到叶子节点
t[x]=b;//把a的成绩改成b的成绩
return;
}
int mid=(l+r)>>;//判断更新节点在哪棵树上
if(a<=mid){modify(l,mid,x<<),t[x]=max(t[x<<],t[x<<|]);}//如果编号a在[l,mid]上,递归修改,直到叶子节点,返回到父节点时,父节点保存左右子树的最大值
else{modify(mid+,r,x<<|),t[x]=max(t[x<<],t[x<<|]);}//同时更新节点的最大值
}//回溯的时候将所有的父节点给更新了
int main()
{
int m,n;char ch;
while(~scanf("%d %d",&n,&m)){
for(int i=;i<=n;++i)scanf("%d",&q[i]);
build(,n,);//建树
while(m--){
getchar();//吃掉回车符的影响
scanf("%c %d %d",&ch,&a,&b);
if(ch=='Q')printf("%d\n",query(,n,));//返回最大值
else modify(,n,);//进行修饰
}
}
return ;
}

题解报告:hdu 1754 I Hate It(线段树)的更多相关文章

  1. hdu 1754 I Hate It 线段树 点改动

    // hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bits ...

  2. HDU 1754 I Hate It 线段树RMQ

    I Hate It Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=175 ...

  3. HDU 1754 I Hate It(线段树之单点更新,区间最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. HDU 1754 I Hate It(线段树单点替换+区间最值)

    I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...

  5. HDU 1754 I Hate It(线段树区间查询,单点更新)

    描述 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老 ...

  6. hdu 1754 I Hate It 线段树基础题

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...

  7. HDU 1754 I Hate It 线段树单点更新求最大值

    题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...

  8. HDU 1754 I Hate It (线段树)

    题意:略. 析:裸的线段树. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include < ...

  9. HDU 1754 I Hate It (线段树)

    题目链接 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老 ...

  10. hdu 1754 I Hate It(线段树水题)

    >>点击进入原题测试<< 思路:线段树水题,可以手敲 #include<string> #include<iostream> #include<a ...

随机推荐

  1. 【Nginx】发送响应

    请求处理完毕后,需要向用户发送http响应,告知客户端Nginx的执行结果.http响应主要包括响应行.响应头部.包体三部分.发送http响应时需要执行发送http头部(发送http头部时也会发送响应 ...

  2. [Bash] Create nested folder in Bash

    We can create a single folder by doing: mkdir onefolder If we want to create nested folder we need t ...

  3. 微信小程序之 Tabbar(底部选项卡)

    1.项目目录 2.在app.json里填写:tab个数范围2-5个 app.json { "pages": [ "pages/index/index", &qu ...

  4. python菜鸟日记1

    1. 在__init__(self,...)初始化函数中.定义对象的属性,这些属性不用所有写在括号里,括号里的表示定义的时候须要赋初始值的一些属性,而其它不用初始值的属性.能够 直接卸载代码块中,se ...

  5. LoadRunner关联需要转义的常见字符

    转义字符总结 在做手动关联时,取边界值的时候,会经常用到转义字符,现将转义字符整理如下: \b 退格             \f 换页             \n 换行             \ ...

  6. C#调用国家气象局天气预报接口

    原文:C#调用国家气象局天气预报接口 一.需求 最近,刚好项目中有天气预报查询功能的需求,要求录入城市名称,获取该城市今日天气信息及相关气象生活辅助信息等. 例如:查询北京市天气 结果为: 今日北京天 ...

  7. 一起talk C栗子吧(第一百二十四回:C语言实例--内置宏)

    各位看官们,大家好,上一回中咱们说的是显示变量和函数地址的样例,这一回咱们说的样例是:内置宏.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在编译程序的时候,假设有语法错误,编译器就 ...

  8. Cocos2d-X-3.0 之后的版本的环境搭建

     Cocos2d-X-3.0 之后的版本的环境搭建 由于cocos2d游戏开发引擎更新十分频繁,官方文档同步不够及时和完善.所以不要照着官方文档来照做生成工程. <点击图片就能进入网站> ...

  9. 解决CentOS java环境不生效的问题

    查看当前java版本 [root@localhost jdk1.6.0_45]# java -version openjdk version "1.8.0_65" OpenJDK ...

  10. 嵌入式开发之davinci--- 8148/8168/8127 中的图像处理vpss link dei、sclr、swms、Mosaic’s

    vpss 中的link (1)dei dei 主要做数据交错处理,带缩放 dei control data flow: (2)sclr 8168中支持缩放按比例的分子和分母,只支持缩小,貌似不支持放大 ...