codeforces 1028C Rectangles (模拟)

题目:给n个矩形,让你随便输出一个能被至少n-1个矩形覆盖住的整数点坐标。

思路:拿过题来就写树状数组,写着写着突然感觉线段树更好维护些 emmm    然后快写完突然发现啥都不用也能做,智障阿,直接模拟就行了。。

#include <bits/stdc++.h>
using namespace std;
#define inf 1e9
const int maxn=132675;
struct node{
    int x,xx,y,yy;
}a[maxn],suf[maxn],pre[maxn];
int n;
int main()
{
    scanf("%d",&n);
    int cnt=0;
    for(int i=1;i<=n;i++)
        scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].xx,&a[i].yy);
    pre[0].x=-inf;pre[0].y=-inf;
    pre[0].xx=inf;pre[0].yy=inf;
    for(int i=1;i<=n;i++)
    {
        pre[i].x=max(pre[i-1].x,a[i].x);
        pre[i].y=max(pre[i-1].y,a[i].y);
        pre[i].xx=min(pre[i-1].xx,a[i].xx);
        pre[i].yy=min(pre[i-1].yy,a[i].yy);
    }
    suf[n+1].x=-inf;suf[n+1].y=-inf;
    suf[n+1].xx=inf;suf[n+1].yy=inf;
    for(int i=n;i>0;i--)
    {
        suf[i].x=max(suf[i+1].x,a[i].x);
        suf[i].y=max(suf[i+1].y,a[i].y);
        suf[i].xx=min(suf[i+1].xx,a[i].xx);
        suf[i].yy=min(suf[i+1].yy,a[i].yy);
    }
    int x,y,xx,yy;
    for(int i=1;i<=n;i++)
    {
        x=max(pre[i-1].x,suf[i+1].x);
        y=max(pre[i-1].y,suf[i+1].y);
        xx=min(pre[i-1].xx,suf[i+1].xx);
        yy=min(pre[i-1].yy,suf[i+1].yy);
        if(x<=xx&&y<=yy)
            break;
    }
    printf("%d %d\n",x,y);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/dllpXFire/article/details/82149809