[CF1083]The Fair Nut and Rectangles

The Fair Nut and Rectangles

题解

好板一dp

很明显的一道斜率优化,因为矩阵间不含包含关系,所以当x_{i}>x_{j}时,一定有y_{i}<y_{j}

于是我们先根据x数组从小到大排序,得到序列的y值一定单调下降的。

很明显可以dp了,令dp_{i}为选择第i个矩形且其它所有已选矩形的x值都比其小时,最大的价值和。转移方程式易得:dp_{i}=max\left\{ dp_{j}+(x_{i}-x_{j})\cdot y_{i} -a_{i}\right \}

鉴于n< 10^{6}O\left(n^2 \right )的时间复杂度明显过不了此题,考虑优化。

对于点i,如果点j比点k更优,这有

dp_{j}+ (x_{i}-x_{j})y_{i}-a_{i} > dp_{k}+(x_{i}-x_{k})y_{i}- a{i}

\Rightarrow dp_{j}- x_{j}y_{i}< dp_{k}- x_{k}y_{i}

\Rightarrow dp_{j}-dp_{k}<(x_{j}-x_{k})y_{i}

\Rightarrow \frac{dp_{j}-dp_{k}}{x_{j}-x_{k}}<y_{i}

明显可以通过斜率来优化。时间复杂度O\left(n \right )

源码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000005
typedef long long LL;
typedef pair<int,int> pii;
const LL mo=1e9+7;
const LL INF=0x7f7f7f7f;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
LL n,dp[MAXN],ans;
LL head,tail,q[MAXN];
struct ming{LL x,y,a;}s[MAXN];
bool cmp(ming x,ming y){return x.x<y.x;}
double slope(int x,int y){
	if(s[x].x==s[y].x)return INF;
	return 1.0*(dp[x]-dp[y])/(s[x].x-s[y].x);
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld %lld %lld",&s[i].x,&s[i].y,&s[i].a);
	sort(s+1,s+n+1,cmp);
	for(int i=1;i<=n;i++){
		while(head+1<tail&&slope(q[head],q[head+1])>=s[i].y)head++;
		dp[i]=s[i].x*s[i].y-s[i].a;
		if(head<tail)dp[i]=max(dp[i],dp[q[head]]+1ll*(s[i].x-s[q[head]].x)*s[i].y-s[i].a);
		while(head+1<tail&&slope(q[tail-2],q[tail-1])<=slope(q[tail-1],i))tail--;q[tail++]=i;
	}
	for(int i=1;i<=n;i++)ans=max(ans,dp[i]);
	printf("%lld\n",ans);
	return 0;
}

谢谢!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值