P3195
-
斜率优化
-
暴力转移:
表示考虑到第 个玩具达成的最小费用- 设
- 不妨设
-
消掉常数项
- 设
- 设
-
设
且- 则
- 则
-
-
设点
- 设
斜率为 - 若
则 A > B > C - 若
则 A, C > B - 若
则 C > B > A
- 设
-
跟 B 始终无关 -> A, C 连边构成下凸包
-
关于代码
Slope(q[l + 1], q[l]) <= 2.0 * sum[i]
说明 q[l + 1] > q[l], 舍弃 q[l]Slope(q[r], q[r - 1]) >= Slope(i, q[r])
说明 i > q[r] > q[r - 1],舍弃 q[r - 1]
# include <bits/stdc++.h> # define int long long # define double long double using namespace std; const int MOD = (int)1e9 + 7; const int N = (int)1e6 + 10; int n, ll; int c[N], sum[N]; int q[N], l, r; int dp[N]; int X(int x){ return sum[x]; // } int Y(int x){ return dp[x] + (sum[x] + ll) * (sum[x] + ll); } double Slope(int x, int y){ return 1.0 * (Y(x) - Y(y)) / (X(x) - X(y)); } signed main(){ // freopen("1.in", "r", stdin); cin >> n >> ll; for(int i = 1; i <= n; i++){ cin >> c[i]; sum[i] = sum[i - 1] + (c[i] + 1); } ll++; // ll 和 1 合并, 见式子 l = 1, r = 1; q[1] = 0; for(int i = 1; i <= n; i++){ while(l < r && Slope(q[l + 1], q[l]) <= 2.0 * sum[i]){ l++; } int j = q[l]; dp[i] = dp[j] + (sum[i] - sum[j] - ll) * (sum[i] - sum[j] - ll); while(l < r && Slope(q[r], q[r - 1]) >= Slope(i, q[r])) { r--; } q[++r] = i; } cout << dp[n] << "\n"; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话