HDU1754 I Hate It 线段树入门题复习

线段树--概念+模板+入门题 引子 子问题–1 给出n个数,m次问询,每次问询给出一个范围l、r,求区间l–r的总和 很容易想到用前缀和可以解决 O(n) 子问题–2 给出n个数,m次修改,每次给出一个范围l、r和一个值k,将区间l—r的数全部+k,m次修改后,再问询1次求区间l–r的总和 也可以想到这用差分就能解决 O(n) 最后将这两个问题结合起来,给出n个数,m次操作,操作有两种一个是将区间l–r的值+k,一个是询问区间l–r的总和。 这个问题与之前不同的地方是,之前想要求一个范围只需处理一次数据算前缀和,然后数据不变,可以一 阅读详情

I Hate It

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 63408    Accepted Submission(s): 24617


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
思路:跟上一题(区间求和)差不多,sum[now]=sum[leftson]+sum[rightson] 换成 res[now]=max(res[leftson],res[rightson]);
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=200005;
int res[maxn*4];
void buildtree(int l,int r,int pos)
{
if(l==r){scanf("%d",&res[pos]);return;}
int mid=(l+r) >>1;
buildtree(l,mid,pos<<1);
buildtree(mid+1,r,pos<<1|1);
res[pos]=max(res[pos<<1],res[pos<<1|1]);
}
void update(int l,int r,int pos,int value,int end)
{
if(l==r){res[pos]=value;return;}
int mid=(l+r)>>1;
if(end<=mid)update(l,mid,pos<<1,value,end);
else update(mid+1,r,pos<<1|1,value,end);
res[pos]=max(res[pos<<1],res[pos<<1|1]);
}
int query(int l,int r,int ql,int qr,int pos)
{
int ans=0;
int mid=(l+r)>>1;
if(ql<=l&&r<=qr)return res[pos];
else
{
if(ql<=mid)ans=max(query(l,mid,ql,qr,pos<<1),ans);
if(qr>mid)ans=max(query(mid+1,r,ql,qr,pos<<1|1),ans)
}
return ans;
}
int main()
{
int n,m;
char q[10];
while(scanf("%d%d",&n,&m)==2)
{
buildtree(1,n,1);
while(m--)
{
int a,b;
scanf("%s%d%d",q,&a,&b);
if(q[0]=='U')
{
update(1,n,1,b,a);
}
else if(q[0]=='Q')
{
printf("%d\n",query(1,n,a,b,1));
}
}
}
}

2024年全国青少年信息素养大赛复赛真题(算法创意实践挑战赛C++试卷:带解析) 阅读详情

相关推荐

基于Android Studio的校园智能点餐系统开发实战(附完整源码与部署指南)

本文详细介绍了基于Android Studio开发校园智能点餐系统的完整流程,包括需求分析、环境搭建、数据库设计、客户端与后台功能实现。系统采用SSM框架和MySQL数据库,解决了校园食堂高峰期排队问题,提供高效的点餐体验。附完整源码与部署指南,助力开发者快速构建类似应用。

weixin_29015801的博客 559

线段树入门 + 例题

目录 一、线段树简介 1、导入线段树 2、线段树的常识 二、线段树的操作 1、建树 2、区间查询 3、区间修改 一、线段树简介 1、导入线段树 如题,已知一个数列,每次操作读入 X : X==1 将[L,R]区间每一个数加上k。 X==2 求出某区间每一个数的和。 这是洛谷的P3372,在你没学线段树之前,有两种很简单地方法: 方法一 方法二 名称 暴力 前缀和 区间加 k 1 R...

m0_61405003的博客 601

【S32K】S32K144入门笔记(3) SPI(lpspi组件)

0. 引言 与第二篇can对应,第三篇本来想写lin的,毕竟都是车身上常用的总线。但是lin比较麻烦,所以先拖后一下,先把SPI记录一下。 SPI在我们的系统架构中是S32K和ADAS之间做数据传输用的,毕竟速率够高,数据量能传的比较大。 1. 准备 1.1 SPI基础知识 1.2 开发环境 1.2.1 软件开发环境 1.2.2 硬件环境 SPI 2. Demo ...

YoYo的桃子树 2万+

浅谈线段树

数据结构——线段树 O、引例 A.给出n个数,n<=100,和m个询问,每次询问区间[l,r]的和,并输出。 一种回答:这也太简单了,O(n)枚举搜索就行了。 另一种回答:还用得着o(n)枚举,前缀和o(1)就搞定。 那好,我再修改一下题...

weixin_33716941的博客 445

Sharding Sphere JDBC使用Mybatis的saveBatch无法返回主键的问题

Sharding Sphere JDBC使用Mybatis的saveBatch无法返回主键的问题

HHCS231的博客 1829

Uncertainty-Aware Mean Teacher(UA-MT)

本文提出了一种新的基于不确定性的半监督学习框架(UA-MT),通过额外利用未标记的数据从3D MR图像中分割左心房。具体地说,本文建立了一个教师模型和一个学生模型,学生模型通过最小化标注数据上的分割监督损失和所有输入数据上的与教师模型预测输出的一致性损失进行优化。如果没有未标记输入中的注释,教师模型的预测目标可能不可靠且有噪声。:在估计不确定性 U 的指导下,我们过滤掉相对不可靠**(高不确定性),整个体积** U 的不确定性**是 {u} ∈ RH×W ×D。过滤掉高不确定性的,也就是熵大于某个值的。

Alexa_的博客 1869

Fast Matrix Operations UVA 11992-线段树

这个题属于线段树的一个入门题,对线段树了解之后可以用这个题练一练 题意: 有一个初始状态全为0的矩阵,一共有三个操作 1x1 y1 x2 y2 v:子矩阵(x1,y1,x2,y2)所有元素增加v add 2x1 y1 x2 y2 v:子矩阵(x1,y1,x2,y2)所有元素设为v ...

P19777的博客 222

陀螺仪与加速度计的姿态融合——互补滤波

本篇文章我们来讲讲如何将陀螺仪和加速度计的数据结合起来,获取更准确的姿态数据,使用的是互补滤波的方法。

小白白学电子 2万+

基本线段树以及相关例题

线段树是一种,也就是对于一个线段,我们会用一个二叉树来表示。这个其实就是一个线段树,我们会将其每次从中间分开,其左孩子就是左边的集合的和,其右孩子就是右边集合的和;我们可以用一个结构体tree去表示线段树的结点,tree.L代表线段树左边界,tree.R代表线段树的右边界;因此我们可以得到一个结论,对于一个节点编号为i的结点,其左孩子的编号为i*2,其右孩子编号为i*2+1;那么首先写出我们的建树代码。

2301_80475191的博客 1157

ADS 使用调整器动态调参教程(Tuning)

ADS动态调参教程

weixin_42845306的博客 1万+

AUTOSAR AP——SM模块

对AUTOSAR AP中状态管理模块SM,从模块定义、总结等多方面进行了介绍。

weixin_43627682的博客 284

HDU 1754 I Hate It 线段树模板

暑假ACM俱乐部训练三周,内容分别是图论基础、区间数据结构、字符串处理。训练题虽说都是类似模板题,但初学的我想弄明白还是有些困难的,经常一道题就坐在那里想半天,但做出来还是非常有成就感。虽然没有在学校训练,夜深人静的时候做题感觉还是挺好的,每天打下一点点基础,有所收获就通过博客记录下来,也方便以后回过头来复习查看。 HDU 1754 I Hate It [题目内容] 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。 不管你喜不喜欢,现在需要你做的是,就

weixin_46283740的博客 376

Oracle数据库表空间使用情况查询

在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对象的逻辑存储单元。了解表空间的使用情况对于数据库管理员和开发人员来说是非常重要的,因为它可以帮助他们监控数据库的空间使用情况并进行容量规划。本文将介绍如何查询Oracle数据库中的表空间使用情况。通过执行以上SQL查询语句,你可以获得Oracle数据库中表空间的使用情况、文件大小和表空间大小等信息。这些信息可以帮助你了解数据库的存储情况,并进行适当的优化和容量规划。查看表空间的数据文件和表空间大小。查看表空间的使用情况。

CsmbPascal的博客 857

hdu1754 I Hate It (线段树点修改查询模版题)

中文题,线段树点修改查询的模版题。。没啥好说的,复习的时候敲一敲,熟练模版吧     以下是代码: #include #include #include #include #define N 1000000 using namespace std; int maxx[N],_max; void pushup(int o) { maxx[o]=max(maxx[o*2],m

lizy3838的博客 289

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

HDU 1754 I Hate It

线段树水题,复习一下线段树 #include #include #include using namespace std; #define N 200005 struct Node{ int l,r,num,ma; }node[N*4]; void build(int p,int l,int r){ node[p].l=l; node[p].r=r; node[p].num=0; no

lj94093的专栏 495

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

hdu 1754 I Hate It

今天还是简单的回顾了一下线段树,加深影响,这题也是入门题,果然不是很输,一开始直接用链表,发现MLE。于是换了数组,发现数组很容易写,并且思路也很清晰。 今天的复习总结: 1、线段树用数组做会更好,代码明显好看很多!网上也有一个大牛写的很好的代码,值得借鉴! 2、线段树要和其他知识点连接的话,会比较难以想到用线段树,所以我要加深对线段树目的,效率,和结果都有更深的理解! 3、听说splay

Johnbug 438

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[kuangbin带你飞]专题七 线段树 B - I Hate It HDU - 1754 单点更新求最大值

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。 Input 本题目包含多组测试,请处理到文件结束。 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5...

bjfu170203101的博客 168

HDOJ 1754 HDU 1754 I Hate It ACM 1754 IN HDU

MiYu原创, 转帖请注明 : 转载自______________白白の屋题目地址:  http://acm.hdu.edu.cn/showproblem.php?pid=1754题目描述:  I Hate ItTime Limit: 9000/3000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)...

weixin_30535043的博客 115

HDU 1754 I Hate It(线段树模版)

晚上复习一下线段树...结果还是搞了20分钟才

desire_ing的专栏 405

HDU_1754 I Hate It (线段树)

  线段树题目,每一段存这一段的最大值。查询时直接匹配线段,找出最大值就行,更新有点小操作要注意。 结构体 struct node{ int l, r; int max;}node[N*4]; 两数取较大的: int Max(int a, int b){ return a &gt; b ? a : b;} 建树 void creat(int t, ...

weixin_34119545的博客 87

[HDU](1754)I Hate It ---- 树状数组(区间最值问题)

题目链接 复习:线段树功能很强大,但是敲起来不如树状数组简洁(但是但是线段树仍然赛高(`・ω・´))。所以这次复习下树状数组的区间最值写法。原理类似区间求和,单点修改。 有一个博主写的博客不错,之前也是学习的他的。安利下,自己就不写教程了,这里练下手,复习下~ 【树状数组求区间最大值】 AC代码: #include&lt;bits/stdc++.h&gt; #define IO ios...

WangMeow --- ᶘ ᵒᴥᵒᶅ ฅ^•ﻌ•^ฅ 266

线段树入门+例题

线段树入门 最近预备队里教了线段树,刚学的时候只是觉得神奇,但是还是有点迷,后来自己对这个数据结构进行了琢磨,发现真的是非常的巧妙。正好趁热打铁,对线段树总结一下。 为什么需要线段树? 假设我们有一个数组arr,对于这个数组,我们有两种操作,第一种操作就是求从arr数组从某一区间的和,第二种操作就是修改arr中的某一个值或者是修改某一区间的值。 针对此问题,我们最简单的有两种方法。 **第一种:**对于修改操作,我们可以直接改变该位置的值,这种时间复杂度为o(1),但是对于求和,我们需要arr[i]+arr

屋檐听雨丶 661

【线段树入门】+例题

文章目录基本原理和操作(栗题)AcWing 245. 你能回答这些问题吗参考文献 基本原理和操作 build(int u , int l , int r)建树,递归建法: u : 当前父节点 l,r,当前建树区间。 void build(int u , int l , int r) { // l == r ,到了叶子节点,那么直接构造return; if(l == r) { tr[u] = {l , r .....}; return ; } else

m0_51990674的博客 205

hdu1754(线段树入门题)

Problem Description 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。 Input 本题目包含多组测试,请处理到文件结束。 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=20...

MInNrz的Love&Share 277

hdu1754

http://acm.hdu.edu.cn/showproblem.php?pid=1754 #include #include #include #define N 200000 using namespace std; struct node { int l,r,max; int mid() { return (l+r)>>1; } }; node tree[N*3]; void

skyline 1267
上一篇: HDU1166 敌兵布阵 线段树||树状数组||CDQ分治 入门题复习
下一篇: HDU1698 Just a Hook 线段树入门题复习
overload1997
博客等级 码龄11年 328粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值