CF1408D Searchlights(优化暴力)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1408D Searchlights(优化暴力)相关的知识,希望对你有一定的参考价值。
有 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 cj−ai+1,要么让 b i b_i bi加上 d j − b i + 1 d_j-b_i+1 dj−bi+1
这相当于,当 a i a_i ai加上 x ∈ [ 0 , c j − a i ] x\\in[0,c_j-a_i] x∈[0,cj−ai]时, b i b_i bi至少要加上 d j − b i + 1 d_j-b_i+1 dj−bi+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(优化暴力)的主要内容,如果未能解决你的问题,请参考以下文章