HDU I Hate It(线段树单节点更新,求区间最值)
http://acm.hdu.edu.cn/showproblem.php?pid=1754
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
在每个测试的第一行,有两个正整数 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。
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5
Huge input,the C function scanf() will work better than cin
- #include<iostream>
- #include<algorithm>
- #include<string>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- using namespace std;
- int node[];
- int max(int a,int b)
- {
- return a>b?a:b;
- }
- void PushUp(int t)
- {
- node[t]=max(node[t<<],node[(t<<)+]);
- }
- void build(int l,int r,int t)
- {
- int mid;
- mid=(l+r)>>;
- if(l==r)
- {
- scanf("%d",&node[t]);
- return ;
- }
- build(l,mid,t<<);
- build(mid+,r,(t<<)+);
- PushUp(t);
- }
- void update(int p,int add,int l,int r,int t)
- {
- int mid;
- mid=(l+r)>>;
- if(l==r)
- {
- node[t]=add;
- return ;
- }
- if(p<=mid)update(p,add,l,mid,t<<);
- else update(p,add,mid+,r,(t<<)+);
- PushUp(t);
- }
- int query(int ll,int rr,int l,int r,int t)
- {
- int k=;
- int mid=(l+r)>>;
- if(ll<=l && rr>=r) return node[t];
- if(ll<=mid) k=max(k,query(ll,rr,l,mid,t<<));
- if(rr>mid) k=max(k,query(ll,rr,mid+,r,(t<<)+));
- return k;
- }
- int main()
- {
- int l,x,n,i,T;
- char s;//s[5];
- while(scanf("%d %d",&n,&T)!=EOF)
- {
- build(,n,);
- for(i=;i<T;i++)
- {
- scanf("%*c%c%d%d",&s,&l,&x);
- //scanf("%s%d%d",s,&l,&x);
- if(s=='U')//if(s[0]=='U')
- {
- update(l,x,,n,);
- }
- else
- {
- printf("%d\n",query(l,x,,n,));
- }
- }
- }
- return ;
- }
非递归写法
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn=;
- int sum[maxn<<];
- int n,m,N,x,y;
- char ch[];
- int query(int L,int R)
- {
- int ans=-;
- for(int i=N+L-,j=N+R+;i^j^;i>>=,j>>=)
- {
- if(~i&) ans=max(ans,sum[i^]);
- if(j&) ans=max(ans,sum[j^]);
- }
- return ans;
- }
- void updata(int L,int val)
- {
- sum[N+L]=val;
- for(int i=N+L>>;i;i>>=)
- sum[i]=max(sum[i<<],sum[i<<|]);
- }
- int main()
- {
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- memset(sum,,sizeof(sum));
- N=;while(N<n+) N<<=;
- for(int i=;i<=n;i++)
- scanf("%d",&sum[N+i]);
- for(int i=N-;i;i--)
- sum[i]=max(sum[i<<],sum[i<<|]);
- for(int i=;i<m;i++)
- {
- scanf("%s",&ch);
- scanf("%d%d",&x,&y);
- if(ch[]=='Q') printf("%d\n",query(x,y));
- else updata(x,y);
- }
- }
- return ;
- }
HDU I Hate It(线段树单节点更新,求区间最值)的更多相关文章
- HDU 1166 敌兵布阵(线段树单节点更新 区间求和)
http://acm.hdu.edu.cn/showproblem.php?pid=1166 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Dere ...
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- poj_3468线段树成段更新求区间和
#include<iostream> #include<string.h> #include<cstdio> long long num[100010]; usin ...
- HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )
线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...
- HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU(1754),线段树,单点替换,区间最值
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 线段树模板题,update功能是单点替换,query是访问区间最大值. #include < ...
- HDU 2795 Billboard (线段树单点更新 && 求区间最值位置)
题意 : 有一块 h * w 的公告板,现在往上面贴 n 张长恒为 1 宽为 wi 的公告,每次贴的地方都是尽量靠左靠上,问你每一张公告将被贴在1~h的哪一行?按照输入顺序给出. 分析 : 这道题说明 ...
- hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)
Minimum Inversion Number T ...
- HDU - 1754 I Hate It (线段树单点修改,求区间最大值)
很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有 ...
随机推荐
- MVVM 中 ViewModelBase和 CommandBase
public class ViewModelBase : INotifyPropertyChanged , IDisposable { public virtual string DisplayNam ...
- SqlServer存储过程加密与解密
★ 加密存储过程 ★: IF EXISTS (SELECT name FROM sysobjects WHERE name = 'encrypt_this' AND type = 'P') DRO ...
- if switch
一.基本if结构: 1.语法:if (条件){ 代码块 } 2.执行顺序:先判断条件,条件成立则行{}内的代码,不成立则跳出if结构快既不执行{}内的代码. 3.什么情况下要用基本if选择结构:当需要 ...
- js小知识 正则表达
js定义正则表达式有两种方式:普通方式,构造函数方式 正则对象是js的内置对象 正则的属性 正则的方法 js中字符串的方法 一.普通方式(双斜杠//方式):var reg = /表达式/附加参数 表 ...
- 由ubuntu装好想到的
这篇不是技术文,有点唠叨的总结.不喜勿喷. 最近开始全面学ubuntu,一翻书回忆起本科没选但是去听了的Linux.当时看的还是楚广明的fedora教程,这多年过去综合很多人的说 法,fedora不稳 ...
- kindEditor编写插件遇到的问题
kindEditor是一个功能强大的在线文本编辑器,而且提供了插件扩展功能,更好的满足用户各方面的需求.在项目中,我们就有如此的需求:在kindEditor编辑器中,添加一条下划线,并且在下划线的中间 ...
- SpringMVC-注解映射器和适配器_20190323
1 注解映射器和适配器 1.1 注解映射器spring3.1之前默认加载映射器是org.springframework.web.servlet.mvc.annotation.DefaultAnnota ...
- js的运算小数点的问题
问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这 ...
- CSS常用样式--font
CSS font 属性 参考:W3school- CSS font 所有浏览器都支持 font 属性,可在一个声明中设置所有字体属性,各属性需按顺序,语法如下: selector{ font:styl ...
- 一句话木马和中国菜刀的结合拿webshell
什么叫做一句话木马: 就是一句简单的脚本语言,一句话木马分为Php,asp,aspx等 中国菜刀: 连接一句话木马的工具 实验的目的: 通过一句话木马来控制我们的服务器,拿到webshe ...