题干:

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 
这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

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

题目大意:

中文题啦不解释。

解题报告:

这题跟【HDU - 1166】敌兵布阵 就不一样啦,这题是单点覆盖更新,也就是说很多地方的+= 要换成=。

单点更新+区间最大值查询,改一下pushup即可。

AC代码:

#include<bits/stdc++.h>using namespace std;
const int MAXN = 200000 + 5;
int n;
int a[MAXN];
struct TREE {int l,r;int val;int laz;   int maxx;
} tree[4*MAXN];
void pushup(int cur) {tree[cur].val = tree[2*cur].val + tree[2*cur + 1].val; tree[cur].maxx = max(tree[2*cur].maxx, tree[2*cur + 1].maxx);
}
void build(int l ,int r,int cur) {if(l == r) {tree[cur].l = tree[cur].r = l;//写成tree[r].r 了。。 tree[cur].val = a[l];tree[cur].maxx = tree[cur].val;return ;//这步return必须加!不然就无限递归了。这就是为什么写递归函数,要将出口写在最前面,就是,不给他再次进入递归函数的机会! }int m = (l+r)/2;tree[cur].l = l;tree[cur].r = r;build(l,m,2*cur);build(m+1,r,2*cur + 1);pushup(cur);
}
//pl-pr为查询区间,l和r为树种 当前cur下标
//int query2(int pl,int pr,int l,int r,int cur) {
//  if(pl<=l && pr>=r) return tree[cur].val; pushdown(cur,l,r);
//  int m = (l+r)/2;
//  int res = 0;
//  if(pl <= m) res += query2(pl,pr,l,m,2*cur);
//  //下面这里是if啊!!不是else!!!
//  if(pr >= m+1) res += query2(pl,pr,m+1,r,2*cur + 1);
//  return res;
//}
int query(int pl,int pr,int l,int r,int cur) {if(pl<=l && pr >= r) return  tree[cur].maxx;int m = (l+r)/2;int res,tmp1 = 0,tmp2 = 0;if(pl <= m) tmp1 =query(pl,pr,l,m,2*cur);
//  printf("  %d   tmp1 = %d\n",cur,tmp1);if(pr >= m+1) tmp2 = query(pl,pr,m+1,r,2*cur+1);res = max(tmp1,tmp2);return res;
//  if(pl <= m) res =query(pl,pr,l,m,2*cur);
//  if(pr >= m+1) res = max(res,query(pl,pr,m+1,r,2*cur+1));
//  return res;
}
void update1(int tar,int val,int l,int r,int cur) {if(l == r) {tree[cur].val = val;tree[cur].maxx = val;
//      tree[cur].laz +=val;return;//这步return必须加!不然就无限递归了。这就是为什么写递归函数,要将出口写在最前面,就是,不给他再次进入递归函数的机会! }int m = (l + r)/2;if(tar<=m) update1(tar,val,l,m,2*cur);else update1(tar,val,m+1,r,2*cur + 1);pushup(cur);
}
int main()
{int tmp1,tmp2;int mm;char op[10];while(~scanf("%d%d",&n,&mm) ) {for(int i = 1; i<=n; i++ ) {scanf("%d",&a[i]);}memset(tree,0,sizeof(tree));build(1,n,1);
//      printf("%d %d ",tree[1].l,tree[1].r);
//      for(int i = 1; i<=50; i++) printf("%d ",tree[i].maxx);while(mm-- ) {scanf("%s",op);if(op[0] == 'Q') {scanf("%d%d",&tmp1,&tmp2);
//              tmp2 = tmp2 - tree[tmp1].val;printf("%d\n",query(tmp1,tmp2,1,n,1));}else {scanf("%d%d",&tmp1,&tmp2);update1(tmp1,tmp2,1,n,1);
//              for(int i = 1; i<=50; i++) printf("%d ",tree[i].maxx);}}}return 0 ;} // 5 6
//1 2 3 4 5
//Q 1 5
//U 3 6

【HDU - 1754】I Hate It (线段树模板 单点覆盖更新+区间最大值查询)相关推荐

  1. 线段树模板题3:区间染色问题

    1.3线段树模板题3:区间染色问题 在DotA游戏中,帕吉的肉钩实际上是大多数英雄中最恐怖的东西.挂钩由长度相同的几个连续的金属棍组成. 现在,帕吉(Pudge)希望对挂接进行一些操作. 让我们将钩子 ...

  2. 【HDU - 1166】敌兵布阵 (线段树模板 单点更新+ 区间查询)

    题干: C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情 ...

  3. HDU 1754 I Hate It 线段树

    I Hate It Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要 ...

  4. 线段树模板(建树+更新)

    线段树建树模板 #define lson l,m,rt<<1 //2*rt #define rson m+1,r,rt<<1|1 //2*rt+1 int map[100000 ...

  5. szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

    寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...

  6. NYOJ 1068 ST(线段树之 成段更新+区间求和)

    ST 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 "麻雀"lengdan用随机数生成了后台数据,但是笨笨的他被妹纸的问题给难住了... 已知len ...

  7. 【初学线段树,看这篇文章准没错】线段树(单点修改and区间修改)acm寒假集训日记22/1/10

    线段树 线段树是算法竞赛中常用的用来维护区间信息的数据结构.是一名ACMer 需要掌握的一种基础.重要的数据结构线段树可以在O(logN)的时间复杂度内实现单点修改,区间修改,区间查询(区间求和,区间 ...

  8. hdu 敌兵布阵(线段树之单点更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. 线段树模板hdu 1754:I Hate It

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

最新文章

  1. 【每日DP】day1 P1802 5倍经验日(别样的01背包)难度⭐★
  2. Xamarin Essentials教程发送邮件Email
  3. SQL循环执行while控制
  4. 【Tools】MarkDown教程(二)-MarkDown基本语法
  5. SpringBoot+Vue博客系统---后端接口开发
  6. C#基础系列:实现自己的ORM(构造我自己的ORM)
  7. Verilog语法之generate语句
  8. 自主研发国产高端企业云服务器,浪潮商用机器如何聚沙成塔?
  9. Wince电源管理(五) ---- Windows CE设备驱动开发之电源管理
  10. 从零到一,构建你的持续交付流程(二):好的工程实践是必要的前提
  11. Java 创建带有套接字的简单代理服务器示例
  12. Android 11 默认打开开发者选项
  13. 如何在组装或维修计算机时避免静电,组装电脑怎么避免手上的静电
  14. Java程序性能优化 ! .
  15. linux ssd加速机械硬盘,关于linux:机械硬盘随机IO慢的超乎你的想象
  16. python egg_Python的egg包
  17. 进程同步问题——生产者—消费者问题
  18. 【思前享后】区块链的发展历史
  19. springBoot实体类无法构造
  20. Centos7虚拟机磁盘恢复

热门文章

  1. [Java学习资料] [成长之路]
  2. 第一批升级鸿蒙系统,鸿蒙系统公开了第一批升级名单,果粉认为不地道
  3. vue中waiting for update signal from wds_10个vue快捷开发技巧助你成为中级前端工程师!(二)...
  4. r语言error in match.fun(fun) :_Go语言200行写区块链源代码分析
  5. time是python的标准库吗_python3关于date和time的标准库
  6. java peek函数_基础篇:JAVA.Stream函数,优雅的数据流操作
  7. threejs渲染器剔除模式
  8. padding 后尺寸变化 设置_padding margin border 和元素大小
  9. php while mysql_我怎么能避免在PHP的While循环中使用MySQL查询
  10. linux动态库与静态库混合连接