AIM Tech Round 5 (rated, Div. 1 + Div. 2) C Rectangles

地址: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;
}

猜你喜欢

转载自blog.csdn.net/qq_36386435/article/details/82378887