题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709

课上讲的题,还是参考了博客...:https://www.cnblogs.com/GXZlegend/p/8615607.html

这道题和之前写的斜率优化不同的一点是用单调栈维护上凸壳,而且需要二分查找答案;

为什么感觉每次写出来的斜率优化DP都不一样...还是没有理解透彻...

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
int const maxn=1e5+,maxm=1e4+;
int n,a[maxn];
ll s[maxn],cnt[maxm],f[maxn];
vector<int>v[maxm];
ll x(int i){return s[i]-;}
ll y(int i){return f[i-]+a[i]*(s[i]-)*(s[i]-);}
ll ans(int i,int j){return f[j-]+a[i]*(s[i]-s[j]+)*(s[i]-s[j]+);}
ll squ(ll x){return x*x;}
int main()
{
scanf("%d\n",&n);
for(int i=,j,k,t;i<=n;i++)
{
scanf("%d",&a[i]); s[i]=++cnt[a[i]];
while((t=v[a[i]].size()-)> &&
(x(i)-x(j=v[a[i]][t]))*(y(k=v[a[i]][t-])-y(j)) - (y(i)-y(j))*(x(k)-(x(j))) > )//别写成if
v[a[i]].pop_back();
v[a[i]].push_back(i);
int l=,r=v[a[i]].size()-,res=;//res=0 //不取新加入的i
while(l<=r)
{
int mid=((l+r)>>);
if(ans(i,v[a[i]][mid])>ans(i,v[a[i]][mid-]))res=mid,l=mid+;
else r=mid-;
}
f[i]=ans(i,v[a[i]][res]);
}
printf("%lld\n",f[n]);
return ;
}

最新文章

  1. linux-impdp的使用
  2. 【jmeter】JMeter处理Cookie与Session
  3. Android实现数据存储技术
  4. oracle数据库根据不同条件给同一字段修改相应的值:
  5. 遍历id,根据id作为条件循环查询。
  6. java中XMLGregorianCalendar类型和Date类型之间的相互转换
  7. 修改linux文件权限命令:chmod 【转载】
  8. JS正则表达式之特殊符号
  9. .NET CORE 学习笔记之安装EF【Microsoft.EntityFrameworkCore】扩展报错
  10. python for循环巧妙运用(迭代、列表生成式)
  11. &lt;TCP/IP原理&gt; (四) IP编址
  12. Git入门——本地版本库操作
  13. SSM登录跳转到登录页,登录页不能加载js和样式
  14. ES6 基本语法
  15. 理解AppDomain
  16. 【SQL Prompt】SQL Prompt7.2下载及破解教程
  17. 启动adb devices,报adb已停止工作
  18. Vue + Element UI 实现权限管理系统(动态加载菜单)
  19. PHP获取指定函数定义在哪个文件中及行号
  20. iphone之使用讯飞语音sdk实现语音识别功能

热门文章

  1. hibernate注解之@Onetomany、@Manytoone、@JoinColumn
  2. ES6 Array返回只出现一次的元素
  3. transition-分栏按钮动画
  4. php银联支付
  5. vmware vSphere client中,选择文件-&gt;部署OVF模板,报错处理方法
  6. Linux命令(文本编辑器)
  7. SQL With As 用法Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
  8. js for 循环 添加tr td 算法
  9. Miller Rabbin素数测试
  10. openoffice启动服务并将office文件转换为pdf文件