HDU 1754 I Hate It(线段树)

mac2022-06-30  23

HDU 1754 I Hate It(线段树)

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

Http

HDU:https://vjudge.net/problem/HDU-1754

Source

线段树

题目大意

维护一个数列,支持下面两种操作: 1.修改某个数的值 2.求一段区间的最大值

解决思路

直接用线段树维护,关于线段树可以参考我的这篇博客。 注意细节

代码

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; const int maxN=2000001; const int inf=2147483647; class SegmentTree { public: int maxnum; }; int n; SegmentTree T[maxN*4]; void init(int l,int r,int now); int read(); int Query(int l0,int r0,int l,int r,int now); void Updata(int id,int val,int l,int r,int now); int main() { int m; while (cin>>n>>m) { init(1,n,1); for (int i=1;i<=m;i++) { char ch; int a,b; cin>>ch>>a>>b; if (ch=='Q') cout<<Query(a,b,1,n,1)<<endl; else Updata(a,b,1,n,1); } } } int read() { int x=0; int k=1; char ch=getchar(); while (((ch<'0')||(ch>'9'))&&(ch!='-')) ch=getchar(); if (ch=='-') { k=-1; ch=getchar(); } while ((ch<='9')&&(ch>='0')) { x=x*10+ch-48; ch=getchar(); } return x*k; } void init(int l,int r,int now) { if (l==r) { T[now].maxnum=read(); return; } int mid=(l+r)/2; init(l,mid,now*2); init(mid+1,r,now*2+1); T[now].maxnum=max(T[now*2].maxnum,T[now*2+1].maxnum); return; } int Query(int l0,int r0,int l,int r,int now) { if ((l0==l)&&(r0==r)) { return T[now].maxnum; } //if (l==r) // return T[now].maxnum; int mid=(l+r)/2; if (r0<=mid) return Query(l0,r0,l,mid,now*2); else if (l0>=mid+1) return Query(l0,r0,mid+1,r,now*2+1); else return max(Query(l0,mid,l,mid,now*2),Query(mid+1,r0,mid+1,r,now*2+1)); } void Updata(int id,int val,int l,int r,int now) { if (l==r) { T[now].maxnum=val; return; } int mid=(l+r)/2; if (id<=mid) Updata(id,val,l,mid,now*2); else Updata(id,val,mid+1,r,now*2+1); T[now].maxnum=max(T[now*2].maxnum,T[now*2+1].maxnum);//注意这里每一次修改后要重新比较 return; }

转载于:https://www.cnblogs.com/SYCstudio/p/7218007.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)