zoukankan      html  css  js  c++  java
  • 【 AIM Tech Round 5 (rated, Div. 1 + Div. 2) C】Rectangles

    【链接】 我是链接,点我呀:)
    【题意】

    给你n个矩形。 让你找出一个点(x,y) 使得这个点在其中至少(n-1)个矩形中。

    【题解】

    若干个矩形交在一起的话。 它们所有的公共区域也会是一个矩形。 这个矩形的左下角坐标为$(max(x1_i),max(y1_i))$ 这个矩形的右上角坐标为$(min(x2_i),min(y2_i))$ 题目要求的是在至少n-1个矩形中。 显然如果这个点在n个矩形中的话,也一定就在n-1个矩形中。 所以转化为求n-1个矩形的公共区域中的任意一点(任意输出就好) 我们可以枚举第i个矩形不考虑。只考虑1..i-1和i+1..n这n-1个矩形。 用上面的方法求出它们的公共区域即可。 (用个前缀和O(n)预处理就好

    【代码】

    #include <bits/stdc++.h>
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define all(x) x.begin(),x.end()
    #define pb push_back
    #define lson l,mid,rt<<1
    #define ri(x) scanf("%d",&x)
    #define rl(x) scanf("%lld",&x)
    #define rs(x) scanf("%s",x)
    #define rson mid+1,r,rt<<1|1
    using namespace std;
    
    const double pi = acos(-1);
    const int dx[4] = {0,0,1,-1};
    const int dy[4] = {1,-1,0,0};
    const int N = 2e5;
    const int INF = 1e9+7;
    
    struct abc{
        int x1,x2;
        int y1,y2;
    }a[N+10];
    
    int premax[N+10][2],premin[N+10][2],aftmax[N+10][2],aftmin[N+10][2];
    int n;
    
    int main(){
    	#ifdef LOCAL_DEFINE
    	    freopen("rush_in.txt", "r", stdin);
    	#endif
        ri(n);
        rep1(i,1,n) ri(a[i].x1),ri(a[i].y1),ri(a[i].x2),ri(a[i].y2);
        rep1(i,0,1) premax[0][i] = -INF,premin[0][i] = INF;
        rep1(i,0,1) aftmax[n+1][i] = -INF,aftmin[n+1][i] = INF;
        rep1(i,1,n){
            premax[i][0] = max(premax[i-1][0],a[i].x1);
            premax[i][1] = max(premax[i-1][1],a[i].y1);
            premin[i][0] = min(premin[i-1][0],a[i].x2);
            premin[i][1] = min(premin[i-1][1],a[i].y2);
        }
        rep2(i,n,1){
            aftmax[i][0] = max(aftmax[i+1][0],a[i].x1);
            aftmax[i][1] = max(aftmax[i+1][1],a[i].y1);
            aftmin[i][0] = min(aftmin[i+1][0],a[i].x2);
            aftmin[i][1] = min(aftmin[i+1][1],a[i].y2);
        }
        rep1(i,1,n){
            int x1 = max(premax[i-1][0],aftmax[i+1][0]);
            int y1 = max(premax[i-1][1],aftmax[i+1][1]);
            int x2 = min(premin[i-1][0],aftmin[i+1][0]);
            int y2 = min(premin[i-1][1],aftmin[i+1][1]);
            if (x1<=x2 && y1<=y2){
                cout<<x1<<' '<<y1<<endl;
                return 0;
            }
        }
    	return 0;
    }
    
  • 相关阅读:
    HDU 2888 Check Corners (模板题)【二维RMQ】
    POJ 3264 Balanced Lineup(模板题)【RMQ】
    poj 3368 Frequent values(经典)【RMQ】
    SPOJ RPLN (模板题)(ST算法)【RMQ】
    UVA 796 Critical Links(模板题)(无向图求桥)
    UVA 315 Network (模板题)(无向图求割点)
    POJ 2029 Get Many Persimmon Trees (模板题)【二维树状数组】
    poj 3067 Japan 【树状数组】
    POJ 2481 Cows 【树状数组】
    POJ 1195 Mobile phones【二维树状数组】
  • 原文地址:https://www.cnblogs.com/AWCXV/p/9545909.html
Copyright © 2011-2022 走看看