luogu#P16374. [IATI 2026] Arithmetic Progression

    ID: 16553 远端评测题 5000ms 1024MiB 尝试: 0 已通过: 0 难度: 9 上传者: 标签>动态规划 DP树形数据结构二分平衡树交互题动态规划优化2026斜率维护技巧 slope trickIATI(保加利亚/东欧)

[IATI 2026] Arithmetic Progression

题目描述

Sashka 有一个由 NN 个正整数构成的序列 A0,A1,,AN1A_0,A_1,\dots,A_{N-1},一个正整数 KK,以及一个等差数列(序列 P0,P1,P_0, P_1,\dots 是等差数列当且仅当存在常数 DD 使得对所有 i1i \geq 1Pi=D+Pi1P_i = D + P_{i-1}),该数列由其首项 SS 和相邻两项之差 DD 定义,且 SSDD 均为正整数。

她关心的是 AA 的长度为 KK 的子序列(从一个序列中删去零个或多个元素,但不改变剩余元素的顺序,所得到的序列称为该序列的子序列),记作 B0,B1,,BK1B_0, B_1,\dots,B_{K-1}

请编写一个程序 arithmetic_progression\texttt{arithmetic\_progression},计算这样的子序列与等差数列的前 KK 项对应相乘之和的最小值,即最小化如下求和式:

i=0K1Bi×(S+i×D)\sum_{i=0}^{K-1} B_i \times (S + i \times D)

实现细节

你需要实现函数 solve

__int128 solve(std::vector<long long> A, int K, long long S, int D)
  • AA:向量,包含 A0,A1,,AN1A_0,A_1, \dots, A_{N-1}
  • KK:子序列的长度
  • SS:等差数列的首项
  • DD:等差数列的公差

你的函数应返回上述类型的最小可能和。由于结果可能非常大,你的函数应返回非标准的 __int128 类型(128 位整数)。头文件 arithmetic_progression.h 中包含了针对 <<>> 运算符的重载定义,允许对 __int128 变量使用 std::cinstd::coutstd::cerr

输入格式

输入格式:

  • 第 1 行:NN KK SS DD
  • 第 2 行:A0 A1 A2 ... AN1A_0\ A_1\ A_2\ ...\ A_{N-1}

输出格式

输出格式:

  • 第 1 行:一个整数,等于 solve 返回的答案。
3 2 1 1
5 1 4
7
3 2 6 1
5 1 4
34
6 4 4 6
18 12 8 14 19 11
562

提示

样例 1 解释

等差数列为 {1,2}\{1,2\}。我们选择 B={5,1}B=\{5,1\},得到最优结果:5×1+1×2=75 \times 1 + 1 \times 2 = 7

样例 2 解释

等差数列为 {6,7}\{6,7\}。我们选择 B={1,4}B=\{1,4\},得到最优结果:1×6+4×7=341 \times 6 + 4 \times 7 = 34

样例 3 解释

等差数列为 {4,10,16,22}\{4,10,16,22\}。我们选择 B={18,12,8,11}B=\{18,12,8,11\},得到最优结果:$18 \times 4 + 12 \times 10 + 8 \times 16 + 11 \times 22 = 562$。

数据范围

  • 1KN300 0001 \leq K \leq N \leq 300\ 000
  • 1D1091 \leq D \leq 10^9
  • 1Ai,S10151 \leq A_i, S \leq 10^{15}

子任务

子任务 分值 依赖的子任务 NN 其他限制
00 - 样例测试。
11 55 00 20\leq 20 -
22 66 010-1 500\leq 500
33 020-2 3 000\leq 3\ 000
44 11 - 100 000\leq 100\ 000 K=NK = N
55 44 44 KN1K \geq N - 1
66 454-5 KN2K \geq N-2
77 55 - AA 是通过均匀随机打乱由作者为该测试点选定的某个序列 TT 得到的。
88 070-7 -
99 6767 080-8 300 000\leq 300\ 000

一个子任务的分数仅当该子任务及其所依赖子任务的全部测试数据均成功通过时才能获得。

翻译由 DeepSeek V4 Pro 完成