一、题目回顾

题目链接:I Hate It

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
 
二、解题思路
【评题】
  • 线段树在区间求最值
  • 简易
  • 直接套模板

【代码】

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 800005;
int arr[maxn>>1];
struct SegTreeNode{
int val;
};
SegTreeNode segTree[maxn]; int Max(int x,int y){return x>=y ? x:y;} void build(int root,int arr[],int istart,int iend)
{
if(istart == iend) //叶子结点
segTree[root].val = arr[istart]; /* 只有一个元素,节点记录该单元素 */
else{
int mid = (istart + iend)/2;
build(2*root,arr,istart,mid); //递归构造左子树
build(2*root+1,arr,mid+1,iend); //递归构造右子树
//根据左右子树根节点的值,更新当前根节点的值
segTree[root].val = Max(segTree[2*root].val,segTree[2*root+1].val); /* 回溯时得到当前node节点的线段信息 */
}
} int query(int root, int nstart, int nend, int qstart, int qend)
{
//查询区间和当前节点区间没有交集
if(qstart > nend || qend < nstart)
return -1;
//当前节点区间包含在查询区间内
if(qstart <= nstart && qend >= nend)
return segTree[root].val;
//分别从左右子树查询,返回两者查询结果的较小值
int mid = (nstart + nend) / 2;
return Max(query(root*2, nstart, mid, qstart, qend),
query(root*2+1, mid + 1, nend, qstart, qend)); }
void updateOne(int root, int nstart, int nend, int index, int addVal)
{
if(nstart == nend)
{
if(index == nstart)//找到了相应的节点,更新之
segTree[root].val = addVal;
return;
}
int mid = (nstart + nend) / 2;
if(index <= mid)//在左子树中更新
updateOne(root*2, nstart, mid, index, addVal);
else updateOne(root*2+1, mid+1, nend, index, addVal);//在右子树中更新
//根据左右子树的值回溯更新当前节点的值
segTree[root].val = Max(segTree[root*2].val, segTree[root*2+1].val);
} int main()
{
int N,M;
while(scanf("%d%d",&N,&M)!=EOF){
for(int i=1;i<=N;i++){
scanf("%d",&arr[i]);
}
getchar(); //6666666666666666666666666666666666666TL
build(1,arr,1,N);
char ch;int a,b;
while(M--){
scanf("%c%d%d",&ch,&a,&b);
getchar(); //6666666666666666666666666666666666
if(ch=='Q'){
printf("%d\n",query(1,1,N,a,b));
}
if(ch=='U'){
updateOne(1,1,N,a,b);
}
}
}
return 0;
}

三、我的收获

①当输入与字符有关时,应考虑回车是否要处理;

②数组空间开的大小与TLE无关,只与MEL有关,也可能与RE有关。

线段树——hdu1754I Hate It的更多相关文章

  1. HDU-1754I Hate It 线段树区间最值

    这道题比较基本,就是用线段树维护区间最值,可以算是模板吧-.. I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768 ...

  2. HDU1754-I Hate It (线段树)

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others ...

  3. hdu1166敌兵布阵&&hdu1754I Hate It(线段树入门)

    单点更新是最最基础的线段树,只更新叶子节点,然后把信息用pushup这个函数更新上来. http://acm.hdu.edu.cn/showproblem.php?pid=1166 update单点更 ...

  4. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  5. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  6. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  7. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  8. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  9. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

随机推荐

  1. Docker官方文档翻译2

    转载请标明出处: https://blog.csdn.net/forezp/article/details/80158062 本文出自方志朋的博客 容器 准备工作 安装Docker,版本为1.13或者 ...

  2. SpringBoot非官方教程 | 第十七篇:上传文件

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot14-upload/ 本文出自方志朋的博客 这篇文 ...

  3. oracle中connect by语句的优化

    很多应用中都会有类似组织机构的表,组织机构的表又通常是典型的层次结构(没有循环节点).于是通过组织控制数据权限的时候,许多人都喜欢通过connect by获得组织信息,然后再过滤目标数据. 在有些情况 ...

  4. iptables应用

    192.168.4.119 为本机的ip地址:每条链的规则是由上至下进行匹配,因此我们需要把范围小的规则放在上面以防被覆盖. 1)清空iptables默认规则,并自定义规则 [root@iptable ...

  5. JS高级. 01 复习JS基础

    1. JavaScript 包含: ____, ____, 和 ____. 2. JavaScript 的基本类型有 ____, ____, 和 ____. 3. JavaScript 的复合类型有 ...

  6. 学习新框架laravel 5.6 (第一天)

    学习新框架第一天. composer 基本命令: composer list 获取帮助信息 composer init 以交互方式填写composer.json文件信息 composer instal ...

  7. CentOS 同步时间的方法

    与时间服务器上的时间同步的方法 1.  安装ntpdate工具 # yum -y install ntp ntpdate 2.  设置系统时间与网络时间同步 # ntpdate cn.pool.ntp ...

  8. 清华大学《C++语言程序设计基础》线上课程笔记01---基础概念与一些注意事项

    使用除法的注意事项 double b = 4.0 * 1/239.0; 因为整数相除结果取整,如果参数写1/239,结果就都是0 浮点数注意事项 浮点数是近似存储,所以不能直接比较两个浮点数的大小, ...

  9. java简单界面实现

    import javax.swing.JFrame; import javax.swing.JPanel; public class DemoFrame extends JFrame{ public ...

  10. 【Java】关于Spring框架的总结 (二)

    上文提到了 Spring 的 IoC 特性和 AOP 特性,只提到个别的实现方法.本文将对 IoC 和 AOP 其他方法进行讲解. 多种方式实现依赖注入 1.设值注入 上文中使用的注入方法:通过 se ...