hdu 1754 I Hate It(线段树 之 单点更新 求最值)

I Hate It

                                                                            Time Limit: 9000/3000 MS (Java/Others)    Memory Limit:
32768/32768 K (Java/Others)

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

Hint

Huge input,the C function scanf() will work better than cin

线段树入门题目。

最近做多校联合的比赛,发现每一场比赛都有涉及到线段树的题目,但是我之前没有学过线段树,于是决定学一下。

#include<cstdio>
#include<algorithm>
using namespace std;

#define lson l, mid, root<<1
#define rson mid+1, r, root<<1|1

const int N = 2000000 + 50;
struct node
{
    int l, r, mmax;
}a[4*N];

void build_tree(int l, int r, int root)
{
    a[root].l = l;
    a[root].r = r;
    if(l == r)
    {
        scanf("%d",&a[root].mmax);
        return ;
    }
    int mid = (l + r) >> 1;
    build_tree(lson);
    build_tree(rson);
    a[root].mmax = max(a[root<<1].mmax, a[root<<1|1].mmax);
}

void update(int l, int r, int root, int k)
{
    if(l == a[root].l && r == a[root].r)
    {
        a[root].mmax = k;
        return;
    }
    int mid = (a[root].l + a[root].r) >> 1;
    if(r <= mid)
        update(l, r, root<<1, k);
    else if(l > mid)
        update(l, r, root<<1|1, k);
    else
    {
        update(lson, k);
        update(rson, k);
    }
    a[root].mmax = max(a[root<<1].mmax, a[root<<1|1].mmax); //更新完单个点之后更新整棵树
}

int Query(int l, int r, int root)
{
    if(l == a[root].l && r == a[root].r)
        return a[root].mmax;
    int mid = (a[root].l + a[root].r) >> 1;
    if(r <= mid)
        return Query(l, r, root<<1);
    else if(l > mid)
        return Query(l, r, root<<1|1);
    else
        return max(Query(lson), Query(rson));
}

int main()
{
    int n, m, a, b;
    char ch[5];
    while(~scanf("%d%d",&n,&m))
    {
        build_tree(1, n, 1);
        while(m--)
        {
            getchar();
            scanf("%s%d%d",ch, &a, &b);
            if(ch[0] == 'Q')
                printf("%d\n",Query(a, b, 1));
            else
                update(a, a, 1, b);
        }
    }
    return 0;
}

hdu 1754 I Hate It(线段树 之 单点更新 求最值)

时间: 2024-10-13 22:24:31

hdu 1754 I Hate It(线段树 之 单点更新 求最值)的相关文章

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): 70863    Accepted Submission(s): 27424 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的

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): 39163    Accepted Submission(s): 15507 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师

HDU 1166-敌兵布阵(线段树:单点更新,区间求和)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 44361    Accepted Submission(s): 18875 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场

题意: 输入一行数字,查询第i个数到第j个数之间的最大值.可以修改其中的某个数的值. 输入: 包含多组输入数据. 每组输入首行两个整数n,m.表示共有n个数,m次操作. 接下来一行包含n个整数. 接下来m行,每行包含一个字母s,两个整数a,b. 当s为’Q’,表示查询第a个数到第b个数之间的最大值. 当s为’U’,表示将第a个数更改为b. 输出: 每次查询输出一个结果,每次输出占一行. 题解: 点修改区间求最值,可以用树状数组模板. 具体见代码—— 1 #include <cstdio> 2

hdu 1754 I Hate It(线段树之 单点更新+区间最值)

I Hate It                                                                             Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 非常多学校流行一种比較的习惯.老师们非常喜欢询问.从某某到某某其中,分数最高的是多少. 这让非常多学生非常反感. 无论你

HDU 1394 Minimum Inversion Number (线段树,单点更新)

C - Minimum Inversion Number Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1394 Appoint description: System Crawler (2015-08-17) Description The inversio

HDU 1540 Tunnel Warfare(线段树,单点更新,区间查询)

Problem Description During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Generally speaking, villages connected by tunnels lay in a line. Except the two at the ends, every vill

HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并

Tunnel Warfare                                  Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast

hdu 3308 线段树,单点更新 求最长连续上升序列长度

LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9713    Accepted Submission(s): 4215 Problem Description Given n integers.You have two operations:U A B: replace the Ath number by B. (index