`

hdu 1754 I Hate It(最基本的线段树)

阅读更多

I Hate It

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

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 <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;

struct node
{
    int left, right, mid;
    int maxn;
}w[4*200005];

int val[200005];

int creat(int a, int b, int r)      //建树
{
    if(a == b)
    {
        w[r].left = w[r].right = a;
        w[r].maxn = val[a];
        return w[r].maxn;
    }
    w[r].left = a;
    w[r].right = b;
    w[r].mid = (a+b)/2;

    w[r].maxn = max(creat(a, w[r].mid, 2*r), creat(w[r].mid+1, b, 2*r+1));
    return w[r].maxn;
}

void update(int n, int m, int r)    //更新
{
    if(w[r].left == n && w[r].right == n)
    {
        w[r].maxn = m;
        return;
    }
    if(n > w[r].mid)
    {
        update(n, m, 2*r+1);
        w[r].maxn = max(w[2*r].maxn, w[2*r+1].maxn);
    }
    else
    {
        update(n, m, 2*r);
        w[r].maxn = max(w[2*r].maxn, w[2*r+1].maxn);
    }
}

int query(int a, int b, int r)      //询问
{
    if(w[r].left == a && w[r].right == b)
    {
        return w[r].maxn;
    }
    else if(a > w[r].mid)
    {
        return query(a, b, 2*r+1);
    }
    else if(b <= w[r].mid)
    {
        return query(a, b, 2*r);
    }
    else
    {
        return max(query(a, w[r].mid, 2*r), query(w[r].mid+1, b, 2*r+1));
    }
}

int main()
{
    char sh;
    int i, t, n, x, y;
    while(scanf("%d %d", &n, &t) != EOF)
    {
        for(i = 1; i <= n; i++)
        {
            scanf("%d", &val[i]);
        }
        creat(1, n, 1);
        while(t--)
        {
            cin>>sh;
            scanf("%d %d", &x, &y);
            if(sh == 'Q')
            {
                printf("%d\n", query(x, y, 1));
            }
            else if(sh == 'U')
            {
                update(x, y, 1);
            }
        }
    }

    return 0;
}
 
 
 
1
8
分享到:
评论
1 楼 sgeteternal 2011-08-07  

相关推荐

    线段树入门学习(兼解HDU1754)

    这篇博客“线段树入门学习(兼解HDU1754)”旨在帮助初学者理解线段树的基本概念,并通过解决HDU1754题目来实践其应用。 线段树的核心思想是将一个区间分解成多个子区间,然后对每个子区间进行预处理,存储区间的信息...

    hdu acm1166线段树

    hdu 1166线段树代码

    ACM hdu 线段树题目+源代码

    今天,我们将通过 ACM hdu 的几个题目来学习和掌握线段树的基本概念和应用。 线段树的基本概念 线段树是一种树形结构,它将一个数组分割成多个小 区间,每个区间对应树上的一个节点。线段树的每个节点都包含了该...

    hdu 1166线段树

    标题与描述均提到了“hdu 1166线段树”,这表明文章的核心是关于线段树在解决特定问题中的应用。线段树是一种数据结构,主要用于处理区间查询和更新操作,尤其是在大规模数据集上。在本例中,通过分析给定的部分代码...

    线段树完整版

    **案例1:Hdu1754 Ihateit** - **功能**: 单点替换与区间最值查询。 - **关键代码解析**: - **PushUp(int rt)**: 更新父节点的最大值。 - **build(int l, int r, int rt)**: 构建线段树,其中 `l` 和 `r` 表示...

    HH神总结的线段树专辑-超经典的

    - 最基础的线段树应用类型,主要涉及叶子节点的更新操作,随后通过 `PushUP` 函数将信息逐级向上更新至根节点。 - 示例题目包括 `hdu1166敌兵布阵` 和 `hdu1754IHateIt`。 - **`hdu1166敌兵布阵`**: - **题意*...

    线段树题目

    基本思路是通过线段树维护每个区间是否被覆盖的状态。对于每个覆盖请求,更新线段树对应区间中的覆盖状态,并统计完全被覆盖的区间数量。这类问题的关键在于如何高效地更新和查询区间。 - **POJ 2528**:这是一道...

    hdu 3333 turing tree 解题报告

    对于每个区间,从`bi+1`开始插入,直到`b(i+1)`,每次插入都会更新线段树中对应区间的`value`。 5. 插入完成后,可以通过查询线段树得到每个区间 `[ai, bi]` 内不同数字的和。 **时间复杂度分析**: - 每个数字...

    HDU 1022 Train Problem I 附详细思路

    HDU 1022 Train Problem I 附详细思路

    【题解】「HDU1166」敌兵布阵(线段树)

    题面 【题目描述】 ...(3)Query(3)Query(3)Query iii jjj ,iii和jjj为正整数,i≤ji\leq ji≤j,表示询问第iii到第jjj个营地的总人数; (4)End(4)End(4)End 表示结束,这条命令在每组数据最后出现;

    线段树入门

    线段树入门资料,有利于初学者学习,让他们详细了解线段树。

    HDU题目java实现

    8. **图论与树**:HDU题目中可能涉及图的遍历(深度优先搜索DFS、广度优先搜索BFS)、树的遍历(前序、中序、后序)以及最小生成树、最短路径等算法。 9. **动态规划**:这是一种优化策略,通过构建状态转移方程来...

    hdu 300+ AC 代码

    2. **线段树**:线段树是一种数据结构,用于高效地处理区间查询和更新操作。它可以实时维护一个区间内的信息,如求和、最大值或最小值。线段树在处理动态区间问题时非常有效,如在数组上进行区间加法、区间求和等...

    hdu.rar_hdu

    3. **数据结构**:数组、链表、栈、队列、树(二叉树、平衡树如AVL和红黑树)、图(邻接矩阵、邻接表、最小生成树、拓扑排序等)。 4. **字符串处理**:KMP算法、Manacher's Algorithm、Rabin-Karp算法等。 5. **...

    【hdu5306】Gorgeous Sequence 线段树区间最值操作-附件资源

    【hdu5306】Gorgeous Sequence 线段树区间最值操作-附件资源

    HDU最全ac代码

    "HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码集合,旨在帮助学习者理解和掌握各种算法,提升编程解决问题的能力。 首先,我们来了解一下ACM/ICPC比赛。这是一项全球性的编程竞赛,参赛...

    hdu动态规划算法集锦

    - 状态转移方程:$f[j] = \max\{f[j], f[j - q[i].money] + q[i].v\}$,其中$q[i].money$是第$i$个地点的价值,$q[i].v$是第$i$个地点的花费。 - 初始条件:$f[0] = 1$(不抢劫任何地方的情况)。 #### 3A:100A:...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    二叉搜索树练习 HDU3791

    总结来说,"二叉搜索树练习 HDU3791"是一道关于二叉搜索树操作的编程题,可能需要实现插入、删除、查找等基本操作,并通过分析`Main.java`源码来理解和解决问题。同时,可能需要借助各种工具进行调试和测试,以确保...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

Global site tag (gtag.js) - Google Analytics