Tido 习题-二叉树-最高分
题目描述
现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
输入
每组输入第一行是两个正整数N和M(0<N<=30000,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。
输出
样例输入 Copy
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
样例输出 Copy
5
6
5
9
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
const int SIZE=;
int a[SIZE];
struct SegmentTree{
int l,r;
int dat;
} t[SIZE*];//struct数组存储线段树
void build(int p,int l,int r){
t[p].l=l;t[p].r=r;//节点p表示区间l-r
if(l==r){
t[p].dat=a[l];
return;
}//叶节点
int mid=(l+r)/;//折半
build(p*,l,mid);//左子节点[l,mid],编号p*2
build(p*+,mid+,r); //右子节点[mid+1,r],编号p*2+1
t[p].dat=max(t[p*].dat,t[p*+].dat);//从下往上传递信息 }
int ask(int p,int l,int r)//查询区间最大值
{
if(l<=t[p].l&&r>=t[p].r)//完全包含
return t[p].dat;
int mid=(t[p].l+t[p].r)/;
int val=-(<<);//无穷小
if(l<=mid) val=max(val,ask(p*,l,r));//左子节点有重叠
if(r>mid) val=max(val,ask(p*+,l,r)); //右子节点有重叠
return val;
}
void change(int p,int x,int v){//单点修改
if(t[p].l==t[p].r){//找到叶节点
t[p].dat=v;
return;
}
int mid=(t[p].l+t[p].r)/;
if(x<=mid) change(p*,x,v);//x属于左半区间
else change(p*+,x,v); //x属于右半区间
t[p].dat=max(t[p*].dat,t[p*+].dat);//从下往上更新信息
}
int main()
{
int n,m;
while(cin>>n>>m){ memset(a,,sizeof(a));
for(int i=;i<=n;i++)
cin>>a[i];
build(,,n);
for(int i=;i<=m;i++){
char c;
cin>>c;
int a,b;
cin>>a>>b;
if(c=='Q'){
cout<<ask(,a,b)<<endl;
}
if(c=='U')
change(,a,b);
}
}
return ;
}
通过线段树可以快速进行单点更新 和 查询区间最大值
相当于一个非常巧妙的递归
先从上往下到叶节点
再将叶节点往上不断进行比较取出最大值
再从下回到起点
至于线段树的讲解
可以先看一下下面的讲解哦
https://www.cnblogs.com/Tidoblogs/p/10887555.html
Tido 习题-二叉树-最高分的更多相关文章
- Tido 习题-二叉树-树状数组求逆序对
这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述 样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示 #include<iostream ...
- Tido 习题-二叉树-树状数组实现
题目描述 这就是一个简单的树状数组入门题 可以动态地进行区间和查询 随时可能会进行更新 #include<iostream> #include<cstdio> #inclu ...
- Tido 习题-二叉树-区间查询
题目描述 食堂有N个打饭窗口,现在正到了午饭时间,每个窗口都排了很多的学生,而且每个窗口排队的人数在不断的变化.现在问你第i个窗口到第j个窗口一共有多少人在排队? 输入 输入的第一行是一个整数T,表示 ...
- N个元素组成二叉树的种类
<算法>中的二叉查找树一节的一道习题. N个元素组成的二叉树固定一个根节点,这个根节点的左右子树组合数为(0,n-1),(1,n-2),(2,n-3)...(n-1,0),假设N个元素组成 ...
- 算法(第四版)C# 习题题解——2.5
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...
- 算法(第四版)C# 习题题解——2.4
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...
- 算法(第四版)C# 习题题解——2.2
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更为方便的版本见:http ...
- sql习题及答案
sql习题:http://www.cnblogs.com/wupeiqi/articles/5729934.html 习题答案参考:https://www.cnblogs.com/wupeiqi/ar ...
- 6-11-N皇后问题-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第6章 树和二叉树 - N皇后问题 ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本 ...
随机推荐
- Java--基础命名空间和相关东西(JAVA工程师必须会,不然杀了祭天)
java.lang (提供利用 Java 编程语言进行程序设计的基础类)java.lang.annotation(提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互)java.lang.inst ...
- C++一个简单的手柄类模板
#ifndef HANDLE_H #define HANDLE_H #include "Animal.h" template <typename T> class Ha ...
- eclipes中配置javadoc文档
- 在.net MVC项目中使用ajax进行数据验证
1.首先要在网页引入应该引入的js文件 在这里回顾一下在模板页里面挖坑的技术 2.在html中使用html辅助方法 3.验证模型 4验证方法
- 移动浏览器Chrome 32 for Android移除300ms点击推迟
在手机浏览器的一篇文章翻译300ms延迟实用文章,原文地址 http://updates.html5rocks.com/2013/12/300ms-tap-delay-gone-away 去掉移动设 ...
- 黑科技 —— OTG 线
OTG:On-The-Go的缩写: OTG 可将鼠标.键盘等一切终端(terminal)连接起来: OTG 技术就是实现在没有 Host 的情况下,实现从设备间的数据传送.(支持传送,显然也支持要求更 ...
- 编写可移植C/C++程序的要点(12条)
1.分层设计,隔离平台相关的代码.就像可测试性一样,可移植性也要从设计抓起.一般来说,最上层和最下层都不具有良好的可移植性.最上层是GUI,大多数GUI都不是跨平台的,如Win32 SDK和MFC.最 ...
- DRP-ThreadLocal简单的理解
简单就是jar一类套餐包.在一个简单的事情是一个工具类!该工具可以做?该工具被用来写多线程程序,行.多线程是有效的.你只能去网上找资料,由于今天我们仅仅来介绍ThreadLocal的知识. 我们来 ...
- v-charts显示标题
使用v-charts的时候,如果要显示标题需要以下操作 1. 加入:title props <ve-pie :title="chartTitle" :data="c ...
- 2-16 mysql主从复制
1. 部署MYSQL主从同步 <M-S> 环境:mysql版本一致,均为5.7.18 master xuegod4 ip 192.168.10.34 数据库密码 yourpassw ...