HDU1754-I Hate It-线段树(单点更新)
2016-07-20 10:38
381 查看
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
ps:同种更新方法不同写法
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
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
ps:同种更新方法不同写法
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct s{ int i,j,k; }a[5000004]; void build(int r,int i,int j) { a[r].i=i; a[r].j=j; if(i==j) { scanf("%d",&a[r].k); return ; } int k=(i+j)/2; build(r<<1,i,k); build(r<<1|1,k+1,j); a[r].k=max(a[r<<1].k,a[r<<1|1].k); } void update(int r,int x,int y) { if(a[r].i==x&&a[r].j==x) { a[r].k=y; return ; } int k=(a[r].i+a[r].j)/2; if(x<=k) update(r<<1,x,y); else update(r<<1|1,x,y); a[r].k=max(a[r<<1].k,a[r<<1|1].k); } int query1(int r,int i,int j) { if(a[r].i>=i&&a[r].j<=j) { return a[r].k; } int m=0,k=(a[r].i+a[r].j)/2; if(j<=k) return query1(r<<1,i,j); else if(i>k) return query1(r<<1|1,i,j); m=query1(r<<1|1,i,j); m=max(m,query1(r<<1,i,j)); return m; } int query2(int r,int i,int j) { if(a[r].i>j||a[r].j<i) return 0; if(a[r].i>=i&&a[r].j<=j) return a[r].k; return max(query2(r<<1,i,j),query2(r<<1|1,i,j)); } int main() { int n,m,i,x,y; char r; while(~scanf("%d%d",&n,&m)) { build(1,1,n); for(i=1;i<=m;i++) { getchar(); scanf("%c%d%d",&r,&x,&y); if(r=='Q') printf("%d\n",query2(1,x,y)); else update(1,x,y); } } return 0; }
相关文章推荐
- 配置Log4j
- zabbix3.0.3 设置邮件报警
- Codeforces 399B. One Bomb (模拟)
- IT 运行在云端,而云运行在 Linux 上
- thinkphp中import函数的使用
- Git stash and Git stash pop detial
- C语言sscanf函数的总结
- 在Linux上怎么录制终端操作
- 中文分词算法
- PHP判断远程文件是否存在
- 怎样将驱动静态的编译到内核中。
- Linux下Java环境配置
- XML sax 解析
- Thinkphp htmllist 标签的使用
- unity3d的local和global
- RNN-LSTM系列
- ubuntu16下安装MySQLdb
- iOS极光推送 点击推送消息跳转页面
- Java学习日志(3)-继承
- Android启动过程深入解析【转】