HDU-1754-I Hate It

来源:互联网 发布:淘宝买家秀怎么发 编辑:程序博客网 时间:2024/06/07 08:36

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1754

题目

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input

本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 1<=N<=200000,1<=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 <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=8e5+100;int s[maxn];void modify(int p,int l,int r,int pos,int d){    s[p]=max(s[p],d);    if(l==r) return;    int mid=(l+r)/2;    if(pos<=mid) modify(p*2,l,mid,pos,d);    else modify(p*2+1,mid+1,r,pos,d);}int query(int p,int l,int r,int x,int y){    if(x<=l && r<=y) return s[p];    int mid=(l+r)/2,ret=0;    if(x<=mid) ret=max(ret,query(p*2,l,mid,x,y));    if(y>mid) ret=max(ret,query(p*2+1,mid+1,r,x,y));    return ret;}int main(){    int N,M;    while(~scanf("%d%d",&N,&M))    {        memset(s,0,sizeof(s));        for(int i=1;i<=N;i++)        {            int a;            scanf("%d",&a);            modify(1,1,N,i,a);        }        while(M--)        {            char C;            int x,y;            getchar(); //%c会读取键盘缓冲区中的回车符             scanf("%c%d%d",&C,&x,&y);            if(C=='Q') printf("%d\n",query(1,1,N,x,y));            else modify(1,1,N,x,y);        }    }    return 0;}

代码二:树状数组解法

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=2e5+100;int tree[maxn],s[maxn],N;int lowbit(int i){    return i&(-i);}void update(int i,int d){    s[i]=d;    while(i<maxn)    {        tree[i]=max(tree[i],d);        i+=lowbit(i);    }}int query(int l,int r){    int ans=0;    while(l<=r)    {        ans=max(ans,s[r]);        for(--r;r>=l+lowbit(r);r-=lowbit(r))        {            ans=max(ans,tree[r]);        }    }    return ans;}int main(){    int M;    while(~scanf("%d%d",&N,&M))    {        memset(s,0,sizeof(s));        memset(tree,0,sizeof(tree));        for(int i=1;i<=N;i++)        {            int a;            scanf("%d",&a);            s[i]=a;            update(i,a);        }        while(M--)        {            char C;            int x,y;            getchar(); //%c会读取键盘缓冲区中的回车符             scanf("%c%d%d",C,&x,&y);            if(C=='Q') printf("%d\n",query(x,y));            else update(x,y);        }    }    return 0;}
原创粉丝点击