斜率dp的模板总结
#include<cstdio>
#include<algorithm>
using namespace std;
long long sumt[40005],sum[40005],f[40005],q[40005];
double X(long long x)
{
return sumt[x];
}
double Y(long long x)
{
return (f[x]+sum[x]);
}
double slope(long long a,long long b)
{
return ((Y(a)-Y(b))/(X(a)-X(b)));
}
struct ben
{
long long t,r;
}a[40005],b[40005];
long long cmp(const ben &a,const ben &b)
{
return a.t>b.t;
}
int main()
{
freopen("nt2011_design.in","r",stdin);
freopen("nt2011_design.out","w",stdout);
long long l=0,r=0;
long long n,m;
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++)
{
scanf("%lld%lld",&a[i].t,&a[i].r);
}
sort(a+1,a+n+1,cmp);
for(long long i=1;i<=n;i++)
{
if(a[i].t==a[i+1].t)
{
a[i+1].r+=a[i].r;
a[i].r=0;
}
}
long long cnt=0;
for(long long i=1;i<=n;i++)
{
if(a[i].r!=0)
{
b[++cnt]=a[i];
}
}
long long maxt=b[1].t;
b[cnt+1].t=0;
b[cnt+1].r=0;
cnt++;
for(long long i=1;i<=cnt;i++)
{
b[i].t=maxt-b[i].t;
sumt[i]=sumt[i-1]+b[i].r;
sum[i]=sum[i-1]+b[i].t*b[i].r;
}
for(long long i=1;i<=cnt;i++)
{
while(l<r&&slope(q[l+1],q[l])<b[i].t)l++;
f[i]=f[q[l]]+b[i].t*(sumt[i]-sumt[q[l]])-(sum[i]-sum[q[l]]);
if(i!=cnt)f[i]+=m;
while(l<r&&slope(i,q[r-1])<slope(q[r-1],q[r]))r--;
q[++r]=i;
}
printf("%lld\n",f[cnt]);
return 0;
}
斜率dp的模板总结的更多相关文章
- 斜率DP题目
uva 12524 题意:沿河有n个点,每个点有w的东西,有一艘船从起点出发,沿途可以装运东西和卸载东西,船的容量无限,每次把wi的东西从x运到y的花费为(y-x)*wi; 问把n个点的东西合并成k个 ...
- hdu3507 Print Article(斜率DP优化)
Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it ...
- 斜率DP个人理解
斜率DP 斜率DP的一版模式:给你一个序列,至多或分成m段,每段有花费和限制,问符合情况的最小花费是多少: 一版都用到sum[],所以符合单调,然后就可以用斜率优化了,很模板的东西: 如果看不懂可以先 ...
- POJ 1260 Pearls (斜率DP)题解
思路: 直接DP也能做,这里用斜率DP. dp[i] = min{ dp[j] + ( sum[i] - sum[j] + 10 )*pr[i]} ; k<j<i => dp[j ...
- bzoj4518: [Sdoi2016]征途--斜率DP
题目大意:把一个数列分成m段,计算每段的和sum,求所有的sum的方差,使其最小. 由方差*m可以化简得ans=m*sigma(ki^2)-sum[n]^2 很容易得出f[i][j]=min{f[i- ...
- hdu 3507 斜率dp
不好理解,先多做几个再看 此题是很基础的斜率DP的入门题. 题意很清楚,就是输出序列a[n],每连续输出的费用是连续输出的数字和的平方加上常数M 让我们求这个费用的最小值. 设dp[i]表示输出前i个 ...
- 斜率dp cdq 分治
f[i] = min { f[j] + sqr(a[i] - a[j]) } f[i]= min { -2 * a[i] * a[j] + a[j] * a[j] + f[j] } + a[i] * ...
- HDU 2829 Lawrence (斜率DP)
斜率DP 设dp[i][j]表示前i点,炸掉j条边的最小值.j<i dp[i][j]=min{dp[k][j-1]+cost[k+1][i]} 又由得出cost[1][i]=cost[1][k] ...
- [kuangbin带你飞]专题二十 斜率DP
ID Origin Title 20 / 60 Problem A HDU 3507 Print Article 13 / 19 Problem B HDU 2829 Lawr ...
随机推荐
- IO是否会一直占用CPU?(转)
原文来自知乎:https://www.zhihu.com/question/27734728 这是一个很好的关于并发/并行系统的问题.简单回答就是:IO所需要的CPU资源非常少.大部分工作是分派给DM ...
- 采用二进制方式安装K8S集群,版本etcd-v3.3.10,flannel-v0.11.0,kubernetes-server-linux-amd64
官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环 ...
- 雷达无线电系列(三)经典CFAR算法门限因子alpha计算(matlab)
前言 本文汇集CA.SO.GO.OS.杂波图等恒虚警算法的门限因子求解方法及其函数 1,CA-CFAR [非常简单,可以直接求解] %% 均值恒虚警_门限因子计算公式 %% 版本:v1 %% 时间:2 ...
- Visual Studio 2013/15/17小技巧
1.Ctrl + F10 可以直接运行到光标处,而不用F10 逐过程 F11 逐语句了 2.当有多个断点时,按F5可以切换到下一个断点. 3.Ctrl+Shift+空格 显示函数签名,上下键可以查看所 ...
- 编写Postgres扩展之五:代码组织和版本控制
原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-v/ 编译:Tacey Wong 在关于编写Postgres扩 ...
- 用D3js的区域生成器实现简单波浪图
最近做控件遇到含有波浪图的图表,一开始用Echarts虽然很快完成了,但Echarts的波浪图与其他图表的响应式不同步,于是学习了D3js,D3js写起来确实复杂一些,但能够实现的效果也更丰富,做的时 ...
- zabbix推送内存监控单应用shell
利用top方式获取指定第三方的内存使用率 #!/bin/bash process=$1 if [ ! -z $process ];then cd /zabbix/zabbix-agent/script ...
- 如何通过wlst部署应用程序到weblogic12c上
适用版本 Oracle WebLogic Server - Version 10.3 and laterInformation in this document applies to any plat ...
- Python基础Day5
一.字典 ①字典是python的基础数据类型之一 ②字典可以存储大量的数据,关系型数据 ③字典也是python中唯一的映射类的数据类型 字典是以键值对的形式存在的,{键:值} 字典的键必须是不可变的数 ...
- FAILED: SemanticException Unable to determine if hdfs://tmaster:8020/user/root/words.db/test_t2 is encrypted
使用hive时,建立数据库,建表,写数据: 读数据:select * from test_t2; 报错SemanticException 原因:建表时使用了其他路径,或者在另一个路径的数据库(建立数 ...