[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
    评论
nut-datepicker是一个日期选择器,用于在前端界面中选择日期。它的样式可以在picker.scss文件中找到并进行自定义调整。如果发现样式定位异常,可以在全局样式文件中重新定义样式,例如使用以下代码进行重新定义: ``` <style> .nut-picker-list .nut-picker-content, .nut-picker-list .nut-picker-roller { position: relative; } </style> ``` 在使用nut-datepicker时,可以通过以下代码来展示效果: ``` 打开选择器: <div class="label">记录日期:</div> <nut-calendar :is-visible.sync="isVisible" startDate="2022-01-01" :default-value="recordTime" :is-auto-back-fill="true" @close="switchPickerClose" @choose="setChooseValue" > </nut-calendar> <nut-cell :is-link="true" :show-icon="true" @click.native="switchPicker"> <span slot="title">日期选择</span> <div slot="desc" class="selected-option"> <span class="show-value"> {{recordTime ? recordTime : '请选择日期'}} </span> </div> </nut-cell> ``` 在代码中,通过设置isVisible的值来控制选择器的显示和隐藏。当选择器关闭时,会触发close事件,可以在switchPickerClose方法中进行处理。当选择日期时,会触发choose事件,可以在setChooseValue方法中获取选择的日期并进行处理。 需要注意的是: (1)默认打开时间和defaultValue相关,可以通过设置defaultValue来指定打开的时间; (2)如果不指定startDate,选择器可选择日期的开始时间默认为2000-01-01 00:00,可以根据自身情况给定或动态赋值; (3)如果不指定endDate,那么选择器只能选择当天的0时时间,可以根据自身情况给定或动态赋值。 总结来说,nut-datepicker是一个用于选择日期的前端组件,可以通过设置相关属性和监听事件来实现日期的选择和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值