HDU 1754 线段树入门解题报告
---恢复内容开始---
题意:给定区间,每个人的成绩, Q次询问,求每次询问区间中的最大值
思路:构造线段树
代码:
#include<stdio.h>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std; int n, m, ans;
string str; struct Tree
{
int left, right, maxx;
}tree[ * ]; //线段树开4倍空间 void build(int left, int right, int k)
{
tree[k].left = left, tree[k].right = right;
if(left == right)
{
scanf("%d", &tree[k].maxx);
return ;
}
int mid = (left + right) / ;
build(left, mid, * k);
build(mid + , right, * k + );
tree[k].maxx = max(tree[ * k].maxx, tree[ * k + ].maxx); //向上回溯最大值记录
} void update(int find_node, int up_num, int k)//单点修改
{
if(tree[k].left == find_node && tree[k].right == find_node)
{
tree[k].maxx = up_num;
return ;
}
int mid = (tree[k].left + tree[k].right) / ;
if(find_node <= mid)
update(find_node, up_num, * k);
else
update(find_node, up_num, * k + ); //修改过后回溯修改最大值
tree[k].maxx = max(tree[ * k].maxx, tree[ * k + ].maxx);
} void query(int find_left, int find_right, int k)//区间查询取最大值
{
if(find_left == tree[k].left && find_right == tree[k].right)
{
ans = max(ans, tree[k].maxx);
return ;
}
int mid = (tree[k].left + tree[k].right) / ;
if(find_right <= mid)
query(find_left, find_right, * k);
else if(find_left > mid)
query(find_left, find_right, * k + );
else
{
query(find_left, mid, * k);
query(mid + , find_right, * k + );
}
} int main()
{
int a, b;
while(scanf("%d%d", &n, &m)!=EOF)
{
build(, n, );
for(int i = ; i <= m; i ++)
{
cin >> str;
if(str == "U")
{
scanf("%d%d", &a, &b);
update(a, b, );
}
else
{
ans = -;
scanf("%d%d", &a, &b);
query(a, b, );
printf("%d\n", ans);
}
}
}
return ;
}
HDU 1754 线段树入门解题报告的更多相关文章
- hdu 1754 线段树入门
线段树点修改 区间最大值查询 #include <cstdio> #include <cstdlib> #include <cmath> #include < ...
- POJ 3264 线段树入门解题报告
题意:给n个值, Q次询问, 每次询问给定一个区间, 要求输出该区间最大最小值之差 思路:暴力的话每次询问都要遍历多次for循环一定会超时, 用线段树记录区间的信息(左边界右边界, 该区间最大值最小值 ...
- hdu 1754 线段树(Max+单点修改)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU(1754),线段树,单点替换,区间最值
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 线段树模板题,update功能是单点替换,query是访问区间最大值. #include < ...
- HDU 1754线段树基本操作,建树,更新,查询
代码线段树入门整理中有介绍. #include<cstdio> #include<algorithm> #include<cstring> #include< ...
- hdu 1754 I Hate It 解题报告(线段树 代码+注释)
题目链接:传送门 I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU - 1754 线段树-单点修改+询问区间最大值
这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...
- [NOIP2016 DAY1 T2]天天爱跑步-[差分+线段树合并][解题报告]
[NOIP2016 DAY1 T2]天天爱跑步 题面: B[NOIP2016 DAY1]天天爱跑步 时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 2s Description ...
随机推荐
- WPF 单个触发器、多个触发器、多条件触发器
Trigger的使用.利用Trigger对象,我们可以接收到属性变化或者事件发生,并据此做出适当的响应.Trigger本身也是支持多种类型的,下面是一个属性Trigger的例子: <Style ...
- python基础之常用关键字总结
前言 到python3.6为止,python内置的关键字有33个,比python2.7的版本多了2个.下面总结一下python3的关键字的使用. python内置关键字 解释器在加载上下文的时候,如果 ...
- SpringBoot Mybatis项目中的多数据源支持
1.概述 有时项目里里需要抽取不同系统中的数据源,需要访问不同的数据库,本文介绍在Springboot+Mybatis项目中如何支持多数据源操作. 有需要的同学可以下载 示例代码 项目结构如下: 2. ...
- 【Android】onNewIntent调用时机
在IntentActivity中重写下列方法:onCreate onStart onRestart onResume onPause onStop onDestroy onNewIntent一.其他应 ...
- 执行Python出现LookupError: unknown encoding: cp65001解决办法
执行Python出现LookupError: unknown encoding: cp65001错误 dos下执行以下命令即可 chcp 以上.
- 省市区地址三级联动jQuery插件Distpicker使用
插件下载地址 http://www.jq22.com/jquery-info8054 效果如下: 使用: 1.引入js <script src="http://www.jq22.com ...
- 2017-11-8—自动控制原理在软硬件方面上的应用和体现
这个话题讲起来是非常大的,先贴一下百度百科的定义: 自动控制(automatic control)是指在没有人直接参与的情况下,利用外加的设备或装置,使机器.设备或生产过程的某个工作状态或参数自动地按 ...
- Promise 用法
Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 Promise的构造函数接收一个参数,是 ...
- pycharm的一些快捷键
[转]pycharm的一些快捷键 忙了好一阵终于忙完了,最近在重构代码,有许多地方要注释什么的,在多行注释时总是很麻烦,就想着pycharm有没有快捷键,就像visual studio一样.于是上Go ...
- element-ui中上传文件upload
<el-upload class="upload-demo" name="targetFile" ref="upload" :with ...