zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Codeforces Round #702 (Div. 3) 题解
    Educational Codeforces Round 104 (Rated for Div. 2) A~E题解
    AtCoder Regular Contest 112 A~D题解
    Codeforces Round #701 (Div. 2) A~E 题解
    java String, StringBuffer, StringBuilder简单介绍和使用
    货仓选址
    线程的同步
    数据结构课设作业
    线程的生命周期(java 图)
    JAVA多线程的创建和使用
  • 原文地址:https://www.cnblogs.com/s1124yy/p/6204265.html
Copyright © 2011-2022 走看看