HDOJ 2478 Slides


维护次大和最大的左下角和右上角的坐标,再枚举抽出哪一个矩阵。。。

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
  
  
4 2
 

Source
 

#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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值