你说得对,但是红绿绿紫。
Idea
怎么样才能在一个以 (a,b) 为左上,(c,d) 为左下的顶点组成的矩形中存在点 (e,f) 呢?显然要满足 a≤e≤c 且 d≤f≤b。
怎么样才能在一个以 (a,b) 为左上,(c,d) 为左下的顶点组成的矩形中存在点 (e,f) 和 (g,h) 呢?显然要满足 a≤min(e,g)≤max(e,g)≤c 且 d≤min(f,h)≤max(f,h)≤b。
然后对于本题的每一个点都有这样的条件。
推广一下结论:要满足在一个以 (a,b) 为左上,(c,d) 为左下的顶点组成的矩形中存在点 (x1,y1)(x2,y2)⋯(xn,yn),则要有 a≤min{x}≤max{x}≤c 且 d≤min{y}≤max{y}≤b。
然后因为还要满足以 (a,b) 为左上,(c,d) 为左下的顶点组成的矩形是以 (p,q) 为左上,(s,t) 为左下的顶点组成的矩形的子矩形(其实就是题意),所以要求变为 p≤a≤min{x}≤max{x}≤c≤s 且 t≤d≤min{y}≤max{y}≤b≤q。
不难发现 a 的有 min{x}−p+1 种,b 有 q−max{y}+1 种,c 有 s−max{x}+1 种,d 有 min{y}−t+1 种取值,由乘法原理把它们相乘就是答案。
Code
using namespace std;
int n,a,b,c,d,e,f,g,h;
long long ans;
int main(){
scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);
e=-2147483647;
f=2147483647;
g=-2147483647;
h=2147483647;
for(int i=1,j,k;i<=n;i++){
scanf("%d%d",&j,&k);
e=max(e,j);
f=min(f,j);
g=max(g,k);
h=min(h,k);
}
ans=1ll*(c-e+1)*(f-a+1)%1000000007;
ans=ans*(b-g+1)%1000000007;
ans=ans*(h-d+1)%1000000007;
printf("%lld\n",ans);
return 0;
}