RiverSheepSHEEP

CF889E Mod Mod Mod

奔跑的心634·2022-11-25 19:32·34 次阅读

CF889E Mod Mod Mod

CF889E Mod Mod Mod#

一道有趣的题,考虑x有意义的取值,设fi表示xmoda1...modai的值,那么一定存在fk=ak1,否则我们可以让x整体加一直到达到上界,这样显然更优,所以x有意义的取值只有O(n)个,这样我们可以DP去维护这些取值的答案。具体的,设gi,j表示到第i轮,在modai后的值为j高于当前数的和,这样答案就为gi,j+ij

gi+1,jmodai+1=maxgi,j+i(jjmodai+1)

gi+1,ai+11=maxgi,j+i((j+1)/ai+1ai+1ai+1)

map来转移DP

Code
Copy
#include<cstdio> #include<iostream> #include<algorithm> #include<map> #define LL long long #define IN inline using namespace std; const int N = 2e5 + 5; int n; LL a[N]; IN LL read() { LL res = 0; char ch = getchar(); for (; !isdigit(ch); ch = getchar()); for (; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (LL)(ch ^ 48); return res; } map<LL, LL> f; int main() { n = read(); for (LL i = 1; i <= n; i++) a[i] = read(); f[a[1] - 1] = 0; for (int i = 2; i <= n; i++) { for (auto j = f.lower_bound(a[i]); j != f.end(); f.erase(j++)) { LL v = j->first % a[i], g = j->first; f[v] = max(f[v], j->second + (LL)(i - 1) * (g - v)); f[a[i] - 1] = max(f[a[i] - 1], j->second + (LL)(i - 1) * ((g + 1) / a[i] * a[i] - a[i])); } } LL ans = 0; for (auto i : f) ans = max(ans, i.second + (LL)n * i.first); printf("%lld\n", ans); }
posted @   RiverSheep  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
目录