標籤:枚舉 ons href bool force .com bre 部分 group
連結
[http://codeforces.com/group/1EzrFFyOc0/contest/1028/problem/C]
題意
給你n個矩形的左下角和右上方座標,問你至少包含在n-1個矩形的點的座標,有多個隨便輸出一個
分析
分別從前到後和從後到前枚舉矩形重疊的部分
分別有b[i]和c[i]儲存從第一個到第i個的矩形重疊的小矩形和從後面倒著來第n個到第i個的矩形重疊的小矩形
任意兩個矩形重疊的小矩形左下和右上座標計算為
(max(a.xl,b.xl),max(a.yl,b.yl)) 就是交矩形的左下角座標。
(min(a.xr,b.xr),min(a.yr,b.yr)) 就是交矩形的右上方座標。
然後枚舉去掉n個中的一個是否能構成矩形如果可以直接輸出左下角座標,否則繼續枚舉
代碼
#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=150000;ll inf=1e9+10;struct node{ ll xl,yl,xr,yr;}a[maxn],b[maxn],c[maxn],wo;bool jud(node g){ if(g.xl>g.xr||g.yl>g.yr) return 0; return 1;}int main(){ int n,i; ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); //freopen("in.txt","r",stdin); cin>>n; for(i=1;i<=n;i++) cin>>a[i].xl>>a[i].yl>>a[i].xr>>a[i].yr; b[0].xl=b[0].yl=-inf; b[0].xr=b[0].yr=inf; for(i=1;i<=n;i++){ b[i].xl=max(a[i].xl,b[i-1].xl); b[i].yl=max(a[i].yl,b[i-1].yl); b[i].xr=min(a[i].xr,b[i-1].xr); b[i].yr=min(a[i].yr,b[i-1].yr); } c[n+1].xl=c[n+1].yl=-inf; c[n+1].xr=c[n+1].yr=inf; for(i=n;i>=1;i--){ c[i].xl=max(a[i].xl,c[i+1].xl); c[i].yl=max(a[i].yl,c[i+1].yl); c[i].xr=min(a[i].xr,c[i+1].xr); c[i].yr=min(a[i].yr,c[i+1].yr); } if(jud(b[n-1])){ cout<<b[n-1].xl<<‘ ‘<<b[n-1].yl<<endl; } else if(jud(c[2])){ cout<<c[2].xl<<‘ ‘<<c[2].yl<<endl; } else{ for(i=2;i<n;i++){ wo.xl=max(b[i-1].xl,c[i+1].xl); wo.yl=max(b[i-1].yl,c[i+1].yl); wo.xr=min(b[i-1].xr,c[i+1].xr); wo.yr=min(b[i-1].yr,c[i+1].yr); if(jud(wo)) break; } cout<<wo.xl<<‘ ‘<<wo.yl<<endl; } return 0;}
C. Rectangles