#P15610. [2026年保加利亚国家队组队赛Senior]Treat美味点心

[2026年保加利亚国家队组队赛Senior]Treat美味点心

题目描述

在昆虫王国中,每天早晨,居民们都会和公主 Bubi 一起经过一张自助餐桌。桌上按一行摆放着 NN 种点心,编号为 00N1N-1

普通昆虫有一种奇怪的进食习惯,称为“螃蟹式吃法”:它们会先选择某一种点心 ii,然后依次吃掉编号为

i, i1, , 0i,\ i-1,\ \ldots,\ 0

的点心各一个。

公主 Bubi 有一个优势:她可以控制自己什么时候停止进食;如果她不饿,甚至可以完全不吃。也就是说,如果她选择从点心 ii 开始,那么她会依次吃点心

i, i1, i2, i,\ i-1,\ i-2,\ \ldots

直到她决定以某个点心 jj 结束,其中 jij\le i。因此她实际吃掉的是编号为

i, i1, , ji,\ i-1,\ \ldots,\ j

的连续一段点心。

每天早晨开始时,每只昆虫都有一个用实数表示的能量值。若某只昆虫吃掉一种编号为 ii 的点心,那么它的能量会先乘以某个系数 cic_i,再加上某个系数 did_i。也就是说,若吃之前能量为 xx,则吃之后能量变为

cix+di.c_i x+d_i.

每种点心的 ci,dic_i,d_i 未知,并且只与点心种类有关。

虽然 Bubi 不知道每一种点心的具体系数,但经过长期观察,她知道了所有完整“螃蟹式吃法”的效果。具体来说,她知道两组实数

a0,a1,,aN1a_0,a_1,\ldots,a_{N-1}

b0,b1,,bN1,b_0,b_1,\ldots,b_{N-1},

它们的含义如下:如果某只昆虫以初始能量 xx 开始,从点心 ii 开始按照螃蟹式吃法一直吃到点心 00,那么最终能量为

aix+bi.a_i x+b_i.

现在,对于给定的初始能量 xx,Bubi 希望最大化自己早餐结束时的能量。她可以选择任意一段连续的下降编号点心来吃,即选择 i,ji,j 满足

0ji<N,0\le j\le i<N,

吃掉点心

i, i1, , j,i,\ i-1,\ \ldots,\ j,

也可以选择什么都不吃。

接下来有 QQ 天。对于每一天,给出 Bubi 的初始能量 xx,你需要求出她早餐结束后能够获得的最大能量。

你的答案允许有误差。若真实答案为 ss,你的输出为 tt,则需要满足

stmax(1,s)106.\frac{|s-t|}{\max(1,|s|)}\le 10^{-6}.

输入中的 ai,bi,xa_i,b_i,x 都是“小数位数有限”的数,最多有 44 位小数。

实现细节

你需要实现两个函数。

首先实现:

void init(
    int n,
    int q,
    const std::vector<double>& a,
    const std::vector<double>& b
);

该函数会在程序开始时被调用一次。参数含义如下:

  • nn:点心种类数 NN
  • qq:询问天数 QQ
  • a,ba,b:题目中描述的 ai,bia_i,b_i 数组。

然后实现:

double query(double x);

该函数会被调用恰好 QQ 次。参数 xx 表示对应一天 Bubi 的初始能量。函数应返回她能够获得的最大最终能量。

你的程序需要包含头文件:

#include "treat.h"

你的代码不应包含 main 函数,也不应从标准输入读取或向标准输出写入。

本地评测器

官方提供了本地评测器 Lgrader.cpp 和头文件 treat.h。本地评测器的输入格式如下。

第一行包含两个整数 N,QN,Q

接下来 NN 行,每行包含两个实数 ai,bia_i,b_i

接下来 QQ 行,每行包含一个实数 xix_i,表示一次询问的初始能量。

本地评测器会先调用 init,然后依次调用 query,最后按询问顺序输出所有结果。

约束

1N,Q1000001\le N,Q\le 100000 1ai,bi1061\le |a_i|,|b_i|\le 10^6 106xi106-10^6\le x_i\le 10^6

所有输入实数最多有 44 位小数。

子任务

子任务 分值 NN QQ 其他限制
1 5 100\le 100
2 1000\le 1000
3 10 5000\le 5000
4 15 10000\le 10000
5 10 50000\le 50000 ai,bi,xa_i,b_i,x 独立均匀随机生成
6 55 100000\le 100000

只有通过某个子任务的所有测试,才能获得该子任务的分数。

样例

输入

4 4
1 1
2 1
-4 7
-16 27
-1
1
2
4

输出

43
11
5
11

样例解释

点心 00 会把能量乘以 11 后加 11;点心 11 会把能量乘以 22 后加 00;点心 22 会把能量乘以 2-2 后加 33;点心 33 会把能量乘以 44 后减 55

对于四个初始能量,最优选择分别为:

  • x=1x=-1 时,吃点心 3,2,1,03,2,1,0,最终能量为 4343
  • x=1x=1 时,吃点心 3,2,1,03,2,1,0,最终能量为 1111
  • x=2x=2 时,吃点心 1,01,0,最终能量为 55
  • x=4x=4 时,只吃点心 33,最终能量为 1111

下发文件

题目会提供头文件 treat.h 和本地评测器 Lgrader.cpp。 @下发文件