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

【选段排序——堆】

题目

分析

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5+10;

int w[N];
priority_queue<int, vector<int>, greater<int>> hp1; //最小堆
priority_queue<int, vector<int>> hp2; //最大堆

int main()
{
  int n, p, q;
  cin >> n >> p >> q;
  for(int i = 1; i <= n; i++) 
    cin >> w[i];
  
  for(int i = p; i <= q; i++)
    hp1.push(w[i]), hp2.push(w[i]);
  int ans = hp2.top() - hp1.top();

  for(int i = p-1; i; i--)
  {
    hp2.push(w[i]); //维护最大值
    if(!(w[i] <= hp1.top())) //若不是更小值,发生抢夺
    {
      hp1.pop(); //最小值被抢
      hp1.push(w[i]); //给了个较大值
    }
    ans = max(ans, hp2.top() - hp1.top());
  }

  while(hp1.size()) hp1.pop(); //清空堆
  while(hp2.size()) hp2.pop();
  for(int i = p; i <= n; i++)
  {
    hp1.push(w[i]); //维护最小值
    if(i <= q) hp2.push(w[i]); //堆未存完[p,q]区间值
    else if(!(w[i] >= hp2.top())) //若不是更大值,发生抢夺
    {
      hp2.pop(); //最大值被抢
      hp2.push(w[i]); //给了个较小值
    }
    ans = max(ans, hp2.top() - hp1.top());
  }

  cout << ans;
}


http://www.kler.cn/a/565840.html

相关文章:

  • 【0011】HTML其他文本格式化标签详解(em标签、strong标签、b标签、i标签、sup标签、sub标签......)
  • 大模型与交互式数据库查询
  • sql深入学习
  • xr-frame 3D Marker识别,扬州古牌坊 3D识别技术稳定调研
  • 解释 Node.js 的事件循环机制,理解微任务(microtask)与宏任务(macrotask)的区别?
  • 我的世界1.20.1forge模组开发进阶物品(7)——具有动画、3D立体效果的物品
  • AH表情捕捉设备:虚拟人动态表情捕捉
  • ubuntu部署gitlab-ce及数据迁移
  • 动态组件
  • unity pico开发 三 移动 旋转 传送
  • 二十三种设计模式
  • 「架构选型」5 种 API 网关技术选型
  • 【PCIe 总线及设备入门学习专栏 1.2 -- 访问 PCIe 设备过程】
  • Docker基础-本地目录挂载
  • Holtek HT66F0184深度解析:集成LCD驱动的高效MCU解决方案
  • 【Qt】MVC设计模式
  • 【Go】十六、protobuf构建基础服务信息、grpc服务启动的基础信息
  • Flutter系列教程之(4)——自定义Widget控件及相关知识
  • LeetCode 2656 K个元素的最大和
  • 力扣——不同路径