题解:P11104 [ROI 2023] 监控 (Day 1)
因为最后的矩形的大小只受最上、最下的
我们先处理如何让最后矩形的左右间距小。我们先把
这张图中,
我们可以发现,现在这张图往左走
一直向左走。设
现在的左右距离为
我们继续往左走,当
我们可以发现规律,当从左往右第
我们现在还要求移动多少次。还是以左右为例。我们可以发现往左走,当
最后是代码。(代码里面写的是
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+5;
int h,w,k,n,r[maxn],c[maxn];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>h>>w>>n;
for(int i=1;i<=n;i++)cin>>r[i]>>c[i];
sort(r+1,r+1+n);
sort(c+1,c+1+n);
int R=r[n]-r[1]+1,C=c[n]-c[1]+1;
int u=0,s=0;
for(int i=n;i>=2;i--)
{
if(R==r[i-1]+(h-r[i]+1))
{
s=min(s,min(h-r[i]+1,r[i-1]));
}
else if(R>r[i-1]+(h-r[i]+1))
{
R=r[i-1]+(h-r[i]+1);
s=min(h-r[i]+1,r[i-1]);
}
}
for(int i=n;i>=2;i--)
{
if(C==c[i-1]+(w-c[i]+1))
{
u=min(u,min(w-c[i]+1,c[i-1]));
}
else if(C>c[i-1]+(w-c[i]+1))
{
C=c[i-1]+(w-c[i]+1);
u=min(w-c[i]+1,c[i-1]);
}
}
cout<<R*C<<' '<<s+u;
return 0;
}