LG11011
首先注意到题目给定的矩形以及要求的子矩形的顶点坐标均为整数,且每条边都平行于一条坐标轴。可以得知无需考虑矩形旋转一定角度的情况,接下来就不难了。
一个子矩形要把所有点覆盖,则只需要把最小、最大的横、纵坐标覆盖即可(显然,其他横、纵坐标在两者之间,因此一定能覆盖)。在此基础上,每条边可以向外延伸一定长度,但是不能超过给定的矩形,因此可以计算出每条边的可伸长量,根据乘法原理,四条边的可伸长量的乘积即为答案。
时间复杂度 \(O(n)\),注意乘法时要及时取模防止溢出。
#include <iostream>
#include <cstdio>
#define int long long
#define MOD 1000000007
using namespace std;
int n,x1,y1,x2,y2,lx,rx,ly,ry,a,b;
signed main()
{
cin >> n >> x1 >> y1 >> x2 >> y2;
cin >> a >> b;
lx = rx = a;
ly = ry = b;
for( int i = 2 ; i <= n ; i ++ )
{
cin >> a >> b;
lx = min( lx , a );
rx = max( rx , a );
ly = min( ly , b );
ry = max( ry , b );
}
cout << max( lx - x1 + 1 , 0ll ) * max( x2 - rx + 1 , 0ll ) % MOD * max( ly - y2 + 1 , 0ll ) % MOD * max( y1 - ry + 1 , 0ll ) % MOD;
//与 0 取 max 能够判掉某个坐标的极值超出矩形范围的情况。
return 0;
}

浙公网安备 33010602011771号