- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Hdu1754IHateIt解题报告
Hdu1754 I Hate It解题报告
/*
Name: hdu1754解题报告
Copyright: ecjtu_acm训练基地
Author: yimao
Date: 03-08-10 18:40
Description: 线段树,
更新节点,区间求最值
*/
一、题目
Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。在每个测试的第一行,有两个正整数 N 和 M ( 0N=200000,0M5000 ),分别代表学生的数目和操作的数目。学生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
Hint
Huge input,the C function scanf() will work better than cin
二、题目大意及分析
给定N个按一定顺序排列的值,对这N个值进行两种操作:
1、查询某个区间[from,to]的最大值;
2、修改序号为order处的值;
分析:由于N很大,用一般的线性结构会超时,故选择用线段树做。此题可以直接套用线段树的三个模板,一个是建树的模板,另一个是求区间最大值的模板,还有一个是修改某个点的值的模板。
三、部分源代码及相关分析
/*2010-08-03 10:08:28 Accepted 1754 1093MS 9268K 2183 B G++*/
struct node
{
int left,mid,right,max;
//mid不需要,下意识地写进去了;
//线段树的节点保存所有信息,依题意要求具体加数据;
//每个节点都是一个[a,b)的区间,根节点代表了整个所要处理的区间
}
T[600010];
//T[]数组大小一般是保存输入数据数组的大小的三倍,更小会Runtime error.
//P.S. zhousc意见:写十万亦可,可能在建树的时候不会开到那么大,不一定非得三倍。
//笔者试过几题,最好写三倍。
//线段树把区间上的任意一条长度为L的线段都分成不超过2logL条线段的并;
//建立一颗线段树,采用递归,线段树很多模板都采用递归;
//第u个节点的最左端为l,最右端为r,l,r是指保存输入数据的数组的下标;
//结构体数组保存线段树,根节点下标为1。对于非叶节点num,其左右子节点下标分别为//2*num和2*num+1. (代码采用加法),所以表示节点的结构体中不需要指向左右节点的量;
void create(int u,int l,int r)
{
T[u].left=l; T[u].right=r; T[u].mid=(l+r)1;
//P.S. mid并不需要;
if(l==r)
{ T[u].max=a[r]; return; }
int mid=(l+r)1; //位运算比除法快;
create(u+u,l,mid);
create(u+u+1,mid+1,r); //加法比乘法快;
T[u].max=max(T[u+u].max,T[u+u+1].max);
}
//查找区间[from,to]上的最大值;
//主函数里i应该写1;
int search_max(int from,int to,int i)
{
if (from=T[i].leftto=T[i].right) { return T[i].max; }
else
{
int ans1=ans2=
if (from=T[i+i].right) ans1=search_max(from,to,i+i);
if (to=T[i+
您可能关注的文档
最近下载
- 2023神经重症监护患者脑水肿的急性治疗指南(完整版).pdf VIP
- 2025-2026年初中信息技术安徽初二水平会考真题试卷 .pdf VIP
- (新课标)新高教版中职信息技术(基础模块)上册1.2《认识信息系统》说课稿.docx
- 高一自主招生数学试题及标准答案.docx VIP
- 四措两案标准模板.doc
- 2025年初中信息技术初二水平会考真题试卷 含答案考点及解析 .pdf VIP
- 重庆西南大学附属中学体育馆结构设计-建筑结构.PDF
- 红楼梦英文版(杨宪益译)_精品.doc
- 2025年初中信息技术初二水平会考真题含答案考点及解析 .pdf VIP
- 2024年初中信息技术会考试题含答案.doc
文档评论(0)