线段树---HDU1754 I hate it
这个题也是线段树的基础题,有了上一个题的基础,在做这个题就显得比较轻松了,大体都是一样的,那个是求和,这个改成求最大值,基本上思路差不多,下面是代码的实现
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int MAX = * ;
int segment[MAX];
//向上调整
void pushUp(int root)
{
segment[root] = max(segment[root * ], segment[root * + ]);
} void buildTree(int root, int left, int right)
{
if(left == right)
{
scanf("%d", &segment[root]);
return;
}
int mid = (left + right) / ;
buildTree(root * , left, mid);
buildTree(root * + , mid + , right);
//要把跟他上面所有关联的节点都要更新
pushUp(root);
}
//更新节点
void update(int root, int pos, int update_num, int left, int right)
{
if(left == right)
{
segment[root] = update_num;
return;
}
int mid = (left + right) / ;
if(pos <= mid)
{
update(root * , pos, update_num, left, mid);
}
else
{
update(root * + , pos, update_num, mid + , right);
}
pushUp(root);
}
//left和right为查到的区间,L和R为需要查询的区间
int getMax(int root, int left, int right, int L, int R)
{
if(L == left && R == right)
{
return segment[root];
}
int mid = (left + right) / ;
int Max_Num = ;
if(R <= mid)
{
Max_Num = getMax(root * , left, mid, L, R);
}
else if(L > mid)
{
Max_Num = getMax(root * + , mid + , right, L, R);
}
else
{
Max_Num = getMax(root * , left, mid, L, mid);
Max_Num = max(Max_Num, getMax(root * + , mid + , right, mid + , R));
}
return Max_Num;
} int main()
{
int N, M;
while(~scanf("%d %d", &N, &M))
{
memset(segment, , sizeof(segment));
buildTree(, , N);
char ch;
int t1, t2;
for(int i = ; i < M; i++)
{
getchar();
scanf("%c %d %d", &ch, &t1, &t2);
if(ch == 'U')
{
update(, t1, t2, , N);
}
else
{
printf("%d\n", getMax(, , N, t1, t2));
}
}
}
return ;
}
线段树---HDU1754 I hate it的更多相关文章
- [线段树]HDU-1754板子题入门ver
HDU-1754 线段树数组请开到四倍 众所周知数组开小会导致re tle wa等一系列问题orz 板子就是板子,数组从零开始或是从一开始都没什么问题,就是2*root+1还是2*root+2的问题. ...
- 线段树 HDU-1754 I Hate It
附上原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某 ...
- 入手线段树 hdu1754
今天学习了线段树的三个基本操作 建树 更新 查找 先理解下什么是线段树就这个题目而言 如果我们用普通的数组去存放 然后依次遍历访问的话 时间太多了线段树利用了二分的思想 把数据以段的形式进行储存 这样 ...
- 线段树hdu1754
#include<iostream>#include<stdio.h>using namespace std;const int maxa=200005;int val[max ...
- I Hate It(hdu1754)(线段树区间最大值)
I Hate It hdu1754 Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU1754 && HDU1166 线段树模板题
HDU1754 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 题目分析:对于给出的一个很长的区间,对其进行单点更新值和区间求最大值的操作,由于 ...
- HDU1166(线段树 +更新单点,求区间总和)、HDU1754(线段树 + 更新单点,求区间最大值)
线段树简单应用 先附上几张图便与理解,大佬文章传送门1.传送门2 HDU1166:题目描述 线段树 +更新单点,求区间总和 代码如下(递归版) #include<iostream> #in ...
- hdu1754 I hate it线段树模板 区间最值查询
题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...
- hdu1754 基础线段树
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
随机推荐
- GetComponents和FindObjectsOfTypeAll区别
本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/Unity_GetComponent.html GetComponents获得的是当 ...
- 【USACO 1.3.4】牛式
[題目描述 ] 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. * * * x * * ---------- * * * * * * ------- ...
- Mysql 应该选择什么引擎
对于如何选择存储引擎,可以简答的归纳为一句话:“除非需要用到某些INNODB 不具备的特性,并且没有其他办法可以替代,否则都应该选择INNODB 引擎”.例如:如果要用到全文索引,建议优先考虑INNO ...
- javascript 向上滚动
<html xmlns="http://www.w3.org/1999/xhtml"><head> <meta http-equiv="Co ...
- DIV隐藏与重显
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- php防止SQL注入详解及防范
SQL 注入是PHP应用中最常见的漏洞之一.事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义( ...
- CSU 1160(进制问题)
CSU 1160 Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Descrip ...
- 大数据学习之测试hdfs和mapreduce(二)
上篇已经搭建好环境,本篇主要测试hadoop中的hdfs和mapreduce功能. 首先填坑:启动环境时发现DataNode启动不了.查看日志 从日志中可以看出,原因是因为datanode的clust ...
- JS 输出与变量
1. JS的输出 innerHTML: <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- 实现一个基于tcc/tlink的简单的编译链接工具
一.基础研究 在这里我们需要提供一套新的c语言开发工具cc,它支持的c程序不是从main开始运行而是从CMain开始运行. 书上已经对该工具程序进行了需求分析:(1)要在屏幕中间显示彩色的字符串:(2 ...