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. Android拍照、摄像方向旋转的问题 代码具体解释

    近期做了个拍照.摄像的应用.遇到了拍照.摄像的图像相对于现实.翻转了90度.原因:相机这个硬件的角度是横屏的角度,所以会出现都是横屏的. 1.照相.摄影预览图像的正确角度显 示: public sta ...

  2. [TypeScript] Transform Existing Types Using Mapped Types in TypeScript

    Mapped types are a powerful and unique feature of TypeScript's type system. They allow you to create ...

  3. Linux如何更新软件源

    Linux软件源的设置方法 1 打开数据源配置文件 vi /etc/apt/sources.list     添加相关的数据源,可以选择以下的数据源,不要写太多,否则会影响更新速度.   之后使用ap ...

  4. DosBox 报错 this program requires dosxnt.exe to be in your path

    也就是少了dosxnt.exe文件,能够上网搜索下载,把dosxnt 拷贝到你挂截文件夹下就能够执行 Dosxnt文件下载

  5. poj1161Post Office【经典dp】

    题目:poj1161Post Officeid=1160" target="_blank">点击打开链接 题意:给出一条直线上的n个坐标表示村庄的位置,然后要在上面 ...

  6. Python中的列表,元组,字符串之间的相互转化

    Python中的列表元组和字符串之间的相互转化需要利用,tuple(),list(),str(). 示例如下: >>> the_string = "hello I'am x ...

  7. xcode7 怎样真机測试

    1. 下载xcode7 能够通过訪问 https://developer.apple.com/xcode/downloads/ 下载最新的xcode7的版本号 只是官网的下载速度太慢了,这个最好百度一 ...

  8. Windows 7旗舰版安装Visual Studio 2013 Ultimate的系统必备及注意事项

    系统必备: 1.Windows7 SP1 2.IE 10

  9. handsontable整理

    hansontable简介 hansontable是一个在线类似Excel的表格编辑器,支持丰富的展现和交互,有多样的单元格类型供配置. 核心是由原生JavaScript构建,充分模块化,支持自定义b ...

  10. git 如何让单个文件回退到指定的版本【转】

    本文转载自:http://blog.csdn.net/ikscher/article/details/43851643 1.进入到文件所在文件目录,或者能找到文件的路径查看文件的修改记录 1 $ gi ...