最高分是多少(线段树) 华为2016校园招聘

来源:互联网 发布:凡科怎么绑定域名 编辑:程序博客网 时间:2024/05/24 07:50

[编程题]最高分是多少
老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩. 
输入描述:
输入包括多组测试数据。每组输入第一行是两个正整数N和M(0 < N <= 30000,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。


输出描述:
对于每一次询问操作,在一行里面输出最高成绩.

输入例子:
5 71 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 4 5U 2 9Q 1 5

输出例子:
5659

题目链接:http://www.nowcoder.com/questionTerminal/3897c2bcc87943ed98d8e0b9e18c4666


线段树,查找区间内的最大值!不会线段树的也可以练练手。


#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;const int mmax=30000;//最底层30000个结点的满二叉树int data[mmax+5];int tarr[mmax*4+5];void build(int p,int l,int r)//p表示当前位置{    if(l==r)    {        tarr[p]=data[l];        return ;    }    int m=(l+r)>>1;    int L=p<<1;    int R=p<<1|1;    build(L,l,m);    build(R,m+1,r);    tarr[p]=max(tarr[L],tarr[R]);}int Query(int a,int b,int p,int l,int r){    if(a<=l&&r<=b)        return tarr[p];    int m=(l+r)>>1;    int L=-1;    int R=-1;    if(a<=m) L=Query(a,b,p<<1,l,m);    if(m<b)  R=Query(a,b,p<<1|1,m+1,r);    if(L==-1) return R;    if(R==-1) return L;    return max(R,L);}void Update(int idy,int value,int p,int l,int r){    if(l==r&&l==idy)    {        tarr[p]=value;        return ;    }    int m=(l+r)>>1;    if(idy<=m) Update(idy,value,p<<1,l,m);    if(m<idy)  Update(idy,value,p<<1|1,m+1,r);    tarr[p]=max(tarr[p<<1],tarr[p<<1|1]);//返回的时候看左边大还是右边大}int main(){    int N,M;    while(~scanf("%d%d",&N,&M))    {        for(int i=1;i<=N;i++)            scanf("%d",&data[i]);        build(1,1,N);        char ch;        int a,b;        while(M--)        {            scanf(" %c%d%d",&ch,&a,&b);            if(ch=='U')                Update(a,b,1,1,N);            else if(ch=='Q')            {                if(a>b) swap(a,b);                printf("%d\n",Query(a,b,1,1,N));            }        }    }    return 0;}

0 0
原创粉丝点击