hdu1754————I Hate It(线段树)
来源:互联网 发布:杭州整站优化公司 编辑:程序博客网 时间:2024/06/05 19:04
I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 80099 Accepted Submission(s): 30767
Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
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。
在每个测试的第一行,有两个正整数 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 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5
Sample Output
5659
思路
由于和hdu1166 题目很类似,所以把节点的求和改为求最大值就好了,那个sum的数组 我太懒了 应该换一个名字(大家不要学我啊)
#include<iostream>#include<cmath>#include<cstring>#include<vector>#include<stdlib.h>#include<stdio.h>#include<algorithm>#include<map>#include <set>#include <list>#include <deque>#include<sstream>#include<time.h>#define pi 3.1415926#define N 2005#define M 15#define INF 0x6f6f6f6f#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1using namespace std;typedef long long ll;const int maxn = 222222;const int day =21252;const int mod=1000000007;int sum[maxn<<2];//要开4倍的节点void pushup(int rt)//更新父节点{ sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);}void build(int l,int r,int rt)//建树{ if(r==l) { scanf("%d",&sum[rt]); return ; } int m=(l+r)>>1; build(lson); build(rson); pushup(rt);}void updata(int p,int add,int l,int r,int rt)//更新单点{ if(l==r) { sum[rt]=add; return ; } int m=(l+r)>>1; if(p<=m) updata(p,add,lson); else updata(p,add,rson); pushup(rt);}int query(int L,int R,int l,int r,int rt)//区间求最大{ if(L<=l&&r<=R) { return sum[rt]; } int m=(l+r)>>1; int ret=0; if(L<=m) ret=max(ret,query(L,R,lson)); if(R>m) ret=max(ret,query(L,R,rson)); return ret;}int main(){ int t,m,n; while(~scanf("%d %d",&n,&m)) { build(1,n,1); while(m--){ char s[2]; int a,b; scanf("%s%d%d",s,&a,&b); if(s[0]=='Q') { printf("%d\n",query(a,b,1,n,1)); } else updata(a,b,1,n,1); } } return 0;}
阅读全文
0 0
- hdu1754————I Hate It(线段树)
- HDU1754——I Hate It(线段树入门)
- HDU1754——I Hate It(线段树)
- 【hdu1754】I Hate It——线段树模板题
- hdu1754—I Hate It(线段树模板)
- hdu1754——I Hate It
- hdu1754——I Hate It(线段树,单点更新,求最大值)
- HDU1754—I Hate It线段树求最大值,单点更新
- HDU1754 I Hate It,线段树
- 线段树hdu1754 I Hate It
- 【线段树】 hdu1754 I Hate It
- hdu1754 I Hate It (线段树)
- hdu1754 I Hate It+线段树
- hdu1754 I Hate It (线段树)
- hdu1754 I Hate It (线段树)
- HDU1754 I Hate It(线段树)
- hdu1754 I Hate It(线段树)
- hdu1754 I Hate It,线段树
- poj 2488A Knight's Journey(DFS+回溯)
- Linux的常用命令
- 海量数据处理问题
- java 正则表达式
- Java快捷键
- hdu1754————I Hate It(线段树)
- bootstrap系列之二排版基础
- Hook
- 啊哈磊的挑战,前几个比较简单的题。
- dependencies与dependencyManagement的区(转自:http://blog.csdn.net/liutengteng130/article/details/46991829)
- 用类加载器实现Java插件式开发
- 彻底解决 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- leetcode(55). Jump Game
- hdoj 1004 Let the Balloon Rise