zoukankan      html  css  js  c++  java
  • hdu-1754 I Hate It

    题目链接:

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

    题目类型:

    图论-线段树

    题意概括:

    有N个学生M次操作,然后给出N个学生的成绩,如果输入Q A B,那么输出ID为A~B之间的学生中成绩最高的是多少,如果输入U A B,则将ID为A的学生成绩改为B。

    解题思路:

    线段树模板。

    题目:

    I Hate It

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


    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
    # include <stdio.h>
    # define MAX 2000000
    
    int x[MAX+10];
    
    struct tree{
        int l,r,m,s;
    }tr[MAX*4];
    
    int max(int a,int b)
    {
        if(a>b)
            return a;
        else
            return b;
    }
    
    int build(int a,int b,int r)//建立一个二叉树 
    {
        if(a==b)
        {
            tr[r].l=tr[r].r=a;
            tr[r].s=x[a];
            return tr[r].s;
        }
        tr[r].l=a;
        tr[r].r=b;
        tr[r].m=(a+b)/2;
        
        tr[r].s=max( build(a,tr[r].m,2*r) , build(tr[r].m+1,b,2*r+1) );
        return tr[r].s; 
    }
    
    void updata(int a,int x,int r)//更新 
    {
        if( tr[r].l==a && tr[r].r==a)
        {
            tr[r].s=x;
            return ;
        }
        if(a>tr[r].m)
        {
            updata(a,x,2*r+1);
            tr[r].s=max( tr[2*r].s , tr[2*r+1].s );
        }
        else
        {
            updata(a,x,2*r);
            tr[r].s=max( tr[2*r].s , tr[2*r+1].s );
        }
    }
    
    int querry(int a,int b,int r)
    {
        if(tr[r].l==a && tr[r].r==b)
            return tr[r].s;
        else if(a>tr[r].m)
            return querry(a,b,2*r+1);
        else if(b<=tr[r].m)
            return querry(a,b,2*r);
        else 
            return max( querry(a,tr[r].m,2*r), querry(tr[r].m+1,b,2*r+1));
    }
    
    int main ()
    {
        int i,m,n,z,y;
        char ch;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(i=1;i<=n;i++)
                scanf("%d",&x[i]); 
            build(1,n,1);
            for(i=1;i<=m;i++)
            {
                getchar();
                scanf("%c %d %d",&ch,&z,&y);
                if(ch=='Q')
                    printf("%d
    ",querry(z,y,1));
                else
                    updata(z,y,1);
            }
        }
        return 0;
     }
  • 相关阅读:
    进程同步中的读者写者问题
    操作系统进程同步习题记录
    基于Python Flask的web日程管理系统
    面向对象第四单元及课程总结博客
    Vimtutor(中文版)学习笔记各章小结
    常用设计模式汇总说明
    图解Apache Mina
    Rocketmq 集群
    读《图解HTTP》有感-(HTTP首部)
    读《图解HTTP》有感-(与HTTP协作的WEB服务器)
  • 原文地址:https://www.cnblogs.com/love-sherry/p/6964943.html
Copyright © 2011-2022 走看看