斜率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 ...
随机推荐
- linux服务器安装oracle
Linux安装Oracle 11g服务器(图文) 应该是最完整的Oracle安装教程了,全程在测试服务器上完成,软件环境:Red Hat Enterprise Linux 6:Oracle 11g ( ...
- Spring Boot集成Mybatis完整实例
步骤: 添加Mybatis依赖: 添加数据库依赖: 配置属性文件: (具体的属性名称可以在jar包中找到) 内容: 建表sql: Mapper文件的头: 集成Mybatis的配置文件中的具体内容可以在 ...
- vue cli3 项目优化
vue-cli3 Prefetch (官网内容) <link rel="prefetch"> 是一种 resource hint,用来告诉浏览器在页面加载完成后,利用空 ...
- 初试牛刀:实时天气WebService
1.引入WebService:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 2.声明接口→界面获取值传入接口→接口返回值处理→ ...
- POJ3255(Roadblocks)--次短路径
点这里看题目 3228K 485MS G++ 2453B 根据题意和测试用例知道这是一个求次短路径的题目.次短路径,就是比最短路径长那么一丢丢的路径,而题中又是要求从一点到指定点的次短路径,果断Dij ...
- jquery sortable的拖动方法示例详解
转自:https://hb-keepmoving.iteye.com/blog/1154618 所有的事件回调函数都有两个参数:event和ui,浏览器自有event对象,和经过封装的ui对象 u ...
- Jmeter学习笔记(四)配置元件之计数器
在接口测试中,有时候需要重复跑一个接口,里面的某个参数的值不能每次都一样,这个时候我们可以使用计数器来实现,名称+计数器. 1.线程组->添加->配置元件->计数器 2.添加效果如下 ...
- c# 串行化事件
- Docker - Cheap sheet
** IMAGE ** $docker image Delete image : $docker image rm image_id make sure all containers be delet ...
- 个性化召回算法实践(一)——CF算法
协同过滤推荐(Collaborative Filtering Recommendation)主要包括基于用户的协同过滤算法与基于物品的协同过滤算法. 下面,以movielens数据集为例,分别实践这两 ...