地址:http://codeforces.com/contest/1028/problem/C
n个矩形区域相交一定是个矩形,所以相交矩形的左下点x1 = max(x1_i,x1);y1 = max(y1_i,y1);
右上点是x2 = min(x2_i,x2);y2 = min(y2_i,y2);
因为是至少n - 1个矩形,直接枚举没有的那个矩形即可;
先预处理1…i的相交矩形,再预处理i….n的相交矩形;
最后直接找出1..i与i….n的相交矩形
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 10;
int a1[N],b1[N],c1[N],d1[N];
int a2[N],b2[N],c2[N],d2[N];
int ans[N][4];
int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n;++i)
{
scanf("%d %d %d %d",&ans[i][0],&ans[i][1],&ans[i][2],&ans[i][3]);
}
a1[0] = -inf;b1[0] = -inf;
c1[0] = inf;d1[0] = inf;
for(int i = 1;i <= n;++i)
{
a1[i] = max(a1[i - 1],ans[i][0]);
b1[i] = max(b1[i - 1],ans[i][1]);
c1[i] = min(c1[i - 1],ans[i][2]);
d1[i] = min(d1[i - 1],ans[i][3]);
}
a2[n + 1] = -inf;b2[n + 1] = -inf;
c2[n + 1] = inf;d2[n + 1] = inf;
for(int i = n;i >= 1;--i)
{
a2[i] = max(a2[i + 1],ans[i][0]);
b2[i] = max(b2[i + 1],ans[i][1]);
c2[i] = min(c2[i + 1],ans[i][2]);
d2[i] = min(d2[i + 1],ans[i][3]);
}
int a,b,c,d;
for(int i = 1;i <= n;++i)
{
a = max(a1[i - 1],a2[i + 1]);
b = max(b1[i - 1],b2[i + 1]);
c = min(c1[i - 1],c2[i + 1]);
d = min(d1[i - 1],d2[i + 1]);
if(a <= c && b <= d){
cout << a << " " << b << endl;
break;
}
}
return 0;
}