[HDU][线段树]1754.I Hate It

简介:

这里写图片描述

思路:

利用线段树实现,具体参考:[算法系列之二十三]线段树(Interval Tree)

代码

/*---------------------------------------------
*   日期:2015-03-24
*   作者:SJF0115
*   题目: 1754.I Hate It
*   来源:HDU
*   网址:http://acm.hdu.edu.cn/showproblem.php?pid=1754
*   结果:AC
*   博客:
-----------------------------------------------*/
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

#define Max 200001

struct IntervalTreeNode{
    int left,right,mid;
    int weight;
};

IntervalTreeNode interval[3*Max];

// 把当前结点的信息更新到父结点
void PushUp(int num){
    // 左右子节点的最大值作为父节点的值
    interval[num].weight = max(interval[2*num].weight,interval[2*num+1].weight);
}

// 创建线段树
void Create(int left,int right,int num,int w[]){
    interval[num].left = left;
    interval[num].right = right;
    interval[num].mid = left + (right - left) / 2;
    // 叶子节点
    if(left == right){
        interval[num].weight = w[left-1];
        return;
    }//if
    Create(left,interval[num].mid,2*num,w);
    Create(interval[num].mid+1,right,2*num+1,w);
    // 把当前结点的信息更新到父结点
    PushUp(num);
}
// 表示第pos个学生的成绩改为score
void Update(int pos,int score,int left,int right,int num){
    // 叶子节点
    if(left == right){
        interval[num].weight = score;
        return;
    }//if
    // 左子区间
    int mid = interval[num].mid;
    if(pos <= mid){
        Update(pos,score,left,mid,2*num);
    }//if
    // 右子区间
    else{
        Update(pos,score,mid+1,right,2*num+1);
    }
    // 子节点修改同时修改父节点
    PushUp(num);
}
// 查询区间[start,end]
int Query(int left,int right,int num){
    if(interval[num].left == left && interval[num].right == right){
        return interval[num].weight;
    }//if
    if(right <= interval[num].mid){
        return Query(left,right,2*num);
    }//if
    else if(left > interval[num].mid){
        return Query(left,right,2*num+1);
    }//if
    else{
        return max(Query(left,interval[num].mid,2*num),Query(interval[num].mid+1,right,2*num+1));
    }//else
}


int main(){
    int N,M,a,b;
    char op[2];
    int score[Max];
    while(scanf("%d %d",&N,&M) != EOF){
        // 学生
        for(int i = 0;i < N;++i){
            scanf("%d",&score[i]);
        }//for
        // 创建线段树
        Create(1,N,1,score);
        // 操作
        for(int i = 0;i < M;++i){
            scanf("%s %d %d",op,&a,&b);
            if(op[0] == 'Q'){
                cout<<Query(a,b,1)<<endl;
            }//if
            else if(op[0] == 'U'){
                Update(a,b,1,N,1);
            }//if
        }
    }//while
    return 0;
}
目录
相关文章
|
数据采集 存储 架构师
上进计划 | Python爬虫经典实战项目——电商数据爬取!
在如今这个网购风云从不间歇的时代,购物狂欢持续不断,一年一度的“6.18年中大促”、“11.11购物节”等等成为了网购电商平台的盛宴。在买买买的同时,“如何省钱?”成为了大家最关心的问题。 比价、返利、优惠券都是消费者在网购时的刚需,但在这些“优惠”背后已产生灰色地带。
|
5月前
|
存储 安全 搜索推荐
《分布式软总线牵手云服务,拓展应用新维度》
分布式软总线与云服务的融合正掀起一场技术变革,重塑工作、生活与交互方式。分布式软总线作为设备互联的基石,通过Wi-Fi、蓝牙、NFC等技术实现设备间无缝连接与协作;云服务则提供强大的算力与数据支撑,助力复杂数据分析和业务扩展。二者结合拓展了智能家居、智能办公及工业互联网等应用场景,如远程控制家电、高效会议协作与生产流程优化。然而,安全隐私、网络延迟与标准兼容性等问题仍需克服。未来,这一技术融合将带来更多智能化与便捷化的可能性,深刻改变我们的世界。
133 0
|
5月前
|
机器学习/深度学习 自然语言处理 人机交互
重磅发布|支持东方40语种+中国22方言的新SOTA语音大模型Dolphin开源啦!
在当今数字化时代,语音识别技术已成为人机交互的关键桥梁,广泛应用于智能客服、语音助手、会议转录等众多领域。
379 0
|
7月前
|
运维 分布式计算 Kubernetes
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。
|
10月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
337 8
|
存储 DataWorks Java
DataWorks操作报错合集之出现HTTP 401错误,表示什么意思
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
SQL 数据处理 数据库
|
存储 算法 安全
探索Linux的md5sum命令:保障数据完整性的利器
`md5sum`是Linux下的命令行工具,用于计算文件的MD5哈希,确保数据完整性。通过比较哈希值,它可以检测文件是否在传输或存储中被更改。常用参数包括`-b`(二进制模式)、`-c`(校验文件)、`--tag`(创建校验和文件)和`--status`(仅返回校验状态)。尽管MD5因安全性问题不建议用于加密,但仍然用于快速校验。例如,`md5sum filename.txt`计算文件哈希,`md5sum -c checksums.txt`校验文件完整性。注意,应结合安全存储和备份策略使用。
|
机器学习/深度学习 SQL 人工智能
2024年5月90篇代码大模型论文最全整理
聚焦大模型前沿技术,解析学界业界最新进展
238 0
2024年5月90篇代码大模型论文最全整理
|
API 调度 Android开发
探索Android应用程序的后台运行机制
在移动应用开发中,了解和掌握Android应用程序的后台运行机制至关重要。本文将深入探讨Android平台上应用程序的后台运行原理及其影响因素,包括后台服务、广播接收器、JobScheduler等关键组件,以及如何有效管理后台任务以提升应用性能和用户体验。
1255 3

热门文章

最新文章