专栏文章
题解:CF2110F Faculty
CF2110F题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min03fkk
- 此快照首次捕获于
- 2025/12/01 18:22 3 个月前
- 此快照最后确认于
- 2025/12/01 18:22 3 个月前
不失一般性的,我们设 。
从最简单的情况考虑,当 时,。以下均为 的情况,推推式子可知:
由于 ,式子可以进一步化简:
由 可知 ,于是可以得到以下观察:
分析可知,当 时不等式左侧取等;当 时不等式右侧取等。
接下来考虑对于任意前缀长度为 的答案是怎么取到的。当 时答案显然为 , 时为 。对于 的情况,考虑 与 满足 ,由不等式可知 ,因此可以证明前缀长度为 的最大值里一定有一个数取到 。
再由不等式可知存在 的情况时才会使得答案变得不确定,而这种情况最多只会有 次,因此直接暴力更新即可,总时间复杂度 。
代码如下:
CPPvoid solve ()
{
int n = read ();
vector <int> a (n + 1),ans (n + 1,0);
for (int i = 1;i <= n;++i) a[i] = read ();
int mx = a[1];
for (int i = 2;i <= n;++i)
{
if (a[i] > mx)
{
if (a[i] >= mx * 2) {for (int j = 1;j < i;++j) ans[i] = max (ans[i],a[i] % a[j] + a[j] % a[i]);}
else ans[i] = a[i];
mx = a[i];
}
else ans[i] = max (ans[i - 1],mx % a[i] + a[i] % mx);
}
for (int i = 1;i <= n;++i) printf ("%d ",ans[i]);
puts ("");
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...