• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

【AIMTechRound5(rated,Div.1+Div.2)C】Rectangles

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

给你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;
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C语言中的神兽strdup发布时间:2022-07-13
下一篇:
C#3.0语法新特性集合发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap