CF1408D Searchlights(优化暴力)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1408D Searchlights(优化暴力)相关的知识,希望对你有一定的参考价值。

Link

n n n个强盗坐标为 ( a i , b i ) (a_i,b_i) (ai,bi), m m m个灯坐标为 ( c i , d i ) (c_i,d_i) (ci,di)

现在你需要给所有强盗的 a i a_i ai加上 x x x,给所有的 b i b_i bi加上 y y y

满足 x + y x+y x+y最小且不存在任何 i , j i,j i,j满足 a i < = c i & & b i < = d j a_i<=c_i\\&\\&b_i<=d_j ai<=ci&&bi<=dj


考虑确定的强盗 i i i和灯 j j j

要么让 a i a_i ai加上 c j − a i + 1 c_j-a_i+1 cjai+1,要么让 b i b_i bi加上 d j − b i + 1 d_j-b_i+1 djbi+1

这相当于,当 a i a_i ai加上 x ∈ [ 0 , c j − a i ] x\\in[0,c_j-a_i] x[0,cjai]时, b i b_i bi至少要加上 d j − b i + 1 d_j-b_i+1 djbi+1

那么完全可以枚举最后给 a i a_i ai总体加 x x x,此时需要至少给 b i b_i bi加多少

这个限制做一个前缀 m a x \\rm max max即可

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int n,m,a[maxn],b[maxn],c[maxn],d[maxn],f[maxn];
signed main()
{
	cin >> n >> m;
	for(int i=1;i<=n;i++)	cin >> a[i] >> b[i];	
	for(int i=1;i<=m;i++)	cin >> c[i] >> d[i];
	
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	{
		int x = c[j]-a[i], y = d[j]-b[i]+1;//当a加[0,x]时,b至少加y
		if( x<0 )	continue;	
		f[x] = max( f[x],y );
	}
	int ans = 1e9;
	for(int i=1000000;i>=0;i--)
	{
		f[i] = max( f[i],f[i+1] );
		ans = min( ans,f[i]+i );
	}
	cout << ans;
}

以上是关于CF1408D Searchlights(优化暴力)的主要内容,如果未能解决你的问题,请参考以下文章

CF1247D Power Products 暴力+优化

CF787D Legacy

CF701F String set queries (分块思想+暴力)

CF786B Legacy(线段树优化建图)

树状数组优化dp——cf985E经典

CF739E Gosha is hunting(dp+凸优化)