zoukankan      html  css  js  c++  java
  • HDU 1754 I Hate It (段树单点更新)

    Problem Description
    很多学校更受欢迎的习惯。

    老师们真的很喜欢问。从XX XX到其中,的是多少。
    这让非常多学生非常反感。



    无论你喜不喜欢,如今须要你做的是,就是依照老师的要求。写一个程序,模拟老师的询问。当然。老师有时候须要更新某位同学的成绩。

     

    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
     


    感觉没什么好说的,这是我线段树的入门题,感觉效果非常好



    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    #define L(x) (x<<1)
    #define R(x) (x<<1|1)
    #define MID(x,y) ((x+y)>>1)
    using namespace std;
    #define N 200005
    
    struct stud{
    int le,ri;
    int va;
    }f[N*4];
    
    int a[N];
    
    void pushup(int pos)
    {
        f[pos].va=max(f[L(pos)].va,f[R(pos)].va);
    }
    
    void build(int pos,int le,int ri)
    {
        f[pos].le=le;
        f[pos].ri=ri;
    
        if(le==ri)
        {
          f[pos].va=a[le];
          return ;
        }
        int mid=MID(le,ri);
    
        build(L(pos),le,mid);
        build(R(pos),mid+1,ri);
    
       pushup(pos);
    }
    
    void update(int pos,int le,int ri)
    {
        if(f[pos].le==le&&f[pos].ri==le)
        {
            f[pos].va=ri;
            return ;
        }
    
        int mid=MID(f[pos].le,f[pos].ri);
    
        if(mid>=le)
            update(L(pos),le,ri);
        else
            update(R(pos),le,ri);
    
        pushup(pos);
    }
    
    int query(int pos,int le,int ri)
    {
       if(f[pos].le>=le&&f[pos].ri<=ri)
       {
           return f[pos].va;
       }
    
       int mid=MID(f[pos].le,f[pos].ri);
    
       if(mid>=ri)
        return query(L(pos),le,ri);
       else
        if(mid<le)
        return query(R(pos),le,ri);
       else
          return max(query(L(pos),le,mid),query(R(pos),mid+1,ri));
    }
    
    int main()
    {
        int n,m,i;
    
        while(~scanf("%d%d",&n,&m))
        {
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
    
             build(1,1,n);
    
            char c[10];
            int le,ri;
    
            while(m--)
            {
                scanf("%s%d%d",c,&le,&ri);
    
                if(c[0]=='Q')
                    printf("%d
    ",query(1,le,ri));
                else
                    update(1,le,ri);
            }
        }
        return 0;
    }
    






    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    使用WinDbg调试SQL Server——入门
    SQL Server里如何随机记录集
    相关列的基数计算
    自增长的聚集键值不会扩展(scale)
    使用正确的筛选参数来提高查询性能
    可更新聚集列存储索引幻想
    在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)
    SQL Server 2014里的IO资源调控器
    SQL Server 2014里的针对基数估计的新设计(New Design for Cardinality Estimation)
    缓存池扩展 (Buffer Pool Extension)实践
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4712619.html
Copyright © 2011-2022 走看看