有n个矩形,找出其中一个矩形的一个点,满足这个点至少包含在n-1个矩形内
处理一下前缀交,也就是矩形1-2的交矩形k, 再求矩形k与矩形3的交矩形。。。
a[i]是前缀交,b[i]是后缀交
假设p[i]这个矩形与其他矩形都没交矩形,那么就求a[i-1]与b[i+1]的交矩形K,相当于把p[i]扔了,如果K是一个矩形,那答案直接取K的左下角
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int mx = 200005;
struct node{
int lx,ly,rx,ry;
node operator +(const node b) const{
node tmp;
tmp.lx = max(lx, b.lx);
tmp.ly = max(ly, b.ly);
tmp.rx = min(rx, b.rx);
tmp.ry = min(ry, b.ry);
return tmp;
}
}p[mx], a[mx], b[mx];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d%d%d", &p[i].lx, &p[i].ly, &p[i].rx, &p[i].ry);
}
a[1] = p[1];
for (int i = 2; i <= n; i++) {
a[i] = a[i-1] + p[i];
}
b[n] = p[n];
for (int i = n-1; i >= 1; i--) {
b[i] = b[i+1] + p[i];
}
for (int i = 1; i <= n; i++) {
node ans;
if (i == 1) ans = b[2];
else if (i == n) ans = a[n-1];
else ans = a[i-1] + b[i+1];
if (ans.lx <= ans.rx && ans.ly <= ans.ry) {
printf("%d %d\n", ans.lx, ans.ly);
return 0;
}
}
return 0;
}