HDU_1754 I Hate It 【线段树】

该博客主要介绍了如何利用线段树解决一个包含N个学生和M个操作的题目。操作包括查询区间内最大值和单点更新。由于数据范围较大,直接暴力求解会导致超时,因此采用了线段树作为解决方案,它是线段树的基本应用,适合初学者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题目描述

N个学生,M个操作,操作分两种,Q:询问A到B中值最大的是多少;S:将A更改为B。

解题思路

数据范围过大,暴力肯定撞墙,线段树问题,单点更新求区间最大值,线段树的入门模板题。

代码部分


#include <iostream>
#include <stdio.h>
#include <algorithm>
#define lc left, mid, root << 1
#define rc mid + 1, right, root << 1 | 1
using namespace std;

const int maxn = 2e5 + 10;
int ma[maxn << 2];

void push_up(int root)
{
    ma[root] = max(ma[root << 1], ma[root << 1 | 1]);
}

void build(int left, int right, int root)
{
    if(left == right)
    {
        scanf("%d", &ma[root]);
        return;
    }
    int mid = (left + right) >> 1;
    build(lc);
    build(rc);
    push_up(root);
}
void update(int left, int right, int root, int a, int b)
{
    if(left == right)
    {
        ma[root] = b;
        return;
    }
    int mid = (left + right) >> 1;
    if(a <= mid) update(lc, a, b);
    else update(rc, a, b);
    push_up(root);
}
int query(int left, int right, int root, int a, int b)
{
    if(a <= left && right <= b)
    {
        return ma[root];
    }
    int mid = (left + right) >> 1;
    int ans = 0;
    if(a <= mid) ans = max(ans, query(lc, a, b));
    if(b > mid) ans = max(ans, query(rc, a, b));
    return ans;
}
int main()
{
    int n, m, a, b;
    char c;
    while(~scanf("%d%d", &n, &m))
    {
        build(1, n, 1);
        while(m --)
        {
            scanf(" %c %d%d", &c, &a, &b);
            if(c == 'Q')
            {
                int ans = query(1, n, 1, a, b);
                printf("%d\n", ans);
            }
            else
            {
                update(1, n, 1, a, b);
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值