#P15610. [2026年保加利亚国家队组队赛Senior]Treat美味点心
[2026年保加利亚国家队组队赛Senior]Treat美味点心
题目描述
在昆虫王国中,每天早晨,居民们都会和公主 Bubi 一起经过一张自助餐桌。桌上按一行摆放着 种点心,编号为 到 。
普通昆虫有一种奇怪的进食习惯,称为“螃蟹式吃法”:它们会先选择某一种点心 ,然后依次吃掉编号为
的点心各一个。
公主 Bubi 有一个优势:她可以控制自己什么时候停止进食;如果她不饿,甚至可以完全不吃。也就是说,如果她选择从点心 开始,那么她会依次吃点心
直到她决定以某个点心 结束,其中 。因此她实际吃掉的是编号为
的连续一段点心。
每天早晨开始时,每只昆虫都有一个用实数表示的能量值。若某只昆虫吃掉一种编号为 的点心,那么它的能量会先乘以某个系数 ,再加上某个系数 。也就是说,若吃之前能量为 ,则吃之后能量变为
每种点心的 未知,并且只与点心种类有关。
虽然 Bubi 不知道每一种点心的具体系数,但经过长期观察,她知道了所有完整“螃蟹式吃法”的效果。具体来说,她知道两组实数
和
它们的含义如下:如果某只昆虫以初始能量 开始,从点心 开始按照螃蟹式吃法一直吃到点心 ,那么最终能量为
现在,对于给定的初始能量 ,Bubi 希望最大化自己早餐结束时的能量。她可以选择任意一段连续的下降编号点心来吃,即选择 满足
吃掉点心
也可以选择什么都不吃。
接下来有 天。对于每一天,给出 Bubi 的初始能量 ,你需要求出她早餐结束后能够获得的最大能量。
你的答案允许有误差。若真实答案为 ,你的输出为 ,则需要满足
输入中的 都是“小数位数有限”的数,最多有 位小数。
实现细节
你需要实现两个函数。
首先实现:
void init(
int n,
int q,
const std::vector<double>& a,
const std::vector<double>& b
);
该函数会在程序开始时被调用一次。参数含义如下:
- :点心种类数 ;
- :询问天数 ;
- :题目中描述的 数组。
然后实现:
double query(double x);
该函数会被调用恰好 次。参数 表示对应一天 Bubi 的初始能量。函数应返回她能够获得的最大最终能量。
你的程序需要包含头文件:
#include "treat.h"
你的代码不应包含 main 函数,也不应从标准输入读取或向标准输出写入。
本地评测器
官方提供了本地评测器 Lgrader.cpp 和头文件 treat.h。本地评测器的输入格式如下。
第一行包含两个整数 。
接下来 行,每行包含两个实数 。
接下来 行,每行包含一个实数 ,表示一次询问的初始能量。
本地评测器会先调用 init,然后依次调用 query,最后按询问顺序输出所有结果。
约束
所有输入实数最多有 位小数。
子任务
| 子任务 | 分值 | 其他限制 | ||
|---|---|---|---|---|
| 1 | 5 | 无 | ||
| 2 | ||||
| 3 | 10 | |||
| 4 | 15 | |||
| 5 | 10 | 独立均匀随机生成 | ||
| 6 | 55 | 无 | ||
只有通过某个子任务的所有测试,才能获得该子任务的分数。
样例
输入
4 4
1 1
2 1
-4 7
-16 27
-1
1
2
4
输出
43
11
5
11
样例解释
点心 会把能量乘以 后加 ;点心 会把能量乘以 后加 ;点心 会把能量乘以 后加 ;点心 会把能量乘以 后减 。
对于四个初始能量,最优选择分别为:
- 当 时,吃点心 ,最终能量为 ;
- 当 时,吃点心 ,最终能量为 ;
- 当 时,吃点心 ,最终能量为 ;
- 当 时,只吃点心 ,最终能量为 。
下发文件
题目会提供头文件 treat.h 和本地评测器 Lgrader.cpp。
@下发文件