1 条题解
-
0
自动搬运
来自洛谷,原作者为

CaiZi
初三蒟蒻 || 坐标 FJ || ENFP-A || MC&PVZ&RS 玩家 || 出题团为 CZOI(80765)搬运于
2025-08-24 23:08:29,当前版本为作者最后更新于2025-01-09 20:40:02,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
假设有一个等差数列 可以通过若干次操作得到。
根据等差数列的定义,我们可以知道 只和首项 以及公差 有关,这个等差数列的和 为:
$$s=\frac{n(b_1+b_n)}{2}=\frac{nb_1+nb_1+(n-1)d}{2}=\frac{2nb_1+(n-1)d}{2} $$考虑枚举 。假设我们正在计算某个固定的 的答案。我们首先需要求出操作次数的最小值,然后可以通过不断给整个数列全部 来制造更多不同的等差数列。因为 固定,而操作次数等于 ,所以我们需要求出 的最小值。因为 确定,所以我们需要求出 的最小值,即对 进行操作的次数的最小值。
我们可以先假设 ,得到等差数列 。由于每次操作只能 不能 ,因此如果有 ,则只能通过对 进行 次操作解决。因此 即为对 进行操作的次数的最小值,注意这个值为负数的情况。然后此时套用 的计算方法得到 的和。
然后考虑 的范围,最小值肯定是 。而最大值需要满足 ,即最大值为 ,因此枚举 的复杂度是 ,其中 代表 的值域。然后每次计算的复杂度是 的,总复杂度为 。
代码展示:
#include<bits/stdc++.h> #define int long long using namespace std; int n,m,a[1000001],b,c,x,y,z; signed main(){ cin.tie(nullptr)->sync_with_stdio(0); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; b+=a[i]; } for(int i=0;a[1]+(n-1)*i<=a[n]+m;i++){ x=0; for(int j=1;j<=n;j++){ x=max(x,a[j]-a[1]-(j-1)*i); } y=(2*a[1]+2*x+(n-1)*i)*n/2; z=m-y+b; if(z>=0){ c+=z/n+1; } } cout<<c; return 0; }
- 1
信息
- ID
- 9261
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者