[NOI2010]超级钢琴【RMQ+贪心+堆】

2023-11-01

题目链接


  超级棒的一道题,解这道题,需要分一下几步来看。

  1. 取的是连续段
  2. 我们可以对每个可能起点去知道它的最大可能解(起点begin,最大可行解一定是begin + L - 1 ~ begin + R - 1中的一个)
  3. 如果每次都是取最大的话,那么下一个同起点的一定是不大于它的,贪心思想

既然提出了问题,我们逐步解决:

对于提出的问题一,可以使用前缀和来减少每次查询带来的不方便;

对于问题二,因为确定了起点begin,找到在可行解区间内的最大解,一定是可以用数据结构求区间最大值来做到的,这里要求的是最大值对应的点。于是就可以确定每个起点的最大解了。这里用的是RMQ,因为没有修改操作。

对于问题三,我们可以把问题二处理出来的东西,放进堆(优先队列),每次弹出最大的,然后在把点的可行区间变成begin + L - 1 ~ pos - 1pos + 1 ~ begin + R - 1这两个区间,然后以此类推。那么,堆内的元素最多N+2K个,所以内存也是够的,每次用一次RMQ,查询复杂度O(1)。

总结:思维好题。RMQ千万别写错了hh

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define eps 1e-8
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 5e5 + 5;
int N, K, L, R, a[maxN], sum[maxN] = {0}, LOG_2[maxN], mp[maxN][21];
inline void RMQ_Init()
{
    for(int i=1; i<=N; i++) mp[i][0] = i;
    for(int j=1; (1 << j) <= N; j++)
    {
        for(int i=1; i + (1 << (j - 1)) <= N; i++)
        {
            if(sum[mp[i][j - 1]] >= sum[mp[i + (1 << (j - 1))][j - 1]]) mp[i][j] = mp[i][j - 1];
            else mp[i][j] = mp[i + (1 << (j - 1))][j - 1];
        }
    }
}
inline int query(int ql, int qr)
{
    int det = LOG_2[qr - ql + 1];
    return sum[mp[ql][det]] >= sum[mp[qr - (1 << det) + 1][det]] ? mp[ql][det] : mp[qr - (1 << det) + 1][det];
}
struct node
{
    int beg, ql, qr, pos, val;
    node(int a=0, int b=0, int c=0, int d=0, int f=0):beg(a), ql(b), qr(c), pos(d), val(f) {}
    friend bool operator < (node e1, node e2) { return e1.val < e2.val; }
} now;
priority_queue<node> Q;
inline void init()
{
    for(int i = 1, j = 2, k = 0; i <= N; i++)
    {
        if(i == j) { j <<= 1; k++; }
        LOG_2[i] = k;
    }
}
int main()
{
    scanf("%d%d%d%d", &N, &K, &L, &R);
    init();
    sum[0] = 0;
    for(int i=1; i<=N; i++) { scanf("%d", &a[i]); sum[i] = sum[i - 1] + a[i]; }
    RMQ_Init();
    int ql, qr, pos, nex_pos;
    for(int i=1; i + L - 1 <= N; i++)
    {
        ql = i + L - 1; qr = min(i + R - 1, N);
        pos = query(ql, qr);
        Q.push(node(i, ql, qr, pos, sum[pos] - sum[i - 1]));
    }
    ll ans = 0;
    while(K--)
    {
        now = Q.top(); Q.pop();
        ans += now.val;
        ql = now.ql; qr = now.qr; pos = now.pos;
        if(pos - 1 >= ql)
        {
            nex_pos = query(ql, pos - 1);
            Q.push(node(now.beg, ql, pos - 1, nex_pos, sum[nex_pos] - sum[now.beg - 1]));
        }
        if(pos + 1 <= qr)
        {
            nex_pos = query(pos + 1, qr);
            Q.push(node(now.beg, pos + 1, qr, nex_pos, sum[nex_pos] - sum[now.beg - 1]));
        }
    }
    printf("%lld\n", ans);
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[NOI2010]超级钢琴【RMQ+贪心+堆】 的相关文章

随机推荐

  • 计算机网络基础知识总结

    计算机网络学习的核心内容就是网络协议的学习 网络协议是为计算机网络中进行数据交换而建立的规则 标准或者说是约定的集合 因为不同用户的数据终端可能采取的字符集是不同的 两者需要进行通信 必须要在一定的标准上进行 一个很形象地比喻就是我们的语言
  • Arduino学习模拟输出

    1 实现效果 通过两个按键可以控制led变亮或者变暗 boolean pushButton1 定义布尔型变量存储按键1的状态 boolean pushButton2 定义布尔型变量存储按键2的状态 int ledPin 9 LED引脚号 i
  • Python3 面向对象

    Python从设计之初就已经是一门面向对象的语言 正因为如此 在Python中创建一个类和对象是很容易的 本章节我们将详细介绍Python的面向对象编程 如果你以前没有接触过面向对象的编程语言 那你可能需要先了解一些面向对象语言的一些基本特
  • 数据库备份和恢复

    这里介绍两种方法 1 mysqldump mysqldump不需要登录到数据库中就可以备份和恢复库和表 1 备份 mysqldump uroot p 123123 mytest gt mnt mytest bak date F sql 注意
  • Django学习 day4

    今天学习了简单的用户登录界面 也是对template的简单初探 Django有个叫模板 Template 的东东 可以直接把你的Html代码写在模板里 返回给浏览器 模板初探 使用模板的两个步骤 配置存html文件的模板目录 在你的view
  • html5期末大作业课程设计仿苹果官网(源码+报告)

    页面展示 下面有下载地址 免费哦 链接 https pan baidu com s 1 5ZDXVZmM64ALY2i31Hwfg 提取码 vtrk 一 需求分析 设计目的 一 可行性分析 时代背景 根据中国互联网络信息中心 CNNIC 在
  • 【教程】电信光猫烽火HG5140A怎么改桥接模式,telecomadmin超级密码

    一 背景 坐标杭州 宽带移机 师傅给我换了个战未来的 支持万兆的光猫 以前我是依据型号网上搜索搞到超级管理员用户就行桥接的 给我换了这个新光猫后 自己死活折腾不出来 二 正文 以前大家都习惯用超级管理员进入光猫 改桥接模式 利用光猫的安全漏
  • libevent中event_base_loopbreak与BEV_OPT_DEFER_CALLBACKS

    最近用C 和libevent改写了一个多线程网络服务器应用 大体框架是前端一个tcp连接监听线程 接收到连接后将socket随机交给一个后台工作线程做进一步处理 所有的线程均使用event base loop事件循环 其中有这样一个需求 我
  • Flink实战: 窗口TopN分析与实现1

    Flink实时计算topN热榜 主要思路可以这样做 可以继续优化的地方有 1 最后的processFunction中注册定时器在processElement方法中就要将ListState存储换掉 换成ValueState 不过是List类型
  • 最小二乘法曲线拟合

    最小二乘法曲线拟合以及Matlab实现 在实际工程中 我们常会遇到这种问题 已知一组点的横纵坐标 需要绘制出一条尽可能逼近这些点的曲线 或直线 以进行进一步进行加工或者分析两个变量之间的相互关系 而获取这个曲线方程的过程就是曲线拟合 目录
  • rtplib在linux上的编译安装

    JRTPlib简介 在http www tekuba net program 10 中提到过RTP的例程 这里参考网络上的资料给出JRtpLIB的嵌入式arm环境以及桌面环境开发环境的建立 RTP 是目前解决流媒体实时传输问题的最好办法 要
  • sql注入手法详解

    sql定义 sql 结构化查询语句 sql注入 首先我们通过前端将我们的payload 恶意代码 传送到后台服务器 传送到后台以后 我们提交的payload拼接到sql语句中 作为sql语句的一部分被执行 从而导致数据库又被脱库甚至删库的风
  • std:weak_ptr 用法小结。

    http blog csdn net coolmeme article details 43266319 参考了这篇博客 感谢博主的贡献 感谢博主的翻译 不过他写的太多了 我只是记录一下使用方法 原理就不深究了 需要了解其原理的可以自行去那
  • Unity性能优化一些学习总结

    关于Unity性能优化的自我总结 1 硬件支持优化 1 平台设置优化 减少FPS 在ProjectSetting gt Quality中的 VSync Count 参数会影响你的FPS EveryVBlank相当于FPS 60 EveryS
  • 【Go语言学习之路 2】Go目录结构划分

    目录结构划分 三个环境变量的配置 GOROOT Go 安装后的根目录 例如 D Program Files Go 安装过程中会由安装程序自动写入系统环境变量中 go语言自带的类库 GOBIN Go 的二进制文件存放目录 GOPATH bin
  • JDBC中级实现--数据库连接四要素的抽取与动态获取

    1 数据库连接四要素不应该写死在代码中 扩展性不高 应该抽取到配置文件中动态读取 扩展文件名 properties DRIVER CLASS NAME com mysql jdbc Driver URL jdbc mysql mysql j
  • 爬虫课程笔记(七)scrapy入门与深入

    爬虫课程笔记 Scrapy 异步与非阻塞区别 爬虫流程 入门 创建一个scrapy项目 生成一个爬虫 提取数据 保存数据 logging 实现翻页请求 深入scrapy 定义item 程序的debug信息 scrapy shell sett
  • Python学习笔记(小甲鱼版)

    目录 文章目录 一 python是什么 1 Python 特点 2 idea是什么 3 print 的作用是什么 4 基础语法 一 python是什么 Python 是一个高层次的结合了解释性 编译性 互动性和面向对象的脚本语言 Pytho
  • Hive小文件问题:如何产生、造成影响、解决办法

    一 小文件是如何产生的 1 动态分区插入数据 产生大量的小文件 从而导致map数量剧增 2 reduce数量越多 小文件也越多 reduce的个数和输出文件是对应的 3 数据源本身就包含大量的小文件 二 小文件问题的影响 1 从Hive的角
  • [NOI2010]超级钢琴【RMQ+贪心+堆】

    题目链接 超级棒的一道题 解这道题 需要分一下几步来看 取的是连续段 我们可以对每个可能起点去知道它的最大可能解 起点begin 最大可行解一定是begin L 1 begin R 1中的一个 如果每次都是取最大的话 那么下一个同起点的一定