首先要冷静下来发现这仅仅是在划分区间。显然若有相邻的数字相同应当划分在同一区间。还有一个显然的性质是区间的两端点应该相同且选择的就是端点的数。瞬间暴力dp就变成常数极小100002了。可以继续斜率优化然而懒了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,a[N],b[N],cnt[N],p[N],pre[N];
ll f[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4709.in","r",stdin);
freopen("bzoj4709.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) a[i]=read();
for (int i=;i<=n;i++)
{
int t=i;
while (t<n&&a[t+]==a[i]) t++;
m++,b[m]=a[i],cnt[m]=t-i+,pre[m]=p[a[i]],p[a[i]]=m;
i=t;
}
for (int i=;i<=m;i++)
{
int s=;
for (int j=i;j;j=pre[j])
{
s+=cnt[j];
f[i]=max(f[i],f[j-]+1ll*b[i]*s*s);
}
}
cout<<f[m];
return ;
}

最新文章

  1. Web API后端调用接口 (Get,POST,Put,Delete)
  2. Product Backlog
  3. Java多线程之Lock的使用
  4. DOS常用的简单命令
  5. android开发软件
  6. IGF职业组比赛
  7. Guangsoushensou 2
  8. python学习之路-4 内置函数和装饰器
  9. java菜鸟篇&lt;四&gt; ZTree入门篇
  10. windows7下virtualBox配置识别usb
  11. C# 中 双问号??的用法
  12. redis五种数据类型
  13. javascript中this的指向
  14. c/c++ 大于等于 大于 时间效率比较
  15. Tippy.js – 轻量的 Javascript Tooltip 工具库
  16. wordpress如何去掉generator
  17. opengl 结果白屏解决方法
  18. 安装scrapy时遇到的问题
  19. 28、shareSDK分享以及 QQ应用平台申请遇到的问题
  20. PDFSharp生成PDF.

热门文章

  1. 长沙Uber优步司机奖励政策(12月28日到1月3日)
  2. 2 引用 深copy 浅copy
  3. 「日常训练」Equation(HDU-5937)
  4. Linux搭建mysql、apache、php服务总结
  5. Oracle启动与关闭数据库实例
  6. 小程序页面的四种文件(JSON、WXML、WXSS、JS)加载顺序
  7. 记一次Log4j2日志无法输出的 心酸史
  8. centos 6.5 启动时卡在进度条位置无法进入系统解决办法。
  9. Java学习笔记-12.传递和返回对象
  10. 洛谷P1068 分数线划定:sort结构体排序+贪心