洛谷 P3079 [USACO13MAR]农场的画Farm Painting

题目描述

After several harsh winters, Farmer John has decided it is time to re-paint his farm. The farm consists of N fenced enclosures (1 <= N <= 50,000), each of which can be described by a rectangle in the 2D plane whose sides are parallel to the x and y axes. Enclosures may be contained within other enclosures, but no two fences intersect, so if two enclosures cover the same area of the 2D plane, one must be contained within the other.

FJ figures that an enclosure contained within another enclosure will not be visible to the outside world, so he only wants to re-paint enclosures that are themselves not contained within any other enclosures. Please help FJ determine the total number of enclosures he needs to paint.

经过几个严冬,农场主约翰决定是重新粉刷农场的时候了。该农场由nn个围栏围成(1<=n=500001<=n=50000),每一个都可以用二维平面上的矩形来描述,其两侧平行于x和y轴。牛圈可能包含在其他牛圈中,但没有两个栅栏相交(不同牛圈的边不会有接触)。因此如果两个牛圈覆盖了二维平面的同一区域,那么一个必须包含在另一个内。

FJ知道,被其他牛圈包含的牛圈是不会被外面的人看到的。众所周知,FJ非常懒,所以他只想刷露在外面的牛圈,请帮助他求出总共需要刷的牛圈的个数。

输入输出格式

输入格式:

 

  • Line 1: The number of enclosures, N.

  • Lines 2..1+N: Each line describes an enclosure by 4 space-separated integers x1, y1, x2, and y2, where (x1,y1) is the lower-left corner of the enclosure and (x2,y2) is the upper-right corner. All coordinates are in the range 0..1,000,000.

第一行 一个数,牛圈的总数nn

第二到n+1n+1行 每行四个数,起点坐标x1,y1x1,y1和终点坐标x2,y2x2,y2

 

输出格式:

 

  • Line 1: The number of enclosures that are not contained within other enclosures.

FJ总共需要刷的牛圈的个数

 

输入输出样例

输入样例#1: 复制
3 
2 0 8 9 
10 2 11 3 
4 2 6 5 
输出样例#1: 复制
2 

说明

There are three enclosures. The first has corners (2,0) and (8,9), and so on.

Enclosure 3 is contained within enclosure 1, so there are two enclosures not contained within other enclosures.

思路:围栏i包含围栏j的必要条件:x1[j]>x2[i]

  也就是这样的:

然后还应该满足一下几个条件:

  x1[i]<x1[j];

  y1[i]<y1[j];

  x2[i]>x2[j];

  y2[i]>y2[j];

 所以就可以写出cpp了:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,L,R,ans;
struct nond{
    int x1,y1,x2,y2;
}v[50010];
int cmp(nond a,nond b){
    return a.x1<b.x1;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        v[i].x1=a;v[i].y1=b;v[i].x2=c;v[i].y2=d;
    }
    sort(v+1,v+1+n,cmp);ans=n;
    for(L=1,R=2;R<=n;R++){
        while(v[L].x2<=v[R].x1)    L++;
        for(int i=L;i<=R;i++)
            if(v[R].x1>v[i].x1&&v[R].y2<v[i].y2&&v[i].y1<v[R].y1&&v[i].x2>v[R].x2){ 
                ans--;break;
            }
    }
    cout<<ans;
}

 

posted @ 2018-01-07 14:23  一蓑烟雨任生平  阅读(318)  评论(0编辑  收藏  举报