I Hate It
2016-04-01 18:08
169 查看
Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数
学生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
线段树的一道题目
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数
学生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
线段树的一道题目
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <algorithm> using namespace std; int aa[200000 * 4]; int max(int x, int y) { if(x >= y) return x; return y; } void build(int root, int L, int R)//建树 { int mid = (L + R) / 2; if(L == R) { scanf("%d", &aa[root]); return ; } build(root * 2, L, mid); build(root * 2 + 1, mid + 1, R); aa[root] = max(aa[root * 2], aa[root * 2 + 1]);//因为是最大值,所以,每一层的每个结点都是最大值 } void update(int root, int L, int R, int begin, int V)//更新 { int mid = (L + R) / 2; if(L == R) { aa[root] = V; //更新值 return ; } int k1 = 0, k2 = 0; if(begin <= mid) update(root * 2, L, mid, begin, V); else update(root * 2 + 1, mid + 1, R, begin, V); aa[root] = max(aa[root * 2], aa[root * 2 + 1]); } int query(int root, int L, int R, int begin, int end)//查找 { int mid = (L + R) / 2; if(L >= begin && R <= end) { return aa[root]; //当满足要求的时候就return aa[root]; } int k = 0; if(begin <= mid) k = max(query(root * 2, L, mid, begin, end), k);//更新的依然是最大值 if(mid < end) k = max(query(root * 2 + 1, mid + 1, R, begin, end), k); return k; } int main() { int n, m, a, b; char xx[10]; while(~scanf("%d %d", &n, &m)) { memset(aa, 0, sizeof(aa)); build(1, 1, n); for(int i = 0; i < m; i++) { scanf("%s %d %d", xx, &a, &b); if(xx[0] == 'U') { update(1, 1, n, a, b); } else { int t = query(1, 1, n, a, b); printf("%d\n", t); } } } return 0; }
相关文章推荐
- NGX学习: ngx_event事件机制
- something behind kmalloc
- java swing 中的列表框JList如何在程序中动态的添加和删除元素
- Android_新建animation动画res/anim目录
- maven修改目录
- Qt操作SQLite数据库——创建、打开、关闭、增加、删除和修改操作
- FZU 2121 神庙逃亡(物理速度公式)
- 【2016】三月份英语学习总结
- 有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。
- IP地址地理位置接口(python版)
- cocos2d-js创建帧动画
- Delphi XE中类成员的访问权限(新增了strict private和strict protected,还有automated)
- Nginx启用Gzip压缩js无效的原因
- JavaScript常用的String方法
- Android利用Camera实现图片的旋转动画 .
- hiho 1174 拓扑排序(一)
- ubuntu快速安装Caffe (CPU_ONLY,无cuda、无cuDNN)
- hdoj 1217 Arbitrage 【最短路径】【floyd】
- OC学习篇之---归档和解挡
- listview 模仿用户点击事件。