码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1754

时间:2015-08-07 19:52:07      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

链接:点击打开链接

题意:本题目包含多组测试,请处理到文件结束,
在每个测试的第一行,有两个正整数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.
对于每一次询问操作,在一行里面输出最高成绩

代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
int node[2000000];
using namespace std;
void update(int pos,int l,int r,int id,int x){
    int mid;
    if(l==r){
        node[pos]=x;
        return;
    }
    mid=(l+r)/2;
    if(id<=mid)update(2*pos,l,mid,id,x);
    else
    update(2*pos+1,mid+1,r,id,x);
    node[pos]=max(node[pos*2],node[pos*2+1]);   //回溯时比较大小
}
int question(int pos,int l,int r,int ll,int rr){
    int mid,sum=0;
    if(ll<=l&&rr>=r)
    return node[pos];
    mid=(l+r)/2;
    if(ll<=mid)sum=max(sum,question(2*pos,l,mid,ll,rr));
    if(rr>mid)sum=max(sum,question(2*pos+1,mid+1,r,ll,rr));
    return sum;
}                                               //线段树模板
int a[200005];
int main(){
    int m,n,i,x,y;
    char c;
    while(scanf("%d%d",&m,&n)!=EOF){
        for(i=1;i<=m;i++){
            scanf("%d",&a[i]);
            update(1,1,m,i,a[i]);
        }
        for(i=1;i<=n;i++){
        cin>>c;
        scanf("%d%d",&x,&y);
        if(c=='U')
        update(1,1,m,x,y);
        else if(c=='Q')
        printf("%d\n",question(1,1,m,x,y));
        }
    }
    return 0;
}


 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu1754

标签:

原文地址:http://blog.csdn.net/stay_accept/article/details/47343211

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!