【HDU1754】【线段树】【单点更新】【4*m】
2015-08-26 18:22
316 查看
I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 52183 Accepted Submission(s): 20476
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 HintHuge input,the C function scanf() will work better than cin
Author
linle
Source
2007省赛集训队练习赛(6)_linle专场
#include <iostream> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <list> #include <map> #include <set> #include <string> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define mp push_back #define lson l,m,rt<<1 #define rson m,r,rt<<1|1 int n,m; const int MAXN = 200010; int MAX[MAXN*4]; void PushUp(int rt) { MAX[rt] = max(MAX[rt<<1],MAX[rt<<1|1]); } void build(int l,int r,int rt) { if(r - l == 1) { scanf("%d",&MAX[rt]); return ; } int m = (l + r) >> 1; build(lson); build(rson); PushUp(rt); } int query(int L,int R,int l,int r,int rt) { if(L <= l && r <= R) { return MAX[rt]; } int m = (l + r) >> 1; int ret = -1; if(L <= m-1) { ret = max(ret,query(L,R,lson)); } if(m <= R-1) { ret = max(ret,query(L,R,rson)); } return ret; } void update(int p,int v,int l,int r,int rt) { if(r - l == 1) { MAX[rt] = v; return ; } int m = (l + r) >> 1; if(p <= m-1) { update(p,v,lson); } else { update(p,v,rson); } PushUp(rt); } char str[2]; int main() { freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m) != EOF) { build(1,n+1,1); // for(int i=1;i<=n;i++) // { // cout << MAX[i] << endl; // } for(int i=0;i<m;i++) { scanf("%s",str); if(str[0] == 'Q') { int l,r; scanf("%d%d",&l,&r); printf("%d\n",query(l,r+1,1,n+1,1)); } else { int p,v; scanf("%d%d",&p,&v); update(p,v,1,n+1,1); } } } }
相关文章推荐
- 数据类型,变量,与运算符
- 实习_应聘
- HDOJ 3466 Proud Merchants(01背包)
- CSS+DIV两栏式全屏布局
- [LeetCode][JavaScript]Longest Substring Without Repeating Characters
- 当心不静的时候
- 将Map<String,Object> 转String存储数据库
- MyEclipse配置JDK6+Opencv2.4.11
- 使用SQL语句生成Web图表
- libcurl库的使用(通过libcurl库下载url图像)
- 九度OJ 题目1135:字符串排序
- c++-------------数组
- 线性判别函数
- libcurl库的使用(通过libcurl库下载url图像)
- 在 Java 中解压 zip 文件
- 华为机试之笨笨熊搬家
- leetcode之反转链表
- 九度OJ 题目1134:密码翻译
- Jenkins+Gradle
- Sqlite触发器关键字