• 【 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;
    }
    
  • 相关阅读:
    平面划分问题
    First Missing Positive
    Redis.conf
    Redis内存存储结构分析
    IE9崩溃解决办法
    未能正确加载包"visla Studio HTM Editor Package"(GUID={1B437B20F8FE11D2A5AE00104BCC7269})
    SQL SERVER 数据类型详解
    创建TIff虚拟打印机
    VS2010出现错误the operation could not be completed
    C# 基础知识 20101118
  • 原文地址:https://www.cnblogs.com/AWCXV/p/9545909.html
Copyright © 2020-2023  润新知