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 ...
随机推荐
- H5新特性之data-*
简单介绍:html5的data-*能够为标签添加一些自定义的属性和值,并且这种自定义的属性和值可以通过js来获取,十分的便捷 代码: //html<tr th:each="plan : ...
- 微信小程序语音与讯飞语音识别接口(Java),Kronopath/SILKCodec,ffmpeg处理silk,pcm,wav转换
项目需求,需要使用讯飞的语音识别接口,将微信小程序上传的录音文件识别成文字返回 首先去讯飞开放平台中申请开通语音识别功能 在这里面下载sdk,然后解压,注意appid与sdk是关联的,appid在初始 ...
- Win10安装java环境
window系统安装java 一.下载JDK 1.首先需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downl ...
- Java List根据对象的某个属性合并list
package com.test; import java.util.ArrayList; import java.util.List; public class FileTest { public ...
- Concept of function continuity in topology
Understanding of continuity definition in topology When we learn calculus in university as freshmen, ...
- C++类的成员
1.成员变量 成员变量可以是任何类型,如基本数据类型.引用.另一个类的对象或指针.自身类的引用或指针,但不能是自身类的对象: 成员变量不能指定为auto.register.extern 存储类型. 1 ...
- Python实现字符串反转的几种方法
面试遇到的一个特无聊的问题--- 要求:在Python环境下用尽可能多的方法反转字符串,例如将s = "abcdef"反转成 "fedcba" 第一种:使用字符 ...
- Java设计模式之建造者模式(生成器模式)
建造者模式: 也叫生成器模式.用来隐藏复合对象的创建过程,他把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象. 总结一句就是封装一个对象的构造过程,并允许按步骤构造 ...
- 配置ubuntu的超管账号密码
1 在搭建ubuntu 之后 只有自己的账号 2 root 用户是没有配置好的 需要重新配置 3 passwd root 4 输入新密码即可
- 一次国际化记录以及平铺JSON数据
写这个方法的原因是因为我们需要改版国际化,因为相同的项目有其他分支做过国际化,但是主版本没有进行过国际化,目前需要修改主版本的国际化,但是因为国际化的方式做了结构上的调整所以写了这个工具方法方便去 ...