HDU 1754 I Hate It(线段树:单点替换,区间最值)
2014-03-24 23:42
399 查看
HDU 1754 I Hate It(线段树:单点替换,区间最值)
http://acm.hdu.edu.cn/showproblem.php?pid=1754
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
对于每一次询问操作,在一行里面输出最高成绩。
分析:
依然是线段树的基本操作.详解:
AC代码(新):
AC代码: 515ms
http://acm.hdu.edu.cn/showproblem.php?pid=1754
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
对于每一次询问操作,在一行里面输出最高成绩。
分析:
依然是线段树的基本操作.详解:
AC代码(新):
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=200000+5; #define lson i*2,l,m #define rson i*2+1,m+1,r #define INF 1e9 int maxv[maxn*4]; void PushUp(int i) { maxv[i]=max(maxv[i*2], maxv[i*2+1]); } void build(int i,int l,int r) { if(l==r) { scanf("%d",&maxv[i]); return; } int m=(l+r)/2; build(lson); build(rson); PushUp(i); } int query(int ql,int qr,int i,int l,int r) { if(ql<=l && r<=qr) return maxv[i]; int m=(l+r)/2; int max_val=-INF; if(ql<=m) max_val=max(max_val,query(ql,qr,lson)); if(m<qr) max_val=max(max_val,query(ql,qr,rson)); return max_val; } void update(int id,int val,int i,int l,int r) { if(l==r) { maxv[i]=val; return; } int m=(l+r)/2; if(id<=m) update(id,val,lson); else update(id,val,rson); PushUp(i); } int main() { int n,m; while(scanf("%d%d",&n,&m)==2) { build(1,1,n); while(m--) { char str[10]; int u,v; scanf("%s%d%d",str,&u,&v); if(str[0]=='Q') printf("%d\n",query(u,v,1,1,n)); else update(u,v,1,1,n); } } return 0; }
AC代码: 515ms
<span style="font-size:18px;">//HDU1754 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=200000+100; int maxv[MAXN*4]; #define lson i*2,l,m #define rson i*2+1,m+1,r void PushUp(int i) { maxv[i] = max(maxv[i*2] , maxv[i*2+1]); } void build(int i,int l,int r) { if(l==r) { scanf("%d",&maxv[i]); return ; } int m=(r+l)/2; build(lson); build(rson); PushUp(i); } int query(int ql,int qr,int i,int l,int r) { if(ql<=l&&r<=qr) return maxv[i]; int m=(l+r)/2; int max_v=-1e8; if(ql<=m)max_v=max(max_v,query(ql,qr,lson)); if(qr>m)max_v=max(max_v,query(ql,qr,rson)); return max_v; } void update(int q,int v,int i,int l,int r) { if(l==r) { maxv[i]=v; return ; } int m=(r+l)/2; if(q<=m)update(q,v,lson); else update(q,v,rson); PushUp(i); } int main() { int n,m; while(scanf("%d%d",&n,&m)==2&&n&&m) { build(1,1,n); while(m--) { char str[10]; int x,y; scanf("%s%d%d",str,&x,&y); if(str[0]=='Q')printf("%d\n",query(x,y,1,1,n)); else update(x,y,1,1,n); } } return 0; } </span>
相关文章推荐
- HDU 1754 I Hate It(线段树 单点替换,区间最值)
- HDU 1754 I Hate It(线段树--单点替换之区间最值)
- hdu 1754 I Hate It线段树单点替换,区间最值
- HDU 1754 I Hate It(线段树单点替换/区间最值)
- HDU 1754 I Hate It(线段树:单点替换,区间最值)
- hdu 1754 I Hate It(线段树,单点替换,求区间最值)
- HDU 1754 I Hate It(线段树/单点替换、区间最值)
- HDU 1754 I Hate It (线段树 单点替换, 区间最值)
- HDU 1754 I Hate It(线段树/单点替换、区间最值)
- 模板(线段树 + 树状数组 + 单点查询 + 区间查询)eg:HDU 1754 - I Hate It
- hdu 1754 I Hate It(线段树之 单点更新+区间最值)
- HDU-1754 I Hate It (线段树裸题 splay模板 单点修改 区间询问最大值)
- hdu 1754 I Hate It【线段树,单点替换,区间最值】
- HDU - 1754 I Hate It(简单线段树 单点更新+区间查询)
- hdu 1754 I Hate It(线段树单点更新(a位置的值变成b)+区间求最值)
- HDU 1754 I hate it【线段树之单点替换区间最值】
- hdu 1754 I Hate It(线段树单点更新及区间最值)
- HDU 1754 I Hate It (线段树 -- 单点替换,区间最值)
- HDOJ(HDU).1754 I Hate It (ST 单点替换 区间最大值)
- hdu1754 I Hate It(线段树,单点更新,区间最值)