zoukankan      html  css  js  c++  java
  • HDU1854

    HDU1854 - 线段树 单点修改区间最大值

    题目链接: I Hate It

    题目大意

    很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
    这让很多学生很反感。
    不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

    Input

    本题目包含多组测试,请处理到文件结束。
    在每个测试的第一行,有两个正整数 N 和 M ( 0

    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
    
    

    AC代码

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn = 200000;
    struct NOOD {
        int l, r, add, Max;
    }tree[maxn * 4 + 5];
    int N, M;
    int A[maxn + 5];
    void Build(int L, int R, int x) {
        tree[x].l = L, tree[x].r = R, tree[x].Max = 0;
        if(L == R) {
            tree[x].Max = A[L];
            return ;
        }
        int mid = (L + R) / 2;
        Build(L, mid, x * 2);
        Build(mid + 1, R, x * 2 + 1);
        tree[x].Max = max(tree[x * 2].Max, tree[x * 2 + 1].Max);
    }
    void PushDown(int x) {
        if(tree[x].add) {
            tree[x * 2].Max = tree[x].add;
            tree[x * 2 + 1].Max = tree[x].add;
            tree[x * 2].add = tree[x].add;
            tree[x * 2 + 1].add = tree[x].add;
            tree[x].add = 0;
        }
    }
    void Update(int L, int R, int add, int x) {
        if(L <= tree[x].l && tree[x].r <= R) {
            tree[x].add = add;
            tree[x].Max = add;
            return ;
        }
        PushDown(x);
        int mid = (tree[x].l + tree[x].r) / 2;
        if(L <= mid)Update(L, R, add, x * 2);
        if(R > mid)Update(L, R, add, x * 2 + 1);
        tree[x].Max = max(tree[x * 2].Max, tree[x * 2 + 1].Max);
    }
    
    int Query(int L, int R, int x) {
        if(L <= tree[x].l && tree[x].r <= R)return tree[x].Max;
        PushDown(x);
        int mid = (tree[x].l + tree[x].r) / 2;
        int res = 0;
        if(L <= mid) res = max(res, Query(L, R, x * 2));
        if(R > mid) res = max(res, Query(L, R, x * 2 + 1));
        return res;
    }
    int main() {
        while(~scanf("%d%d", &N, &M)) {
            memset(tree, 0, sizeof(tree));
            for(int i = 1; i <= N; i++)scanf("%d", &A[i]);
            Build(1, N, 1);
            char s[2]; int l, r;
            while(M--) {
                scanf("%s%d%d", s, &l, &r);
                if(s[0] == 'Q')printf("%d
    ", Query(l, r, 1));
                else Update(l, l, r, 1);
            }
        }
        return 0;
    }
  • 相关阅读:
    UVA1349 Optimal Bus Route Design 最优巴士路线设计
    POJ3565 Ants 蚂蚁(NEERC 2008)
    UVA1663 Purifying Machine 净化器
    UVa11996 Jewel Magic 魔法珠宝
    NEERC2003 Jurassic Remains 侏罗纪
    UVA11895 Honorary Tickets
    gdb调试coredump(使用篇)
    使用 MegaCLI 检测磁盘状态并更换磁盘
    员工直接坦诚直来直去 真性情
    山东浪潮超越3B4000申泰RM5120-L
  • 原文地址:https://www.cnblogs.com/TRDD/p/9813515.html
Copyright © 2011-2022 走看看