题意:给你一个数组,你可以选择数组中的一个数,把它插入数组的其它位置,问∑ i * a[i]的最大值为多少?

思路:设dp[i]表示把第i个数向左边插入可以获得的最大增量,我们假设向左边插入,设插入的位置是j,当前位置是i,那么变化为sum[i - 1] - sum[j - 1] - (i - j) * a[i], 将式子转化,sum[j - 1] = a[i] * j - dp[i] + sum[i - 1] - i * a[i],我们要让dp[i]最大,即让-dp[i]最小,用单调队列维护下凸壳,查询的时候二分斜率即可。向右边插入同理。

代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 200010;
LL q[maxn], l, r;
LL a[maxn], sum[maxn];
LL dp[maxn];
int binary_search(LL k) {if(r == l) return q[l];int L = l, R = r;while(L < R) {int mid = (L + R) >> 1;int tmp = q[mid], tmp1 = q[mid + 1];if(sum[tmp1 - 1] - sum[tmp - 1] <= k * (tmp1 - tmp)) L = mid + 1;else R = mid; }return q[L];
}
int binary_search1(LL k) {if(r == l) return q[l];int L = l, R = r;while(L < R) {int mid = (L + R) >> 1;int tmp = q[mid], tmp1 = q[mid + 1];if(sum[tmp1] - sum[tmp] <= k * (tmp1 - tmp)) L = mid + 1;else R = mid; }return q[L];
}
int main() {int n;LL res = 0;scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%lld", &a[i]);sum[i] = sum[i - 1] + a[i];res = res + a[i] * i;}l = 1, r = 1, q[l] = 1, dp[1] = 0;for (LL i = 2; i <= n; i++) {int pos = binary_search(a[i]);dp[i] = sum[i - 1] - sum[pos - 1] - (i - pos) * a[i];while(l < r && (sum[q[r] - 1] - sum[q[r - 1] - 1]) * (i - q[r - 1]) >= (sum[i - 1] - sum[q[r - 1] - 1]) * (q[r] - q[r - 1]))r--;q[++r] = i;}LL ans = -5e18;for (int i = 1; i <= n; i++)ans = max(ans, res + dp[i]);l = 1, r = 1, q[1] = n;dp[n] = 0; for (LL i = n - 1; i >= 1; i--) {int pos = binary_search1(a[i]);dp[i] = sum[i] - sum[pos] - (i - pos) * a[i];while(l < r && (sum[q[r - 1]] - sum[i]) * (q[r] - i) <= (sum[q[r]] - sum[i]) * (q[r - 1] - i))r--;q[++r] = i;}for (int i = 1; i <= n; i++)ans = max(ans, res + dp[i]);ans = max(ans, res);printf("%lld\n", ans);
}

  

转载于:https://www.cnblogs.com/pkgunboat/p/10881326.html

Codeforces 631E 斜率优化相关推荐

  1. Codeforces 1179D Fedor Runs for President [DP,斜率优化]

    Codeforces 思路 考虑把连的那两个点中间的链提出来,那么就会变成一条链,链上的每个点挂着一棵子树的形式. 设那些子树的大小为\(S_1,S2,\cdots\),那么新加的简单路径个数就是 \ ...

  2. [斜率优化DP] codeforces 673E. Levels and Regions

    题意: 要把 1-n 1-n分成 k k组,每组内的数必须连续,组与组不相交且每个数必须属于一个组,并且任意ii有一个参数 ti t_i. 如果 [l,r] [l,r]为一组,那么从 l l走到l+1 ...

  3. 提高篇 第五部分 动态规划 第6章 斜率优化动态规划

    例1 任务安排(TYVJ1098) [tyvj1098]任务安排(dp)_薇小薇-CSDN博客 Tyvj1098 任务安排_Monster__Yi的博客-CSDN博客 P2365 任务安排 任务安排 ...

  4. BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)

    题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...

  5. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  6. 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化

    [BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...

  7. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...

  8. 『玩具装箱TOY 斜率优化DP』

    玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...

  9. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  10. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

最新文章

  1. db2不记录日志插入记录
  2. SharePoint Serivce 安装时的一个问题
  3. s := time.Now().Format(20060102) go格式化
  4. Python print函数用法,print 格式化输出
  5. php$pat,PHP的Session管理框架 patSession | 码农软件 - 码农网
  6. fprintf函数的用法_MATLAB的21种特殊符号,总有一种你不知道的用法
  7. c语言字符串加减_C语言中指针的介绍
  8. openshift_通过OpenShift超越云炒作
  9. Qt之QProcess(一)运行cmd命令
  10. 华为交换机配置syslog发送_配置华为交换机把日志发送到远程centos syslog服务器上...
  11. 58 - 算法 - 百练 2503:Babelfish 二分查找与存储
  12. 碳排放权交易管理办法即将施行,你知道火电厂的碳排放是怎么算出来的吗?
  13. 利用CaaS控制虚拟机蔓延
  14. 2.智能快递柜(终端篇)
  15. JAVA 编写一个员工类,成员变量和成员方法自拟,编写一个测试类
  16. iOS - 选取相册中iCloud云上图片和视频的处理
  17. (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法...
  18. Jmeter 4.0+高分屏参数自动设置脚本
  19. 1-1 medium vs. modality笔记
  20. 中兴历年笔试题自己收藏用03

热门文章

  1. 面试题之Servlet工作原理
  2. Java中String、StringBuffer和StringBuilder的区别和堆栈内存分配
  3. python使用临时文件
  4. FreeDOS 24 周年,创始人分享常用 DOS 命令备忘表
  5. js 邮箱、11位手机正则
  6. 去掉内容中的所有全部html标签。
  7. bean的生命周期——Spring对bean的管理(三)
  8. C#如何控制Windows关机
  9. AGC020C Median Sum
  10. Luogu1502 窗口的星星