• HDU 1754 I Hate It(线段树单点替换+区间最值)


    I Hate It

    【题目链接】I Hate It

    【题目类型】线段树单点替换+区间最值

    &题意:

    本题目包含多组测试,请处理到文件结束。
    在每个测试的第一行,有两个正整数 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。

    &题解:

    线段树单点替换+区间最值 模板题 也就是把上一篇博客改改就能a了

    【时间复杂度】(O(nlogn))

    &代码:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    
    #define lsn b,m,rt<<1
    #define rsn m+1,e,rt<<1|1
    
    const int maxn=200000+9;
    int seg[maxn<<2];
    int a[maxn];
    
    inline void PushUp(int rt)
    {
        //这是赋值 不是+=
        seg[rt]=max(seg[rt<<1],seg[rt<<1|1]);
    }
    void Build(int b,int e,int rt)
    {
        seg[rt]=0;
        if (b==e){
            seg[rt]=a[b];
            return;
        }
        int m=b+e>>1;
        Build(lsn);
        Build(rsn);
        PushUp(rt);
    }
    void Updata(int idx,int xx,int b,int e,int rt)
    {
        if (b==e){
            seg[rt]=xx;
            return ;
        }
        int m=b+e>>1;
        //这不用再像区间一样弄了  因为只有1个位置 所以if else就够了  不用if + if 了
        if (idx<=m)
            Updata(idx,xx,lsn);
        else
            Updata(idx,xx,rsn);
        PushUp(rt);
    }
    int Query(int l,int r,int b,int e,int rt)
    {
        if (l<=b&&e<=r){
            return seg[rt];
        }
        int m=b+e>>1;
        int ans=0;
        if (l<=m)
            ans=max(ans,Query(l,r,lsn));
        if (m<r)
            ans=max(ans,Query(l,r,rsn));
        return ans;
    }
    int main()
    {
        int n,m;
        while(~scanf("%d%d",&n,&m)){
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            Build(1,n,1);
            char op[33];
            int u,v;
            while(m--){
                scanf("%s",op);
                scanf("%d%d",&u,&v);
                if (op[0]=='U')
                    Updata(u,v,1,n,1);
                if (op[0]=='Q')
                    printf("%d
    ",Query(u,v,1,n,1));
            }
        }
        return 0;
    }
    
  • 相关阅读:
    Python学习第七天——随机码生成
    Python学习第六天——Fibonacci
    Python学习第五天——递归函数
    Python学习第四天——文件修改
    Python学习第三天——三级目录
    Python学习第二天——购物车程序
    Python学习第一天——用户名登录退出
    Linux什么时候在pc机上有一席之地
    关于系统设计时性能以及可扩展性的考虑
    HyberLedger Fabric学习(4)-chaincode学习(操作人员)
  • 原文地址:https://www.cnblogs.com/s1124yy/p/6204265.html
Copyright © 2020-2023  润新知