HDU 1754 I Hate It (线段树)
2015-06-11 14:53
316 查看
I Hate It
Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit Status Practice HDU 1754
Appoint description:
wlxk (2013-01-20)
System Crawler (2015-06-07)
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
单点更新,模板题没什么好说的。
Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit Status Practice HDU 1754
Appoint description:
wlxk (2013-01-20)
System Crawler (2015-06-07)
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
单点更新,模板题没什么好说的。
#include <iostream> #include <cstdio> #include <string> #include <queue> #include <vector> #include <map> #include <algorithm> #include <cstring> #include <cctype> #include <cstdlib> #include <cmath> #include <ctime> #include <climits> using namespace std; const int SIZE = 200005; int TREE[SIZE * 4],N,M; void build(int,int,int); void update(int,int,int,int,int); int que(int,int,int,int,int); int main(void) { int a,b; char op; while(~scanf("%d%d",&N,&M)) { build(1,1,N); while(M --) { scanf(" %c%d%d",&op,&a,&b); if(op == 'Q') printf("%d\n",que(a,b,1,1,N)); else update(a,1,1,N,b); } } return 0; } void build(int node,int left,int right) { if(left == right) scanf("%d",&TREE[node]); else { int mid = (left + right) >> 1; build(node * 2,left,mid); build(node * 2 + 1,mid + 1,right); TREE[node] = max(TREE[node * 2],TREE[node * 2 + 1]); } } void update(int n,int node,int left,int right,int add) { if(left == n && right == n) { TREE[node] = add; return ; } else if(right < n || left > n) return ; int mid = (left + right) >> 1; update(n,node * 2,left,mid,add); update(n,node * 2 + 1,mid + 1,right,add); TREE[node] = max(TREE[node * 2],TREE[node * 2 + 1]); } int que(int L,int R,int node,int left,int right) { if(left >= L && right <= R) return TREE[node]; if(right < L || left > R) return 0; int mid = (left + right) >> 1; return max(que(L,R,node * 2,left,mid),que(L,R,node * 2 + 1,mid + 1,right)); }
相关文章推荐
- 面试题二
- android布局属性详解
- html 界面跳转传值问题
- 分组密码(Feistel密码结构)
- Hook HeapAlloc遇到的问题
- vjkoljl
- makefile教程
- UnityVS(Visual Studio Tools For Unity)的安装与使用
- AspNet MVC4 教学-28:Asp.Net MVC4 Ajax技术实现除法取整取余快速Demo
- cocos2dx EventListenerCustom类控制事件的分发 处理不同层之间的事件传递以及自定义用户数据
- 轻松管理你的网络密码
- 强大的vim配置文件,让编程更随意
- 翻转课堂,带来的远不止知识 --《Linux及安全》学期总结
- 类
- sublime text 插件开发
- java对象的序列化和反序列化
- C#处理Paint事件的方法
- Javascript模块化编程(二):AMD规范(转)
- 对阿里云、腾讯云和UCloud的云服务器简单性能测试
- 将整数以二进制格式输出