E. Explosions?(思维+单调队列

news2024/11/16 21:39:30

 Problem - E - Codeforces

题意:有 n 个怪,生命值为h_i,你有两种操作,一种花费 1 MP减少一个怪的一格血量,可以操作任意次;另一次是花费 x MP,制造一个爆炸,可以不断消灭两侧连续严格递减的数,但只能执行一次(而且是最后一次);问让消灭所有怪的最小MP花费是多少?

分析:略加思考会想到实际上就是找一个最大的金字塔,两侧都是平原,但实际上并不完全是,因为两侧斜率可以不一样;然后就蒙圈了,显然肯定是要一维枚举塔尖位置,另一维能明显感觉到需要用数据结构维护,为啥呢。显然如果暴力的话就是对每个位置往两边延续,但实际上前面的状态肯定是可以被后面的状态使用的;当时到这里就卡住了;

有三个点:

1. 实际上这种塔尖结构,可以分为两个方向来维护,一个增一个减;

2.发现直接维护不好维护,相对于维护严格递减,不如维护不增【这里就有个小技巧维护】

3.该用什么结构,能维护一个连续区间的最值

这是我之前对维护单调性数据结构的理解还不够深刻,这里再重新理解一下

单调栈由于栈的特性可以维护不连续的单调性,主要 是找到某个位置的左右最值

而单调队列由于是队列先进先出 所以可以维护连续的单调性 至于为啥滑动窗口 单纯有个长度限定而已

得明白两个事:预处理每个数减去坐标之后,只要不减就一定是能满足的,所以对队尾如果比当前的大,那么要减去长度*差值——使满足不减的性质【把山峰不断削平的一个过程】;然后还得处理队头,这里我有个一直想不明白的点:为啥只要处理队头就行了 —— 是因为如果有上一步的合并操作,有可能会使得长度超过他本身的最大长度(本身就是q[hh].val + q[hh].ed),所以要判断if (q[hh].val + q[hh].ed - q[hh].len + 1 <= 0)的条件。(因为如果最新的元素没合并到队头的话,这种肯定不会成立,你想想为什么(因为我们已经预处理过了,只要预处理后严格比你大,那长度就一定合法))

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void slv() {
    int n; cin >> n;
    vector<int> a(n + 1);
    vector<ll> L(n + 1), R(n + 1);
    for(int i = 1 ; i <= n ; i++ ) {
        cin >> a[i];
    }
    struct node{
        int len,val,ed;
    };
    auto cal=[&](vector<ll>& ans){
        vector<ll> pr(n + 2), pr2(n + 2);
        for(int i = 1 ; i <= n ; i++ ) {
            pr[i] = pr[i - 1] + a[i];
        }
        vector<int> a2(n + 1);
        for(int i = 1 ; i <= n ; i++ ) {
            a2[i] = a[i] - i;
            pr2[i] = pr2[i - 1] + a2[i];
        }
        vector<node> q(n + 2);
        int hh = 0, tt = -1;
        ll sm = 0;
        for(int i = 1; i <= n ; i++ ) {
            node cur={1, a2[i], i};
            sm += a2[i];
            while(hh <= tt && q[tt].val >= a2[i]) {
                sm -= 1ll * (q[tt].val - a2[i]) * q[tt].len; //累递过来都是被削平了
                cur.len += q[tt--].len;
            }
            q[++tt] = cur;
            if(hh <= tt && q[hh].val + q[hh].ed - q[hh].len < 0) {
                int len = q[hh].val + q[hh].ed;
                sm -= 1ll * (q[hh].len - len) * q[hh].val;
                q[hh].len = len;
            }//sm其实就是不断削削剩下的部分
            int pre = q[hh].ed - q[hh].len;
            ans[i] += pr[pre] + pr2[i - 1] - pr2[pre] - (sm - a2[i]);
        }
    };

    cal(L);
    auto debug=[&](vector<ll> ve){
        for(int i = 1 ; i <= n ; i++ ) {
            cout << ve[i] << ' ';
        }
        cout << '\n';
    };
//    debug(L);
    reverse(a.begin() + 1, a.end());
    cal(R);
    ll ans = 1e18;
    reverse(a.begin() + 1, a.end());
    for(int i = 1 ; i <= n ; i++ ) {
        ans = min(ans, L[i] + R[n - i + 1] + a[i]);
    }
    cout << ans << '\n';
}
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    int t; cin >> t;
    while(t--) {
        slv();
    }
}

 参考了知乎cup大佬的代码,自己太菜了搞了半天才搞懂Educational Codeforces Round 143 (Rated for Div. 2) A - F - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】 详谈指针

☃️内容专栏&#xff1a;【C语言】初阶部分 ☃️本文概括&#xff1a;继初识C语言&#xff0c;对C语言指针初阶部分进行归纳与总结。 ☃️本文作者&#xff1a;花香碟自来_ ☃️发布时间&#xff1a;2023.2.17 目录 一、指针和指针类型 1.1 指针 1.2 指针类型 其一&#x…

运动耳机选择什么模式?运动耳机的正确选择

动是生命的源泉&#xff0c;有许多朋友都会在运动的时候戴上一个运动耳机。因为运动时听音乐会给我们带来充足的动力&#xff0c;但是选择一款合适自己的运动耳机也是一门学问&#xff0c;今天我就来给大家推荐几款还不错的运动耳机。 1、NANK南卡RunnerPro4骨传导运动耳机 骨…

下载网上压缩包(包含多行json)并将其转换为字典的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

分布式 CAP BASE理论

文章目录CAP简介不是所谓的“3 选 2”CAP 实际应用案例BASE简介BASE 理论的核心思想总结CAP 简介 在理论计算机科学中&#xff0c;CAP 定理&#xff08;CAP theorem&#xff09;指出对于一个分布式系统来说&#xff0c;当设计读写操作时&#xff0c;只能同时满足以下三点中的…

cesium学习记录01

1&#xff0c;将右弦GISer的cesium实战系列的大部分功能&#xff08;25-110&#xff09; 都又跟着走了一遍&#xff08;大部分是CTRL CCRTL V&#xff09; 2&#xff0c;代码SVN地址&#xff08;用户名:liu 密码&#xff1a;123&#xff09; 主要文件是test/src/views/MapFu…

Prometheus离线tar包安装

Prometheus离线tar包安装实验环境一、部署前操作二、Master2.1下载2.2解压2.3更改服务目录名称2.4创建系统服务启动文件2.5配置修改2.6启动并设置开机自启2.7访问2.8添加node节点2.8.1 添加方法2.8.2修改Prometheus配置&#xff08;Master&#xff09;————————————…

docker:实例演示妙用export让容器和数据分离

简介&#xff1a;docker-export用于将容器打包成基础镜像&#xff0c;主要作用就是制作基础镜像&#xff0c;特别是在容器非常大的情况下&#xff0c;拉取了一个空白系统镜像&#xff0c;创建容器后安装了一堆自己需要的环境&#xff0c;就可以使用 export 命令打包成自己的基础…

2005-2022中国企业对外直接投资、OFDI海外投资明细、中国全球投资追踪数据CGIT(含非建筑施工类问题投资)

中国全球投资跟踪”&#xff08;China Global Investment Tracker&#xff09;&#xff0c;数据库&#xff0c;美国企业研究所于1月28日发布。数据库显示&#xff0c;2005年以来&#xff0c;中国对外投资和建设总额已接近2万亿美元。该数据库是唯一一套涵盖中国全球投资和建设的…

概率和似然

在日常生活中&#xff0c;我们经常使用这些术语。但是在统计学和机器学习上下文中使用时&#xff0c;有一个本质的区别。本文将用理论和例子来解释概率和似然之间的关键区别。 概率与似然 假设在一场棒球比赛中&#xff0c;两队的队长都被召集到场上掷硬币。获胜的队长将根据掷…

Linux 监测服务心跳、服务重启策略

文章目录前言背景一、curl服务可用验证二、服务探测脚本三、配置系统定时任务四、Linux特殊字符转义总结前言 请各大网友尊重本人原创知识分享&#xff0c;谨记本人博客&#xff1a;南国以南i、 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 背景 当…

【飞桨AI-Python小白逆袭大神课程】作业1-python基础练习

链接&#xff1a;飞桨AI Studio - 人工智能学习与实训社区 作业一&#xff1a;输出 9*9 乘法口诀表(注意格式) 注意&#xff1a;提交作业时要有代码执行输出结果。 def table():#在这里写下您的乘法口诀表代码吧&#xff01;if __name__ __main__:table() 思路&#xff1a…

基础篇—CSS padding(填充\内边距)解析

CSS padding(填充) CSS padding(填充)是一个简写属性,定义元素边框与元素内容之间的空间,即上下左右的内边距。 属性说明padding使用简写属性设置在一个声明中的所有填充属性padding-bottom设置元素的底部填充padding-left设置元素的左部填充padding-right设置元素的右部…

win11下WSL环境安装

微软官方wsl手册 微软官方wsl手册pdf 一、wsl中镜像安装 在启用或关闭Windows功能勾选一下两个选项 打开powershell&#xff0c;输入wsl, 可以根据wsl的命令来安装镜像。也可以在软件商店中进行安装ubuntu 安装完成后&#xff0c;打开ubuntu,会自动完成初始化。提示安装成功…

【RabbitMQ六】——RabbitMQ主题模式(Topic)

RabbitMQ主题模式&#xff08;通配符模式&#xff09;前言什么是Topic模式使用Topic模式的要点通配符规则示例代码示例Pom文件引入RabbtiMQ依赖RabbitMQ工具类生产者消费者1消费者2效果总结前言 通过本篇博客能够简单使用RabbitMQ的主题模式。 本篇博客主要是博主通过官网总结…

K8s集群部署(kubeadm安装部署详细手册)

1、简介 K8s部署主要有两种方式&#xff1a;1、Kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 2、二进制 从github下载发行版的二进制包&#xff0c;手动部署每个组件&#xff0c;组成Kubernetes集群。…

【C++进阶】二、多态详解(总)

目录 一、多态的概念 二、多态的定义及实现 2.1 多态的构成条件 2.2 虚函数 2.3 虚函数的重写 2.4 虚函数重写的两个例外 2.4.1 协变 2.4.2 析构函数的重写 2.5 C11 override 和 final 2.5.1 final 2.5.2 override 2.6 重载、覆盖(重写)、隐藏(重定义)的对比 三、…

【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化

前言 本章就是我们C中类与对象的终章了&#xff0c;不过本章的难度不大&#xff0c;都是类中一些边边角角的知识&#xff0c;记忆理解就行了&#xff0c;相信经过这么长时间的学习类与对象&#xff0c;你对面向对象也有了更加深的理解&#xff0c;最后我们学习完边边角角的一些…

2022黑马Redis跟学笔记.实战篇(五)

2022黑马Redis跟学笔记.实战篇 五4.5 Redis实现秒杀优化4.5.1 基于Redis实现秒杀减库存6.1 秒杀优化-异步秒杀思路4.5.2 基于Redis的一人一单限制4.5.3 基于阻塞队列的异步下单4.6 秒杀的异步优化4.6.1.基于消息队列的异步下单思路4.6.2.基于List结构的消息队列4.6.3.基于PubSu…

[答疑]经营困难时期谈建模和伪创新-长点心和长点良心

leonll 2022-11-26 9:53 我们今年真是太难了……&#xff08;此处删除若干字&#xff09;……去年底就想着邀请您来给我们讲课&#xff0c;现在也没有实行。我想再和我们老大提&#xff0c;您觉得怎么说个关键理由&#xff0c;这样的形势合适引进UML开发流程&#xff1f; UML…

ESXi Args勒索病毒来袭,VMware ESXi用户需提高警惕

近日&#xff0c;多国通报了一项名为“ESXi Args”的勒索软件活动。ESXi Args主要针对VMware ESXi服务器进行攻击&#xff0c;利用ESXi 服务器中的已知漏洞&#xff0c;获取访问权限并部署勒索软件&#xff0c;对ESXi服务器内配置文件进行加密并发送赎金票据。 当前&#xff0…