I Hate It

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 97602    Accepted Submission(s): 36849

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。

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

Author

linle

Source

2007省赛集训队练习赛(6)_linle专场

Recommend

lcy   |   We have carefully selected several similar problems for you:  1698 1542 1394 2795 1540

Statistic | Submit | Discuss | Note

Home | Top Hangzhou Dianzi University Online Judge 3.0
Copyright © 2005-2018 HDU ACM Team. All Rights Reserved.
Designer & Developer : Wang Rongtao LinLe GaoJie GanLu
Total 0.000000(s) query 5, Server time : 2018-07-27 11:40:57, Gzip enabled

Administration

解析:基础入门的线段树,套用模板,每一区间,更新最大值 ;

另一种解法:hdu1754-树状数组求最值

第一种写法:

#include<bits/stdc++.h>
using namespace std;#define e exp(1)
#define pi acos(-1)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a))const int maxn=200000+10;struct node{int l,r,mxn;
}tree[maxn<<2];int ans,a[maxn];
char str[10];void build(int l,int r,int m)
{tree[m].l=l;tree[m].r=r;if(l==r){tree[m].mxn=a[l];return ;}int mid=(l+r)>>1;build(l,mid,m<<1);build(mid+1,r,m<<1|1);tree[m].mxn=max(tree[m<<1].mxn,tree[m<<1|1].mxn);
}void update(int a,int val,int m)
{if(tree[m].l==a&&tree[m].r==a){tree[m].mxn=val;return ;}int mid=(tree[m].l+tree[m].r)>>1;if(a<=mid){update(a,val,m<<1);}elseupdate(a,val,m<<1|1);tree[m].mxn=max(tree[m<<1].mxn,tree[m<<1|1].mxn);
}void query_sum(int l,int r,int m)
{if(tree[m].l==l&&tree[m].r==r){ans=max(tree[m].mxn,ans);return ;}int mid=(tree[m].l+tree[m].r)>>1;if(r<=mid)query_sum(l,r,m<<1);else if(l>=mid+1)query_sum(l,r,m<<1|1);else{query_sum(l,mid,m<<1);query_sum(mid+1,r,m<<1|1);}
}
int main()
{int n,m;while(scanf("%d%d",&n,&m)==2){for(int i=1; i<=n; i++)scanf("%d",&a[i]);build(1,n,1);while(m--){    scanf("%s",str);if(str[0]=='U'){int x,y;scanf("%d%d",&x,&y);update(x,y,1);}if(str[0]=='Q'){int x,y;scanf("%d%d",&x,&y);ans=-9999999;query_sum(x,y,1);printf("%d\n",ans);}}}return 0;
}

第二种写法:

#include<bits/stdc++.h>
using namespace std;#define e exp(1)
#define pi acos(-1)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define mem(a,b) memset(a,b,sizeof(a))const int maxn=200000+10;struct node{int l,r,mxn;
}tree[maxn<<2];int ans,a[maxn];
char str[10];void build(int l,int r,int m)
{tree[m].l=l;tree[m].r=r;if(l==r){tree[m].mxn=a[l];return ;}int mid=(l+r)>>1;build(l,mid,m<<1);build(mid+1,r,m<<1|1);tree[m].mxn=max(tree[m<<1].mxn,tree[m<<1|1].mxn);
}int update(int a,int val,int m)
{if(a<tree[m].l||tree[m].r<a){return tree[m].mxn;}if(tree[m].l==a&&tree[m].r==a){return tree[m].mxn=val; }int x=update(a,val,m<<1);int b=update(a,val,m<<1|1);tree[m].mxn=max(x,b);return tree[m].mxn;
}int query_sum(int l,int r,int m)
{//printf("%d %d %d\n",l,r,m);if(r<tree[m].l||tree[m].r<l)return 0;if(l<=tree[m].l&&tree[m].r<=r){return tree[m].mxn;}int a=query_sum(l,r,m<<1);int b=query_sum(l,r,m<<1|1);return max(a,b);
}
int main()
{int n,m;while(scanf("%d%d",&n,&m)==2){for(int i=1; i<=n; i++)scanf("%d",&a[i]);build(1,n,1);while(m--){scanf("%s",str);if(str[0]=='U'){int x,y;scanf("%d%d",&x,&y);update(x,y,1);}if(str[0]=='Q'){int x,y;scanf("%d%d",&x,&y);printf("%d\n",query_sum(x,y,1));}}}return 0;
}

hdu1754(简单线段树)相关推荐

  1. 线段树-简单线段树模板

    简单线段树 2021年7月30 线段树是干什么的? 更新,维护,查询某区间的某项值,如区间和等. 线段树的原理 与树状数组类似,线段树通过直接建树来保存区间的结点,如图: 如何建图? 下面以求序列区间 ...

  2. hdu 3016 Man Down(简单线段树简单DP)

    Man Down Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. hdu1156(简单线段树 模板题)

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

  4. 【总结】一些简单线段树题目的口胡题解

    bzoj1645 离散化+扫描线 tyvj1473 校门外的树3 思维僵化(非要套离线枚举右端点然而不好做)系列,直接容斥求不与[l,r][l,r][l,r]相交的线段个数即可 bzoj3653谈笑风 ...

  5. 【转载】线段树题目2

    1.hdu1166 敌兵布阵 更新节点,区间求和. 2.hdu1754 I Hate It 更新节点,区间最值. . 3.hdu1698 Just a Hook 成段更新,总区间求和. . 4.hdu ...

  6. 线段树递归和非递归实现+hdu1166 敌兵布阵

    递归代码: #include <string> #include <cstring> #include <iostream> #include <stdio. ...

  7. HDU - 6393 Traffic Network in Numazu(线段树+LCA+树链剖分+并查集)

    题目链接:点击查看 题目大意:给出一个由n个点和n条边组成的图,每条边都有权值,题目保证图是连通的,然后给出m个询问,每次询问分为两种形式: 0 x y:将第x条边的权值修改为y 1 x y:查询x- ...

  8. 算法竞赛从入门到进阶pdf_【算法趣谈】线段树 从入门到进阶

        前言:这是一篇笔者两年前所写的博客.如今,在线段树在脑海中即将遗忘之际,这两年前留下的文章,终于将其再次唤醒.这篇文章对于线段树的理解虽谈不上绝对深刻,但是也能详细且简明地解释其流程.因而也收 ...

  9. HDU 5454 Excited Database【线段树】

    简单线段树,就是推公式的过程有点不是特别熟练. 按照叉姐的方法,可以用三个树状数组维护,三种情况. 按照坦克工程师的方法,用容斥,将一个矩形分解成三个三角形,一个大的直角三角形减去两个小的直角三角形, ...

最新文章

  1. Oracle Exadata 一体机关机过程(虚拟机环境)
  2. 怎么用matlab画TM11,矩形波导TM11模matlab仿真
  3. win10电脑pppoe拨号模块损坏_电脑维修免费在线咨询
  4. VTK:几何对象之Hexahedron
  5. 1 用存储过程实现分页,除了上一页,下一页,第一页,和末页外还要有go按钮,以及go到那里的文本框。另外还要在Lable显示“当前x页,一共y页”。注意验证控件的使用和 链接存储过程的内容。...
  6. defender 删除_Java 8中的默认方法(Defender方法)简介
  7. 微信小程序怎么在wxml中插入多个图片_闲聊微信小程序开发框架(二)
  8. arrays中copyof复制两个数组_Java教程分享之数组知识梳理
  9. C++ 对象没有显式初始化
  10. java创建ssh链接池_HttpClient实战三:Spring整合HttpClient连接池
  11. 完全卸载NI系列软件的方法
  12. 图片放大后怎么把图片变清晰?
  13. 关于SM2加密验签的操作
  14. python爬虫的意义_爬虫的意义与爬虫基本流程
  15. 面试 http://mp.weixin.qq.com/s/p5mXVzixSDZZ6o9DpU5Xaw
  16. 计算机怎么设置本地硬盘启动,怎么设置移动硬盘启动
  17. 《现代控制理论》第四章
  18. 布袋除尘器类毕业论文文献有哪些?
  19. python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解
  20. win32编程的经典书籍

热门文章

  1. js替换iframe的内容
  2. 用 Scikit-Learn 和 Pandas 学习线性回归
  3. 关于jquery.AutoComplete插件的一些使用心得(编码问题,效率问题)
  4. CUDA内存类型memory
  5. 深入理解内存(3):内存交换技术,虚拟内存
  6. 图像处理中的拉普拉斯算子
  7. C语言函数手册:c语言库函数大全|C语言标准函数库|c语言常用函数查询
  8. MapReduce_自学过程(一)
  9. C++ KMP算法完整实现
  10. CSDN转载别人文章的详细步骤