HDU-1754-I Hate It
来源:互联网 发布:淘宝买家秀怎么发 编辑:程序博客网 时间:2024/06/07 08:36
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1754
题目
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 1<=N<=200000,1<=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
题解
线段树单点更新,区间查询问题。
树状数组单点更新,区间查询问题。
代码一:线段树解法
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=8e5+100;int s[maxn];void modify(int p,int l,int r,int pos,int d){ s[p]=max(s[p],d); if(l==r) return; int mid=(l+r)/2; if(pos<=mid) modify(p*2,l,mid,pos,d); else modify(p*2+1,mid+1,r,pos,d);}int query(int p,int l,int r,int x,int y){ if(x<=l && r<=y) return s[p]; int mid=(l+r)/2,ret=0; if(x<=mid) ret=max(ret,query(p*2,l,mid,x,y)); if(y>mid) ret=max(ret,query(p*2+1,mid+1,r,x,y)); return ret;}int main(){ int N,M; while(~scanf("%d%d",&N,&M)) { memset(s,0,sizeof(s)); for(int i=1;i<=N;i++) { int a; scanf("%d",&a); modify(1,1,N,i,a); } while(M--) { char C; int x,y; getchar(); //%c会读取键盘缓冲区中的回车符 scanf("%c%d%d",&C,&x,&y); if(C=='Q') printf("%d\n",query(1,1,N,x,y)); else modify(1,1,N,x,y); } } return 0;}
代码二:树状数组解法
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=2e5+100;int tree[maxn],s[maxn],N;int lowbit(int i){ return i&(-i);}void update(int i,int d){ s[i]=d; while(i<maxn) { tree[i]=max(tree[i],d); i+=lowbit(i); }}int query(int l,int r){ int ans=0; while(l<=r) { ans=max(ans,s[r]); for(--r;r>=l+lowbit(r);r-=lowbit(r)) { ans=max(ans,tree[r]); } } return ans;}int main(){ int M; while(~scanf("%d%d",&N,&M)) { memset(s,0,sizeof(s)); memset(tree,0,sizeof(tree)); for(int i=1;i<=N;i++) { int a; scanf("%d",&a); s[i]=a; update(i,a); } while(M--) { char C; int x,y; getchar(); //%c会读取键盘缓冲区中的回车符 scanf("%c%d%d",C,&x,&y); if(C=='Q') printf("%d\n",query(x,y)); else update(x,y); } } return 0;}
阅读全文
0 0
- hdu 1754 I Hate It
- HDU 1754 I Hate It
- hdu 1754 I Hate It
- HDU 1754 I Hate It
- hdu 1754 I Hate It
- HDU 1754 I Hate It .
- HDU 1754 i hate it
- hdu 1754 I Hate It
- hdu 1754 I Hate It
- hdu 1754 I Hate It
- HDU 1754(I Hate It )
- hdu 1754 I Hate It
- hdu 1754 I Hate It
- HDU-1754-I Hate It
- hdu 1754 I Hate It
- hdu 1754 I Hate It
- hdu 1754 I hate it
- HDU 1754 I Hate It
- CentOS安装SVN和部署
- 数据脱敏 国内数据脱敏乱象 之一
- Android中activity的启动模式.md
- ViewPage 轮播图优化,解决oom和白屏问题
- 欢迎使用CSDN-markdown编辑器--参考使用
- HDU-1754-I Hate It
- 小程序列表多个批量倒计时
- 关于spring 与Hibernate 结合使用的事务管理
- 初识Spring Boot框架
- 使用快排和归并求解逆序对
- 补基础之javascript面向对象-构造函数的继承
- jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})
- c 语言可变参讲解(很精细)
- Nginx限速模块初探