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. 简述HashMap和Hashtable的差别

    1.HashMap继承AbstractMap类. Hashtable继承了Dictionary类. 2.HashMap同意有null的键和值.       Hashtable不同意有null的键和值. ...

  2. Windows7系统下优化固态硬盘

    一.AHCI硬盘模式可提高硬盘性能,确定你的固态硬盘是运行在AHCI模式下,打开“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servicesmsahci” ...

  3. vue + vue-lazyload 实现图片懒加载

    1.安装 npm i vue-lazyload -S 2.配置 main.js /***图片模板等懒加载 start ***/ import VueLazyload from 'vue-lazyloa ...

  4. 解决cell切割线不是全屏问题

    if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) { [_tableView setSeparatorInset:U ...

  5. android &lt;application&gt; 开发文档翻译

    由于本人英文能力实在有限,不足之初敬请谅解 本博客仅仅要没有注明"转",那么均为原创.转贴请注明本博客链接链接 <application>语法:    <appl ...

  6. 使用7zip压解各种文件的经常使用命令

    7zip简单介绍 格式支持 压缩解压缩 仅支持解压缩 安装 Debian Ubuntu ArchLinux 使用 打包 解压 列出文件的信息列表 检查包的完整性 更新压缩包 删除包里的文件 7zip简 ...

  7. 行转列--Excel和数据库的完美结合

    入职到如今已经有一段时间了,除了不断完好新功能外,线上运维也是一项非常重要的任务,每天都须要占用一 定量的时间来处理,这时候如何高效准确的来解决这些问题是非常值得考虑的.       今天客服人员给我 ...

  8. JSON with Java

    work with json-lib.jar import net.sf.json.JSONArray;import net.sf.json.JSONException;import net.sf.j ...

  9. YTU 2904: B--Faultfinding

    2904: B--Faultfinding 时间限制: 1 Sec  内存限制: 128 MB 提交: 64  解决: 33 题目描述 Do you remember the game in whic ...

  10. YTU 1006: Hero In Maze

    1006: Hero In Maze 时间限制: 1000 Sec  内存限制: 64 MB 提交: 72  解决: 22 题目描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人 ...