首页 > 其他分享 >【题解】P2900 [USACO08MAR] Land Acquisition G

【题解】P2900 [USACO08MAR] Land Acquisition G

时间:2023-09-03 20:47:11浏览次数:50  
标签:Land return NN int 题解 tail P2900 double 矩形

题目链接:P2900 [USACO08MAR] Land Acquisition G

我们通过题目可以得出一个较为清晰的结论:

  • 我们将所有的矩形排列起来,可以发现最后被完全包含在另一个矩形内的矩形是没有意义的。
  • 这样的话我们得到的所有矩形的并是呈阶梯状的,如下图:
P2900-1
  • 其中,中间的浅蓝色的边是没有意义的

然后我们可以推导出一个 DP 式子:

我们设 \(f_{i}\) 表示购买前 \(i\) 个矩形的最小代价,那么我们可以得到:

\[f_i = \min_{j=1}^n\{f_{j-1}+l_j\times w_i\} \]

化成斜率优化式子:

\[f_{j-1} = l_j \times (-w_i) + f_i \]

我们要让 \(f_i\) 最小,那么就维护一个上凸包即可。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int NN = 5e4 + 8;
int n;
bool vis[NN];
int que[NN],head,tail;
ll f[NN];
struct Area{
	int w,l;
	bool operator < (const Area &x)const{
		if(w == x.w) return l < x.l;
		return w < x.w;
	}
}a[NN];
double X(int i){return -a[i].l;}
double Y(int i){return f[i-1];}
double K(int i){return a[i].w;}
double Slope(int i,int j){return (Y(i)-Y(j)) / (X(i)-X(j));}
int main(){
	scanf("%d",&n);
	for(int i = 1; i <= n; ++i)
		scanf("%d%d",&a[i].w,&a[i].l);
	sort(a+1,a+1+n);
	int maxn = 0;
	for(int i = n; i >= 1; --i){
		if(a[i].l <= maxn) vis[i] = 1;
		maxn = max(maxn,a[i].l);
	}
	int cnt = 0;
	for(int i = 1; i <= n; ++i)
		if(!vis[i]) a[++cnt] = a[i];
	n = cnt;
	
	head = 1;tail = 0;
	que[++tail] = 1;
	for(int i = 1; i <= n; ++i){
		while(head < tail && Slope(que[head],que[head+1]) < K(i)) ++head;
		int j = que[head];
		f[i] = f[j-1] + 1ll * a[j].l * a[i].w;
		while(head < tail && Slope(que[tail],que[tail-1]) > Slope(que[tail],i+1)) --tail;
		que[++tail] = i+1;
	}
	printf("%lld",f[n]);
}

标签:Land,return,NN,int,题解,tail,P2900,double,矩形
From: https://www.cnblogs.com/rickylin/p/17675527.html

相关文章

  • [ABC318G] Typical Path Problem 题解
    题意给定一个\(N\)个节点和\(M\)条边组成的简单无向联通图,给定三个节点\(A,B,C\),求是否存在一条简单路径满足\(A\rightarrowB\rightarrowC\)。(\(3\leN,M\le2\times10^5\))。题解因为简单路径要求每个节点至多经过一次,故不存在合法的简单路径当且仅当存在一个......
  • 【很难啊、拆分数、观察】P6944 [ICPC2018 WF] Gem Island
    简要题面:求\(n+d\)的\(n\)正整数拆分中,最大的\(r\)个数之和的期望。首先是典中典:KeyObservation:最后的形态\(a_1\toa_n\)的概率都是一样的。Proof:考虑组合数\(\binom{d}{a_1-1,a_2-1.....,a_n-1}\)。然后我们每次在每一个\(a_i-1\)每次分裂有......
  • 【动态规划】“新手动态规划合集”题解
    动态规划三要素阶段,状态,决策动态规划经典模型LIS(最长上升子序列)给定长度为\(N\)的序列\(A[i]\),求出其最长上升子序列的长度。(以不严格上升为例)阶段:已经处理的序列长度\(i\)状态:\(f[i]\)表示以\(A[i]\)结尾的LIS长度转移\[f[i]=\max\limits_{j\in\left[1,......
  • [ABC318D] General Weighted Max Matching 题解
    [ABC318D]GeneralWeightedMaxMatching题解题意  给定无向有权完全图,求最大权匹配。思路分析  注意到\(n\le16\),我考虑状压DP。  设当前点集\(S\)中最大权匹配的答案是\(f_S\),我们考虑\(S\)中“最后”一个点\(p\)(这里的“最后”一个点是指,在状压表示状态......
  • [ABC318E] Sandwiches 题解
    题意给定一个长度为\(N\)的正整数列\(A=\left(A_1,A_2,\cdots,A_N\right)\),求满足以下条件的正整数三元组\(\left(i,j,k\right)\)的数量:\(1\lei<j<k\leN\);\(A_i=A_k\);\(A_i\neqA_j\)。数据范围:\(3\leN\le3\times10^5\);\(1\leA_i......
  • CF1848B Vika and the Bridge 题解
    CF1848BVikaandtheBridge题解题目大意给个题目传送门吧,感觉题意已经很清楚了题目传送门分析(我不会告诉你我第一眼看过去是二分)因为我们只能改一块木板的颜色,所以可以考虑贪心。大概算了下复杂度,也没有问题。题解我们要去求每种颜色最大距离的最小值,那我们可以先去求......
  • 有关Vue-Cli5.X工程中ESLint组件命名检查问题解决
    个人开发环境简介,工具用的VisualStudioCode,因为每个人的开发环境不同,不可能所有解决方案通用,防止踩坑。PSF:\VueWorkSpace\vue_router_test>node-vv16.12.0PSF:\VueWorkSpace\vue_router_test>npm-v8.1.0PSF:\VueWorkSpace\vue_router_test>npmeslint-v8.1.0......
  • P3604 美好的每一天题解
    传送门好题!首先说这道题的时间复杂度:\(O(26n\sqrtn)\)。因为转移是的常数是\(O(26)\)并非\(O(1)\),这启示我们,看数据范围,不要被O(1)给限制了,O(1)是一般情况,有些题不一般首先,回文串能出现的条件是所有的字符都出现偶数次\(or\)仅有一个字符出现奇数次,所以我们并不关心每个......
  • 【题解】AtCoder Beginner Contest 318(D - Ex)
    赛时过了A-G,Ex仿佛猜到了结论但是完全不懂多项式科技,就炸了。大家好像都秒了A,B,C就不写了。D.GeneralWeightedMaxMatching题目描述:给你一个加权无向完全图,图中有\(N\)个顶点,编号从\(1\)到\(N\)。连接顶点\(i\)和\(j\)的\((i<j)\)的权重为\(D_{i,j}\)。在......
  • P4198 楼房重建题解
    传送门一眼数据结构。考虑线段树,记录该区间能看到最多的建筑数量\(ans_{wz}\)以及看到区间中最大的斜率(或者说,该区间内最后看到的建筑)\(xl_{wz}\)。很明显,假如我现在的修改操作是\((x,y)\),那么会改变\(\log_n\)个节点,即包含\(x\)的节点,考虑如何修改他们的\(ans\)和\(......