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;
}
posted @ 2025-09-08 18:32  FormulaOne  阅读(8)  评论(0)    收藏  举报