zoukankan      html  css  js  c++  java
  • HDU 1754 I Hate It<区间最值 单点修改>

    I Hate It

    Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 76334    Accepted Submission(s): 29413


    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
    对于每一次询问操作,在一行里面输出最高成绩。
     
    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
    Hint
    Huge input,the C function scanf() will work better than cin
     
    Author
    linle
     
    Source
     
    Recommend
    lcy   |   We have carefully selected several similar problems for you:  1698 1542 1394 2795 1540 
    线段树维护区间最值 单点修改
    #include<cstdio>
    
    
    const int N=200005;
    char a[10];
    int p,q; 
    int sum[N*3];
    int read(){
        int x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}return x*f;}
    int max(int x,int y)
    {
        if(x>y)return x;
        return y;
    }
    void update(int rt)
    {
        sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
    }
    void build(int l,int r,int rt)
    {
        if(l==r){
            sum[rt]=read(); return ;
        }
        int mid=(l+r)>>1;
        build(l,mid,rt<<1);
        build(mid+1,r,rt<<1|1);
        update(rt);
    }
    void modify(int l,int r,int rt)
    {
        if(r==l){
            sum[rt]=q;return;
        }
        int mid=(l+r)>>1;
        if(mid>=p) modify(l,mid,rt<<1);
        else modify(mid+1,r,rt<<1|1);
        update(rt);
    }
    
    int query(int l,int r,int rt,int nowl,int nowr)
    {
        if(nowl<=l&&nowr>=r)
        {
            return sum[rt];
        }
        int m=(r+l)>>1;
        int ans=0;
        if(nowl<=m) ans=max(ans,query(l,m,rt<<1,nowl,nowr));
        if(nowr>m) ans=max(ans,query(m+1,r,rt<<1|1,nowl,nowr));
        return ans;
    }
    
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)==2)
        {
            build(1,n,1);
            while(m--)
            {
                scanf("%s",a);
                p=read();q=read();
                if(a[0]=='U')modify(1,n,1);
                else if(a[0]=='Q')printf("%d
    ",query(1,n,1,p,q));
            }    
        }
        return 0;
    } 
  • 相关阅读:
    深入理解JavaScript系列(45):代码复用模式(避免篇)
    深入理解JavaScript系列(38):设计模式之职责链模式
    深入理解JavaScript系列(43):设计模式之状态模式
    认识js中的function和this
    深入理解JavaScript系列(29):设计模式之装饰者模式
    javascript的内存分配
    详细解读Jquery各Ajax函数
    javascript 杂谈之哪种写法你更喜欢?
    深入理解JavaScript系列(28):设计模式之工厂模式
    深入理解JavaScript系列(30):设计模式之外观模式
  • 原文地址:https://www.cnblogs.com/sssy/p/7060099.html
Copyright © 2011-2022 走看看