B - I Hate It(单点更新)(区间求最大值)
B - I Hate It
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
- 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
- Hint
-
Huge input,the C function scanf() will work better than cin
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#define Maxn 200005
using namespace std;
int num[Maxn];
struct Tree
{int l,r,sum;
}tree[Maxn*4];//Ï߶ÎÊ÷±È½ÏºÄ¿Õ¼äÒ»°ã¿ª3~4±¶£»
int Max(int a,int b)
{if(a>b)return a;else return b;
}
void build (int k,int l,int r)
{tree[k].l=l;tree[k].r=r;if(tree[k].l==tree[k].r){tree[k].sum=num[l];return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);tree[k].sum=Max(tree[k<<1].sum,tree[k<<1|1].sum);
}
void update(int k,int pos,int val)
{if(tree[k].l==tree[k].r&&tree[k].l==pos){tree[k].sum=val;return ;}int mid=(tree[k].l+tree[k].r)>>1;if(pos<=mid)update(k<<1,pos,val);else update(k<<1|1,pos,val);tree[k].sum=Max(tree[k<<1].sum,tree[k<<1|1].sum);
}
int query(int k,int l,int r)
{if(l==tree[k].l&&tree[k].r==r)return tree[k].sum;int s;int mid=(tree[k].l+tree[k].r)>>1;if(r<=mid) s=query(k<<1,l,r);else if(l>mid) s=query(k<<1|1,l,r);else s=Max(query(k<<1,l,mid),query(k<<1|1,mid+1,r));return s;
}
int n,m;
int main()
{while(scanf("%d%d",&n,&m)!=EOF){for(int i=1;i<=n;i++)scanf("%d",&num[i]);build(1,1,n);char ch;int a,b;for(int i=1;i<=m;i++){scanf(" %c%d%d",&ch,&a,&b);if(ch=='U'){num[a]=b;update(1,a,b);}else if(ch=='Q')printf("%d\n",query(1,a,b));}}return 0;
}
B - I Hate It(单点更新)(区间求最大值)相关推荐
- 卿学姐与公主(线段树区间求最大值)
A - 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- hdu 1540(线段树单点更新 区间合并)
解题思路:这一题要求的是连续区间,所以可以把它的子区间合并,这里运用线段树,但是在保存节点信息的方面要做一点修改 lsum:从这个区间的左端点往右能够找到的最大连续区间: rsum:从这个区间的右端点 ...
- hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)
敌兵布阵 Time Limit: 2000/10 ...
- hdu 1754 I Hate It(线段树之 单点更新+区间最值)
I Hate It Time Limit: 90 ...
- hdu4417:线段树单点更新区间求和,离线 Super Mario
Description Mario is world-famous plumber. His "burly" figure and amazing jumping ability ...
- A - 卿学姐与公主(线段树+单点更新+区间极值)
A - 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- HDU ACM 4031 Attack (树状数组--单点查询+区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=4031 用了树状数组的区间更新 单点查找(一般为单点更新 区间查找) 例如 区间(2,4)加1 则Updata(2 ...
- 【HDU - 1754】I Hate It (线段树模板 单点覆盖更新+区间最大值查询)
题干: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当 ...
- hdu3074 线段树求区间乘积(单点更新)
题意: 给你n个数,两种操作,(1) 把第b个数改成c (2)算出b-c的乘积,结果对1000000007取余. 思路: 线段树单点更新,简单题目,不多解释,具体看代码. #i ...
- 线段树求区间和(单点更新)
题目1:敌兵布阵 线段树的主要操作:(1)建立线段树(Build) (2)更新区间值 (Update) (3)查询区间(Query) 写法一: #include ...
最新文章
- Python 3.8即将发布,这几个变化你必须知道
- 路由器mstp多域配置举例
- Delphi对象池MyObjectPool.pas
- SQL SERVER镜像切换
- P1060 开心的金明(01背包)
- poj2976 Dropping tests(01分数规划 好题)
- 牛客题霸 [ 实现二叉树先序,中序和后序遍历]C++题解/答案
- mysql 从库 问题_一篇文章帮你解决Mysql 中主从库不同步的问题
- 持有至少百万美元钱包本周增至66,540,增长了150%
- [linux]远程kill进程
- 游戏设计阻力探秘之扩展空间
- 进度管理案例分析——常见问题及答案
- echarts实现中国地图区域分布图 vue + echarts
- 基于Struts2和hibernate的WebSocket聊天室的实现教程五:聊天机制
- 魅族设置语音录音服务器,魅族手机微信怎么开启录音权限呀有步骤图吗
- Windows无法完成格式化U盘终结解决方法
- 网易云接口手机号验证码验证登录
- 想用FPGA加速神经网络,这两个开源项目你必须要了解
- 【python】实验2项目2:使用爬虫Selenium模拟浏览器获取爬取QQ音乐中你喜欢的某位歌手(陈奕迅)
- 源码推荐 VVebo剥离的TableView绘制
热门文章
- 程序之间耦合以及解耦问题探究
- 在ubuntu中自定义安装nginx
- 通过javaBean反射转换成mybatis映射文件
- Java-idea-eclipse-快捷键【mac,win】
- 360换机 v2.12.5.9 官方安卓版
- HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR 的区别
- DirectAdmin面板在线解压缩的.tar.gz文件
- 实现接口与显式实现接口的区别
- 《Windows核心编程》之七 - 关于Windows 2000中内存的分区
- JDBC连接池JDBCTemplate