当前位置: 首页 > backend >正文

《P2880 [USACO07JAN] 平衡系列 G》

题目描述

对于日常挤奶,Farmer John 的 N 奶牛(1 ≤ N ≤ 50,000 头)始终以相同的顺序排列。有一天,农夫约翰决定与一些奶牛组织一场极限飞盘游戏。为简单起见,他将从挤奶阵容中挑选一系列连续的奶牛来玩游戏。然而,为了让所有的奶牛都玩得开心,它们的身高不应该相差太大。

农民约翰列出了 Q (1 ≤ Q ≤ 180,000) 潜在的奶牛群体及其身高(1 ≤身高≤ 1,000,000)。对于每个组,他希望您帮助确定组中最矮和最高的奶牛之间的身高差异。

每天,农夫 John 的 n(1≤n≤5×104) 头牛总是按同一序列排队。

有一天, John 决定让一些牛们玩一场飞盘比赛。 他准备找一群在队列中位置连续的牛来进行比赛。 但是为了避免水平悬殊,牛的身高不应该相差太大。 John 准备了 q(1≤≤1.8×105) 个可能的牛的选择和所有牛的身高 h​(1≤h​≤106,1≤n)。 他想知道每一组里面最高和最低的牛的身高差。

输入格式

第 1 行:两个以空格分隔的整数 N 和 Q。

第 2..N+1 行:第 i+1 行包含一个整数,该整数是奶牛 i 的高度

第 N+2..N+Q+1 行:两个整数 A 和 B(1 ≤ A ≤ B ≤ N),表示奶牛的范围从 A 到 B(包括 A 到 B)。

第一行两个数 n,q。

接下来 n 行,每行一个数 h​。

再接下来 q 行,每行两个整数 一个 和 b,表示询问第 一个 头牛到第 b 头牛里的最高和最低的牛的身高差。

输出格式

第 1..Q 行:每行包含一个整数,该整数是对回复的响应,并指示范围内最高和最矮的奶牛之间的身高差异。

输出共 q 行,对于每一组询问,输出每一组中最高和最低的牛的身高差。

输入输出样例

输入 #1复制

<span style="color:#404040"><span style="background-color:#fafafa">6 3
1
7
3
4
2
5
1 5
4 6
2 2</span></span>

代码实现:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int MAXN = 50005;
const int INF = 1e9 + 7;

// 定义线段树节点
struct Node {
    int minVal;
    int maxVal;
};

Node tree[4 * MAXN];
int heights[MAXN];

// 构建线段树
void build(int node, int start, int end) {
    if (start == end) {
        tree[node].minVal = heights[start];
        tree[node].maxVal = heights[start];
        return;
    }
    int mid = (start + end) / 2;
    int leftChild = 2 * node;
    int rightChild = 2 * node + 1;
    build(leftChild, start, mid);
    build(rightChild, mid + 1, end);
    tree[node].minVal = min(tree[leftChild].minVal, tree[rightChild].minVal);
    tree[node].maxVal = max(tree[leftChild].maxVal, tree[rightChild].maxVal);
}

// 区间查询
Node query(int node, int start, int end, int l, int r) {
    if (l > end || r < start) {
        return {INF, -INF};
    }
    if (l <= start && r >= end) {
        return tree[node];
    }
    int mid = (start + end) / 2;
    int leftChild = 2 * node;
    int rightChild = 2 * node + 1;
    Node leftResult = query(leftChild, start, mid, l, r);
    Node rightResult = query(rightChild, mid + 1, end, l, r);
    return {min(leftResult.minVal, rightResult.minVal), max(leftResult.maxVal, rightResult.maxVal)};
}

int main() {
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; ++i) {
        cin >> heights[i];
    }
    build(1, 1, n);
    for (int i = 0; i < q; ++i) {
        int a, b;
        cin >> a >> b;
        Node result = query(1, 1, n, a, b);
        cout << result.maxVal - result.minVal << endl;
    }
    return 0;
}    

http://www.xdnf.cn/news/4737.html

相关文章:

  • 【基础复习笔记】计算机视觉
  • 笔记本电脑实现网线内网 + Wi-Fi外网同时使用的配置方案
  • 运维打铁:服务器分类及PHP入门
  • 移植easylogger通过J-Linker的RTT输出日志/Ozone的RTT设置
  • 华为设备MSTP
  • 【IP101】图像压缩技术详解:从JPEG到小波压缩的完整指南
  • 机器人领域和心理学领域 恐怖谷 是什么
  • 如何为APP应用程序选择合适的服务器
  • C++ - 输入输出
  • Matlab 车辆四自由度垂向模型平稳性
  • Jupyter Notebook / Lab 疑难杂症记:从命令找不到到环境冲突与网络阻塞的排查实录
  • 手撕基于AMQP协议的简易消息队列-8(单元测试的编写)
  • linux mutex 互斥锁实现
  • 【网工第6版】第7章 网络操作系统与应用服务器③
  • 芯片测试之Open-Short Test全解析:从原理到实战
  • SpringBoot教程(vuepress版)
  • AWS VPC架构师指南:从零设计企业级云网络隔离方案
  • C语言if语句的用法(非常详细,通俗易懂)
  • CentOS7将yum源更换为阿里源
  • 2025年通信安全员考试题库及答案
  • 【Linux系统】第三节—权限
  • 线索二叉树
  • Arm核的Ubuntu系统上安装Qt
  • 小白借助ai对全栈进行浅浅理解(学习笔记)-Lambda、Optional 避免空指针与新的日期时间 API
  • Linux_进程退出与进程等待
  • 分享 2 款基于 .NET 开源的实时应用监控系统
  • Altera系列FPGA实现图像视频采集转HDMI/LCD输出,提供4套Quartus工程源码和技术支持
  • vue2 结合后端预览pdf 跨域的话就得需要后端来返回 然后前端呈现
  • node.js 实战——在express 中将input file 美化,并完成裁剪、上传进度条
  • 本地可执行命令的智能体部署方案