HDU-1754-I Hate It-线段树-求区间最值和单点修改
开学新拉的题目,老题重做,思路会稍微比之前清晰,不过这也算是一点点进步了。
- 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
- 这让很多学生很反感。
- 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
- Input
- 本题目包含多组测试,请处理到文件结束。
- 在每个测试的第一行,有两个正整数 N 和 M ( <N<=,<M< ),分别代表学生的数目和操作的数目。
- 学生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
- Q
- U
- Q
- Q
- U
- Q 5
- Sample Output
- Hint
- Huge input,the C function scanf() will work better than cin
题意:
Q a-b 成绩最高的学生 每一次询问输出成绩
U a、b 把a学生的成绩改为b分
思路:
求区间最值和单点修改
单点修改不需要懒惰标记,因为每次都是访问到底层(最后一个叶节点)
小细节:
|:有1则1
<<1 :等同于*2
i<<1|1:等同于i*2+1
a[4*N]:数组需要开到四倍空间
- #include<stdio.h>
- #include<iostream>
- #include<algorithm>
- #include<string.h>
- #include<cmath>
- #include<queue>
- #include<stdlib.h>
- typedef long long ll;
- using namespace std;
- const int N=;
- //5 6
- //1 2 3 4 5
- //Q 1 5 ->5
- //U 3 6
- //Q 3 4 ->6
- //Q 4 5 ->5
- //U 2 9
- //Q 1 5 ->9
- int a[*N];//需要开到四倍空间
- //每个父节点记录的是它下面的两个节点的最大值
- void build(int L,int R,int i)
- {
- if(L==R)
- {
- scanf("%d",&a[i]);
- return;
- }
- int mid=(L+R)>>;
- build(L,mid,i<<);
- build(mid+,R,i<<|);
- a[i]=max(a[i<<],a[i<<|]);//pushup(i)////每次传的时候把根节点也往下去寻找最大值
- ////比较其左右两个节点的大小,取最大值
- //看题目给的需要求什么
- }
- //update(aa,bb,1,n,1)
- //把下标为aa的元素修改成bb,更新节点值,更改节点
- void update(int aa,int bb,int L,int R,int i)
- {
- if(L==R)
- {
- a[i]=bb;
- return;
- }
- int mid=(L+R)>>;
- if(aa<=mid)//不是L<=mid
- update(aa,bb,L,mid,i<<);
- else
- update(aa,bb,mid+,R,i<<|);
- a[i]=max(a[i<<],a[i<<|]);
- }
- //query(aa,bb,1,n,1)
- int query(int left,int right,int L,int R,int i)
- {
- if(left<=L&&right>=R)
- return a[i];
- int mid=(L+R)>>;
- int ans=-;
- if(left<=mid)
- ans=max(ans,query(left,right,L,mid,i<<));
- // else
- if(right>mid)
- ans=max(ans,query(left,right,mid+,R,i<<|));
- return ans;
- }
- int main()
- {
- int n,m;
- while(~scanf("%d %d",&n,&m))
- {
- memset(a,,sizeof(a));
- build(,n,);//传入最左端点,最右端点,根节点进行建树
- //建树的过程中输入每一个节点
- // for(int i=1;i<=n;i++)
- // scanf("%d",&a[i]);
- string ss;
- for(int i=; i<m; i++)
- {
- cin>>ss;
- int aa,bb;
- if(ss=="Q")
- {
- scanf("%d %d",&aa,&bb);
- printf("%d\n",query(aa,bb,,n,));
- }
- else
- {
- //把下标为aa的元素修改成bb
- scanf("%d %d",&aa,&bb);
- update(aa,bb,,n,);
- }
- }
- }
- return ;
- }
HDU-1754-I Hate It-线段树-求区间最值和单点修改的更多相关文章
- hdu 1754 I Hate It (线段树求区间最值)
HDU1754 I Hate It Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u D ...
- xdoj-1324 (区间离散化-线段树求区间最值)
思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i] 覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...
- 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)
原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...
- HDU6447 YJJ's Salesman-2018CCPC网络赛-线段树求区间最值+离散化+dp
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门 原题目描述在最下面. 1e5个点,问 ...
- hdu 1754 I Hate It 线段树 点改动
// hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bits ...
- 【线段树求区间第一个不大于val的值】Lpl and Energy-saving Lamps
https://nanti.jisuanke.com/t/30996 线段树维护区间最小值,查询的时候优先向左走,如果左边已经找到了,就不用再往右了. 一个房间装满则把权值标记为INF,模拟一遍,注意 ...
- 滑动窗口(poj,线段树维护区间最值)
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
随机推荐
- 数学思维——cf351A
把每个值的各种贡献算一下即可 /* ai的小数部分为xi,向下取整对答案贡献为xi 向上取整对答案的贡献是xi-1,如果这个数是0,那么对答案的贡献是xi,即如果0向上取整就可以免去-1 然后sum{ ...
- DOM学习总结(二)
一.什么是DOM属性 DOM属性简单来说就是HTML的属性值 二.常见的DOM属性有哪些? 1.innerHTML 属性 获取元素的内容,想要拿到某个元素的文本内容,直接在后面加 .innerHTML ...
- webstorm使用说明
1.移动光标到的代码块的结尾处(开始处 [ ) ctrl+] 2.移动光标到的代码块的结尾处并选择 ctrl+shift+] 3.ctrl + b: 跳到变量申明处 4.多光标输入: ...
- python 模块-json
1.JSON(Javascript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Lan ...
- node express 会话管理中间件 --- cookie-parser
本文转载自:https://www.cnblogs.com/bq-med/p/8995100.html cookie是由服务器发送给客户端(浏览器)的小量信息. 我们知道,平时上网时都是使用无状态的H ...
- 剑指offer——59二叉搜索树的第k大节点
题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 题解: 考察的就是中序遍历 不过注意进行剪枝 cl ...
- JAVA集合--Collection接口
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 在概述里面也说过:Collection是jav ...
- DNF邀请码开发再开发方案需求
一.原因分析: 1.现实原因:主播粉丝量级有限,一定规模粉丝注册消耗完后无法进 行之后合作 2.主播资源有限,能合作主播数量少 3.直播粉丝真实接近核心用户,但是不能将其有效转化为平台流水 ...
- [USACO06JAN]牛的舞会The Cow Prom
题目描述 The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in their ...
- pyJWT
现在用JWT 加密太火了,怎么能不跟上潮流?否则销售都不好意思出去吹牛逼! PyJWT是一个Python库,用来编码/解码JWT(JSON Web Token)的 1.定义:根据维基百科的定义,JSO ...