bzoj 4709 [ Jsoi2011 ] 柠檬 —— 斜率优化DP
2024-10-01 03:31:18
题目: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 ;
}
最新文章
- linux-impdp的使用
- 【jmeter】JMeter处理Cookie与Session
- Android实现数据存储技术
- oracle数据库根据不同条件给同一字段修改相应的值:
- 遍历id,根据id作为条件循环查询。
- java中XMLGregorianCalendar类型和Date类型之间的相互转换
- 修改linux文件权限命令:chmod 【转载】
- JS正则表达式之特殊符号
- .NET CORE 学习笔记之安装EF【Microsoft.EntityFrameworkCore】扩展报错
- python for循环巧妙运用(迭代、列表生成式)
- <;TCP/IP原理>; (四) IP编址
- Git入门——本地版本库操作
- SSM登录跳转到登录页,登录页不能加载js和样式
- ES6 基本语法
- 理解AppDomain
- 【SQL Prompt】SQL Prompt7.2下载及破解教程
- 启动adb devices,报adb已停止工作
- Vue + Element UI 实现权限管理系统(动态加载菜单)
- PHP获取指定函数定义在哪个文件中及行号
- iphone之使用讯飞语音sdk实现语音识别功能
热门文章
- hibernate注解之@Onetomany、@Manytoone、@JoinColumn
- ES6 Array返回只出现一次的元素
- transition-分栏按钮动画
- php银联支付
- vmware vSphere client中,选择文件->;部署OVF模板,报错处理方法
- Linux命令(文本编辑器)
- SQL With As 用法Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
- js for 循环 添加tr td 算法
- Miller Rabbin素数测试
- openoffice启动服务并将office文件转换为pdf文件