Teleporters( Educational Codeforces Round 126 (Rated for Div. 2) )

news2025/2/1 22:11:02

Teleporters( Educational Codeforces Round 126 (Rated for Div. 2) )

There are n + 1 n+1 n+1 teleporters on a straight line, located in points 0 0 0, a 1 a_1 a1, a 2 a_2 a2, a 3 a_3 a3, …, a n a_n an. It’s possible to teleport from point x x x to point y y y if there are teleporters in both of those points, and it costs ( x − y ) 2 (x-y)^2 (xy)2 energy.

You want to install some additional teleporters so that it is possible to get from the point 0 0 0 to the point a n a_n an (possibly through some other teleporters) spending no more than m m m energy in total. Each teleporter you install must be located in an integer point.

What is the minimum number of teleporters you have to install?

Input

The first line contains one integer n n n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 1 \le n \le 2 \cdot 10^5 1n2105).

The second line contains n n n integers a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,,an ( 1 ≤ a 1 < a 2 < a 3 < ⋯ < a n ≤ 1 0 9 1\le a_1 < a_2 < a_3 < \dots < a_n \le 10^9 1a1<a2<a3<<an109).

The third line contains one integer m m m ( a n ≤ m ≤ 1 0 18 a_n \le m \le 10^{18} anm1018).

Output

Print one integer — the minimum number of teleporters you have to install so that it is possible to get from 0 0 0 to a n a_n an spending at most m m m energy. It can be shown that it’s always possible under the constraints from the input format.

Examples

Input

Copy

2
1 5
7

Output

Copy

2

Input

Copy

2
1 5
6

Output

Copy

3

Input

Copy

1
5
5

Output

Copy

4

Input

Copy

1
1000000000
1000000043

Output

Copy

999999978

好的,下面是问题的中文解答。

问题分析:

我们需要解决一个类似于“给定一个数组,如何通过贪心策略和二分法优化选择分段策略”的问题。通过右到左的贪心策略,能够清晰地确定每个位置的最优决策。我们需要对数组 b 进行操作,逐步减少它的元素,并在此过程中管理一系列的变量来控制进度和代价。我们将使用如下的关键变量:

关键变量:
  • sum:表示当前已有的进度所需从当前元素中扣除的总量。
  • cnt:表示当前活动的进度数量。
  • closed:一个长度为 n 的数组,其中 closed[i] 表示在位置 i+1 结束的进度数量。
  • b:表示每段区间的距离(或能量),我们会根据当前进度动态调整它。
解决思路:
  1. 从右到左的贪心处理:
    我们从右往左处理数组 b,这样可以确保在每个步骤中清楚知道当前进度的影响,避免因未来的选择影响当前决策。每个位置 i 的值 b[i] 需要被当前的进度影响,并决定是否需要添加新的进度。

  2. 更新进度:
    当我们考虑到元素 b[i] 时,首先会根据当前的 sum (减去当前进度的总量)来更新 b[i]。如果 b[i] 大于 0,则我们需要增加新的进度。每个新进度的大小是 el = min(k, i + 1),表示每个进度所能影响的最大范围。

    然后,我们计算需要多少个进度来满足 b[i],公式如下:
    need = ⌈ b [ i ] e l ⌉ \text{need} = \lceil \frac{b[i]}{el} \rceil need=elb[i]
    其中,el 是每个进度能处理的最大距离(即 min(k, i + 1))。

  3. 更新进度状态:

    • 每次我们添加 need 个新的进度,就更新总进度 sum,将 sum 增加 el * need
    • 更新 cnt,增加 need
    • 同时,更新 closed 数组,表示哪些进度会在当前索引之前结束。
  4. 时间复杂度:
    由于我们是从右到左处理数组并且每步仅执行常数时间操作,因此时间复杂度为 O(n),这是非常高效的。

二分法优化:

在这个问题中,我们需要合理地管理每个区间的传送器数量。假设我们可以将每个区间的长度为 len,放置 x 个传送器,计算所需的代价。该代价计算公式为:

f ( l e n , x ) = ( x − ( l e n m o d    ( x + 1 ) ) ) × ( ⌊ l e n + 1 x + 1 ⌋ ) 2 + ( l e n m o d    ( x + 1 ) ) × ( ⌈ l e n + 1 x + 1 ⌉ ) 2 f(len, x) = (x - (len \mod (x + 1))) \times \left(\left\lfloor \frac{len + 1}{x + 1} \right\rfloor \right)^2 + (len \mod (x + 1)) \times \left(\left\lceil \frac{len + 1}{x + 1} \right\rceil \right)^2 f(len,x)=(x(lenmod(x+1)))×(x+1len+1)2+(lenmod(x+1))×(x+1len+1)2

通过这个公式,我们可以看出,随着传送器数量 x 的增加,每段的代价减少的幅度是单调不增的。因此,我们可以使用二分法来优化我们所需要的最小代价。

算法步骤:
  1. 二分法搜索: 我们通过二分法搜索传送器数量 x,以最小化每段的代价,并确保总代价不超过给定的最大值 m

  2. 计算总代价: 在每次二分搜索过程中,我们计算相应的总代价,并更新最优解。

  3. 贪心策略: 一旦确定了每段最优的传送器数量,我们就可以按贪心策略将传送器分配到各个区间,确保总代价最小。

关键的数学公式
  1. 对于一段距离 len,如果我们需要安装 x 个传送门,则每段之间的平均距离为 len / (x + 1),我们可以通过这个公式来计算每段所需的额外能量。

  2. 对于每段距离的能量消耗计算,使用 f(len, x) 来表示在该段上安装 x 个传送门的总代价,可以通过分段函数来计算。

代码分析

#include <map>
#include <set>
#include <fstream>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <bitset>
#include <iomanip>
#define endl '\n'
#define int long long
#define Max(a, b) (((a) > (b)) ? (a) : (b))
#define Min(a, b) (((a) < (b)) ? (a) : (b))
#define BoBoowen ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using namespace std;

const int inf = 1e9 + 7;
const int N = 2e5 + 10;
int n;
int a[N];
int d[N];
int ans, m;
int cnt, cost;

int dodo(int k, int len)
{
    if (k > len)
    {
        return len;
    }
    int num = len / k;
    int res = len % k;
    return num * num * (k - res) + (num + 1) * (num + 1) * res;
}

int check(int x)
{
    cnt = 0, cost = 0;
    for (int i = 1; i <= n; ++i)
    {
        int l = 1, r = d[i];
        int ans = 1;
        while (l <= r)
        {
            int mid = (l + r) / 2;
            if (dodo(mid, d[i]) - dodo(mid + 1, d[i]) >= x)
            {
                ans = mid + 1;
                l = mid + 1;
            }
            else
            {
                r = mid - 1;
            }
        }
        cnt += ans - 1;
        cost += dodo(ans, d[i]);
    }
    return cost <= m;
}

void solved()
{
    cin >> n;

    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
        d[i] = a[i] - a[i - 1];
    }
    cin >> m;

    int l = 0, r = 1e18;
    int save = 0;
    while (l <= r)
    {
        int mid = (l + r) / 2;
        if (check(mid))
        {
            l = mid + 1;
            save = mid;
        }
        else
        {
            r = mid - 1;
        }
    }
    check(save);
    cnt -= (m - cost) / save;
    cout << cnt;
}

signed main()
{
    BoBoowen;

    int T = 1;
    while (T--)
    {
        solved();
    }
}
代码解释
  1. dodo 函数:计算在一个区间内安装一定数量传送门的代价。这个函数帮助我们计算每个区间内根据给定的传送门数量需要的能量。

  2. check 函数:检查在给定的 x 值下,是否能在总消耗能量不超过 m 的情况下,满足从 0a_n 的路径。使用二分查找来优化传送门的安装。

  3. 主函数 solved:初始化数据并调用二分查找来找到最小的 x,并根据该 x 值计算出最小的传送门数量。

时间复杂度
  1. dodo 函数:每次计算需要 O(1) 时间。
  2. check 函数:对每个区间进行二分查找,时间复杂度为 O(n log n)。
  3. 总体时间复杂度:O(n log n),适合题目中最大的输入规模。

总结

这个问题是一个典型的优化问题,可以使用贪心策略和二分查找结合来解决。通过区间分割和计算每段距离所需的传送门数量,最终得到最优解。

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

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

相关文章

python-leetcode-从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right r…

Java实战:图像浏览器

文章目录 1. 实战概述2. 知识准备3. 实现步骤3.1 创建Java项目3.2 创建图像浏览器类3.2.1 声明变量与常量3.2.2 创建构造方法3.2.3 创建初始化界面方法3.2.4 创建处理事件方法3.2.5 创建主方法3.2.6 查看完整代码 3.3 运行程序&#xff0c;查看结果 4. 实战小结5. 扩展练习 1. …

I.MX6ULL 中断介绍上

i.MX6ULL是NXP&#xff08;原Freescale&#xff09;推出的一款基于ARM Cortex-A7内核的微处理器&#xff0c;广泛应用于嵌入式系统。在i.MX6ULL中&#xff0c;中断&#xff08;Interrupt&#xff09;是一种重要的机制&#xff0c;用于处理外部或内部事件&#xff0c;允许微处理…

(即插即用模块-特征处理部分) 十九、(NeurIPS 2023) Prompt Block 提示生成 / 交互模块

文章目录 1、Prompt Block2、代码实现 paper&#xff1a;PromptIR: Prompting for All-in-One Blind Image Restoration Code&#xff1a;https://github.com/va1shn9v/PromptIR 1、Prompt Block 在解决现有图像恢复模型时&#xff0c;现有研究存在一些局限性&#xff1a; 现有…

MySQL数据库(二)- SQL

目录 ​编辑 一 DDL (一 数据库操作 1 查询-数据库&#xff08;所有/当前&#xff09; 2 创建-数据库 3 删除-数据库 4 使用-数据库 (二 表操作 1 创建-表结构 2 查询-所有表结构名称 3 查询-表结构内容 4 查询-建表语句 5 添加-字段名数据类型 6 修改-字段数据类…

数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)

一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 ​​​​​​​ 2.2.3 结果汇总 ​​​​​​​ …

gentoo中利用ollama运行DeepSeek-R1

一、安装ollama gentoo linux中 1.安装步骤&#xff1a; Step1. #cd /usr/local/src Step2. #wget2 -o -V https://ollama.com/install.sh Setp3. #sh ./install.sh 2.ollama完成安装。查看ollama版本&#xff1a; 3.查看ollama服务运行状态&#xff1a; 二、安装&#xf…

【NEXT】网络编程——上传文件(不限于jpg/png/pdf/txt/doc等),或请求参数值是file类型时,调用在线服务接口

最近在使用华为AI平台ModelArts训练自己的图像识别模型&#xff0c;并部署了在线服务接口。供给客户端&#xff08;如&#xff1a;鸿蒙APP/元服务&#xff09;调用。 import核心能力&#xff1a; import { http } from kit.NetworkKit; import { fileIo } from kit.CoreFileK…

MySQL基本架构SQL语句在数据库框架中的执行流程数据库的三范式

MySQL基本架构图&#xff1a; MySQL主要分为Server层和存储引擎层 Server层&#xff1a; 连接器&#xff1a;连接客户端&#xff0c;获取权限&#xff0c;管理连接 查询缓存&#xff08;可选&#xff09;&#xff1a;在执行查询语句之前会先到查询缓存中查看是否执行过这条语…

minimind - 从零开始训练小型语言模型

大语言模型&#xff08;LLM&#xff09;领域&#xff0c;如 GPT、LLaMA、GLM 等&#xff0c;虽然它们效果惊艳&#xff0c; 但动辄10 Bilion庞大的模型参数个人设备显存远不够训练&#xff0c;甚至推理困难。 几乎所有人都不会只满足于用Lora等方案fine-tuing大模型学会一些新的…

小程序的协同工作与发布

1.小程序API的三大分类 2.小程序管理的概念&#xff0c;以及成员管理两个方面 3.开发者权限说明以及如何维护项目成员 4.小程序版本

计算机网络 笔记 网络层 3

IPv6 IPv6 是互联网协议第 6 版&#xff08;Internet Protocol Version 6&#xff09;的缩写&#xff0c;它是下一代互联网协议&#xff0c;旨在解决 IPv4 面临的一些问题&#xff0c;以下是关于 IPv6 的详细介绍&#xff1a; 产生背景&#xff1a; 随着互联网的迅速发展&…

python 语音识别

目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…

事务02之锁机制

锁机制 文章目录 锁机制一&#xff1a;MySQL锁的由来与分类1&#xff1a;锁机制的分类 二&#xff1a;共享锁与排他锁1&#xff1a;共享锁(S锁)2&#xff1a;排他锁(X锁)3&#xff1a;锁的释放 二&#xff1a;表级别锁1&#xff1a;元数据锁(了解)2&#xff1a;意向锁3&#xf…

Python NumPy(10):NumPy 统计函数

1 NumPy 统计函数 NumPy 提供了很多统计函数&#xff0c;用于从数组中查找最小元素&#xff0c;最大元素&#xff0c;百分位标准差和方差等。 1.1 numpy.amin() 和 numpy.amax() numpy.amin() 用于计算数组中的元素沿指定轴的最小值。 numpy.amin(a, axisNone, outNone, keep…

[Spring] Gateway详解

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

TCP三次握手和四次挥手面试题

TCP标志位TCP序列号、确认号三次握手 三次握手过程为什么不是两次握手&#xff1f;为什么不是四次握手&#xff1f; 为什么超时重传&#xff1f;如何处理丢包 为什么需要超时重传?如何处理丢包&#xff1f; 四次挥手 四次挥手过程为什么需要四次挥手为什么四次挥手&#xff0c…

使用openAI与Deepseek的感受

今天简单介绍下使用OpenAI和DeepSeek的感觉&#xff0c;有些地方可能存在不准确的地方&#xff0c;望指正&#xff1a; 从2023年的秋冬到现在2025年的1月间&#xff0c;OpenAI和DeepSeek我都用它们来帮我&#xff0c;当然更多的是OpenAI&#xff0c;但整体感受如下&#xff1a;…

FFmpeg(7.1版本)在Ubuntu18.04上的编译

一、从官网上下载FFmpeg源码 官网地址&#xff1a;Download FFmpeg 点击Download Source Code 下载源码到本地电脑上 二、解压包 tar -xvf ffmpeg-7.1.tar.xz 三、配置configure 1.准备工作 安装编译支持的软件 ① sudo apt-get install nasm //常用的汇编器&#xff0c;…

为AI聊天工具添加一个知识系统 之80 详细设计之21 符号逻辑 之1

本文要点 要点 前面我们讨论了本项目中的正则表达式。现在我们将前面讨论的正则表达式视为狭义的符号文本及其符号规则rule&#xff08;认识的原则--认识上认识对象的约束&#xff09;&#xff0c;进而在更广泛的视角下将其视为符号逻辑及其符号原则principle&#xff08;知识…