维护次大和最大的左下角和右上角的坐标,再枚举抽出哪一个矩阵。。。
Slides
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 923 Accepted Submission(s): 311
Problem Description
There are N slides lying on the table. Each of them is transparent and formed as a rectangle. In a traditional problem, one may have to calculate the intersecting area of these N slides. The definition of intersection area is such area which belongs to all of the slides.
But this time I want to take out some one of the N slides, so that the intersecting area of the left N-1 slides should be maximal. Tell me the maximum answer.
Input
The first line of the input contains a single integer T, the number of test cases, followed by the input data for each test case. The first line of each test case contains a single integer N (1 <= N <= 100000), the number of rectangles. Followed by N lines, each line contains four integers x1, y1, x2, y2 (-10000 <= x1 < x2 <= 10000, -10000 <= y1 < y2 <= 10000), pair (x1, y1) gives out the bottom-left corner and pair (x2, y2) gives out the top-right corner of the rectangle.
Output
There should be one line per test case containing the maximum intersecting area of corresponding N-1 slides.
Sample Input
2
2
0 0 2 2
1 1 2 2
3
0 0 2 2
1 0 3 2
1 1 3 3
Sample Output
Source
2008 Asia Regional Chengdu
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int n;
int Lx1,Lx2,Ly1,Ly2,Rx1,Rx2,Ry1,Ry2;
struct Point
{
int x,y;
}p[2][120000];
int main()
{
int T_T;
scanf("%d",&T_T);
while(T_T--)
{
scanf("%d",&n);
Lx1=Lx2=Ly1=Ly2=-INF;
Rx1=Rx2=Ry1=Ry2=INF;
for(int i=0;i<n;i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
p[0][i]=(Point){a,b};
p[1][i]=(Point){c,d};
if(a>Lx1)
{
Lx2=Lx1; Lx1=a;
}
else if(a>Lx2)
{
Lx2=a;
}
if(b>Ly1)
{
Ly2=Ly1; Ly1=b;
}
else if(b>Ly2)
{
Ly2=b;
}
if(c<Rx1)
{
Rx2=Rx1; Rx1=c;
}
else if(c<Rx2)
{
Rx2=c;
}
if(d<Ry1)
{
Ry2=Ry1; Ry1=d;
}
else if(d<Ry2)
{
Ry2=d;
}
}
int ans=0;
if(n==1)
{
printf("%d\n",ans);
continue;
}
for(int i=0;i<n;i++)
{
int LX,LY,RX,RY;
if(p[0][i].x==Lx1) LX=Lx2;
else LX=Lx1;
if(p[0][i].y==Ly1) LY=Ly2;
else LY=Ly1;
if(p[1][i].x==Rx1) RX=Rx2;
else RX=Rx1;
if(p[1][i].y==Ry1) RY=Ry2;
else RY=Ry1;
if(RY>LY&&RX>LX) ans=max(ans,(RY-LY)*(RX-LX));
}
printf("%d\n",ans);
}
return 0;
}