​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 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;
}