HDU 1754 I Hate It
2016-05-16 19:38
246 查看
I Hate It
Time Limit:3000MS Memory
Limit:32768KB 64bit IO Format:%I64d & %I64u
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
Sample Output
Hint
分析:RMQ问题,用线段树来实现点的修改和查询
Time Limit:3000MS Memory
Limit:32768KB 64bit IO Format:%I64d & %I64u
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 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9 Q 1 5
Sample Output
565 9
Hint
Huge input,the C function scanf() will work better than cin
分析:RMQ问题,用线段树来实现点的修改和查询
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define Lson o * 2, L, M //左儿子 #define Rson o * 2 + 1, M + 1, R //右儿子 const int MAXM = 200000 * 3 + 100; int maxv[MAXM]; int ql,qr,p,v; int n,m; void Build(int o,int L,int R) //建树 { if(L == R) //叶子节点 scanf("%d",&maxv[o]); else { int M = (L + R) / 2; Build(Lson); //左子树 Build(Rson); //右子树 maxv[o] = max(maxv[o * 2],maxv[o * 2 + 1]); //更新 } } int Query(int o,int L,int R)//查询 { int M = L + (R - L) / 2,ans = -1; if(ql <= L && R <= qr) //当前节点完全包含在查询区间内 return maxv[o]; if(ql <= M) ans = max(ans,Query(Lson));//往左走 if(M < qr) ans = max(ans,Query(Rson));//往右走 return ans; } void Update(int o,int L,int R)//修改 { int M = L + (R - L) / 2; if(L == R) maxv[o] = v; //叶子节点,直接修改 else { if(p <= M) Update(Lson);//先递归更新左子树或者右子树 else Update(Rson); maxv[o] = max(maxv[o * 2],maxv[o * 2 + 1]); } } int main() { while(scanf("%d %d",&n,&m) != EOF) { memset(maxv,0,sizeof(maxv)); Build(1,1,n); getchar(); char s[5]; while(m--) { scanf("%s",s); if(s[0] == 'Q') { scanf("%d %d",&ql,&qr); printf("%d\n",Query(1,1,n)); } else { scanf("%d %d",&p,&v); Update(1,1,n); } } } return 0; }
相关文章推荐
- (8)绝不在构造和析构过程中调用virtual函数
- close()和shutdown()函数
- Sublime Text (3) for PHP Developers
- PHP下foreach的作用域,对数组的操作影响
- scrollview嵌套viewpager不能上下滑动的问题
- 并查集的解题集合
- (7)别让异常逃离析构函数
- Kali Rolling 2016.1 安装无线网卡驱动
- LeetCode题解:345. Reverse Vowels of a String
- ACM新手水题解答
- Mybatis中#和$的区别
- Android NDK总结
- PAT 天梯赛 L2-002 链表去重
- (6)为多态基类声明virtual析构函数
- android studio文件名颜色分别表示含义
- shell脚本的使用---特殊变量及脚本的综合使用
- 二维数组及冒泡排序
- Linux开启ssh服务
- (5)若不想使用编译器自动生成的函数,就该明确拒绝
- 为什么要用hibernate 与基于数据库表结构的项目开发