• UVALive 6889 City Park 并查集


    City Park

    题目连接:

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=122283#problem/F

    Description

    Porto is blessed with a beautiful city park. The park, in
    the western section of the city, borders the Atlantic Ocean.
    It has great lawns, small forests, plenty of flowerbeds, a
    variety of ponds, and, in all, lots of points of interest.
    Porto families love the park and flock to in on weekends
    and holidays.
    With such multitudes, it is hard work to keep the
    lawns in good shape. In order to control the movements
    of the crowd, the engineers of the municipality designed
    a system of paths connecting points of interest. These
    paths are built with large rectangular shale stones from the nearby Milh´aria quarry. Using sophisticated
    location systems, the engineers were able to lay the stones perfectly aligned with the north-south
    direction (and hence also with the east-west direction). Stones linking one from one point of interest to
    another touch each other, forming a contiguous stoned surface, and do not touch any stones belonging
    to any other stoned surface.
    The “defend our park” movement wants to stage a demonstration in the park to publicise their
    cause. Since they do not want to harm the lawns, they must stage the demonstration in one of those
    stoned surfaces. In order to summon as many supporters as possible, but not too many, they need to
    find out the area of the stoned surface with largest area.
    Given the locations and dimensions of stones in the park, compute the area of the stoned surface
    with the largest area.

    Input

    The input file contains several test cases, each of them as described below.
    The first line contains one positive integer, N, representing the number of rectangular stones. N
    lines follow, each one describing the location and dimensions of a stone, by four integers, X, Y , W,
    H, where (X, Y ) are the coordinates of the location of the lower left corner the stone, W is its length
    along the x-axis, and H is its length along the y-axis.
    Constraints:
    0 < N ≤ 50 000 Number of stones.
    0 < W ≤ 500, 0 < H ≤ 500 Dimensions of stones.
    It is guaranteed that, for the given inputs, the coordinates of the stone corners can be handled using
    normal 32-bit signed integers, as well as the total area of any stoned surface. For every pair of distinct
    stones, the area of the intersection of the two rectangles that represent them in the park is zero (i.e.,
    there are no overlaps).

    Output

    For each test case, write to the output a single line with an integer: the area of the stoned surface with
    largest area.
    Sample Output Explanation
    The following figure represents the configuration of stones described in the sample input.
    There are 4 stoned surfaces: one made up by stones 3 and 4, on the left, with area 16; another,
    made up by stones 7 and 1, with area 20; a third one, below the previous, made up by stones 0, 2 and
    6, with area 15; and the one on the right, made up by stone 5 only, with area 16. The largest area is
    20.

    Sample Input

    8
    14 1 2 2
    16 9 1 5
    11 3 5 2
    3 4 2 5
    5 9 3 2
    21 3 2 8
    13 2 1 1
    13 8 3 5

    Sample Output

    20

    Hint

    题意

    在平面上给你n个矩形,你需要找到最大的连通块面积是多少,两个矩形只要点相接触,就连通

    保证矩形之间不会重叠

    题解:

    因为两个点相邻,就连通嘛,那就按照x轴排个序,然后并茶几合并一下。

    y轴排个序,并茶几合并一下就好了。

    代码里面的random是拿来卖萌的-.-

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 2100050;
    int fa[maxn],n;
    long long val[maxn];
    long long val2[maxn];
    struct node{
        int x0,y0,x1,y1,x2,y2,x3,y3,x4,y4;
        int id;
        node(int X0,int Y0,int X1,int Y1,int X2,int Y2,int X3,int Y3,int X4,int Y4,int ID):x0(X0),y0(Y0),x1(X1),y1(Y1),x2(X2),y2(Y2),x3(X3),y3(Y3),x4(X4),y4(Y4),id(ID){};
    };
    vector<node> op;
    bool cmp1(node a,node b){
        if(a.x0==b.x0)return a.y0<b.y0;
        return a.x0<b.x0;
    }
    bool cmp2(node a,node b){
        if(a.y0==b.y0)return a.x0<b.x0;
        return a.y0<b.y0;
    }
    bool cmp3(node a,node b){
        if(a.y0==b.y0)return a.x0>b.x0;
        return a.y0<b.y0;
    }
    bool cmp4(node a,node b){
        if(a.x0==b.x0)return a.y0>b.y0;
        return a.x0<b.x0;
    }
    int fi(int x){
    	if(fa[x]==x)return x;
    	fa[x]=fi(fa[x]);
    	return fa[x];
    }
    void uni(int x,int y){
    	int p=fi(x),q=fi(y);
    	if(p==q)return;
    	fa[p]=q;
    }
    bool check(node aa,node bb){
        if(aa.x0==bb.x0&&aa.y0==bb.y0)return true;
        if(aa.x1==bb.x1){
            if(aa.y1<=bb.y1&&aa.y3>=bb.y1)return true;
            if(aa.y1<=bb.y3&&aa.y3>=bb.y3)return true;
        }
        if(aa.x2==bb.x2){
            if(aa.y1<=bb.y1&&aa.y3>=bb.y1)return true;
            if(aa.y1<=bb.y3&&aa.y3>=bb.y3)return true;
        }
        if(aa.x1==bb.x2){
            if(aa.y1<=bb.y1&&aa.y3>=bb.y1)return true;
            if(aa.y1<=bb.y3&&aa.y3>=bb.y3)return true;
        }
        if(aa.x2==bb.x1){
            if(aa.y1<=bb.y1&&aa.y3>=bb.y1)return true;
            if(aa.y1<=bb.y3&&aa.y3>=bb.y3)return true;
        }
        if(aa.y1==bb.y1){
            if(aa.x1<=bb.x1&&aa.x2>=bb.x1)return true;
            if(aa.x1<=bb.x2&&aa.x2>=bb.x2)return true;
        }
        if(aa.y1==bb.y3){
            if(aa.x1<=bb.x1&&aa.x2>=bb.x1)return true;
            if(aa.x1<=bb.x2&&aa.x2>=bb.x2)return true;
        }
        if(aa.y3==bb.y3){
            if(aa.x1<=bb.x1&&aa.x2>=bb.x1)return true;
            if(aa.x1<=bb.x2&&aa.x2>=bb.x2)return true;
        }
        if(aa.y3==bb.y1){
            if(aa.x1<=bb.x1&&aa.x2>=bb.x1)return true;
            if(aa.x1<=bb.x2&&aa.x2>=bb.x2)return true;
        }
        return false;
    }
    void work(){
        srand(time(NULL));
        op.clear();
        memset(val,0,sizeof(val));
        memset(val2,0,sizeof(val2));
        for(int i=0;i<maxn;i++)fa[i]=i;
        for(int i=0;i<maxn;i++)val[i]=0;
        for(int i=1;i<=n;i++){
            int xx,yy,ll,rr;
            scanf("%d%d%d%d",&xx,&yy,&ll,&rr);
            op.push_back(node(xx,yy,xx,yy,xx+ll,yy,xx+ll,yy+rr,xx,yy+rr,i));
            op.push_back(node(xx+ll,yy,xx,yy,xx+ll,yy,xx+ll,yy+rr,xx,yy+rr,i));
            op.push_back(node(xx,yy+rr,xx,yy,xx+ll,yy,xx+ll,yy+rr,xx,yy+rr,i));
            op.push_back(node(xx+ll,yy+rr,xx,yy,xx+ll,yy,xx+ll,yy+rr,xx,yy+rr,i));
            val[i]=1ll*ll*rr;
        }
        long long ans = 0;
    
        sort(op.begin(),op.end(),cmp1);
        for(int i=0;i<op.size()-1;i++){
            if(check(op[i],op[i+1]))
                        uni(op[i].id,op[i+1].id);
        }
        sort(op.begin(),op.end(),cmp2);
        for(int i=0;i<op.size()-1;i++){
            if(check(op[i],op[i+1]))
                        uni(op[i].id,op[i+1].id);
        }
        sort(op.begin(),op.end(),cmp3);
        for(int i=0;i<op.size()-1;i++){
            if(check(op[i],op[i+1]))
                        uni(op[i].id,op[i+1].id);
        }
        sort(op.begin(),op.end(),cmp4);
        for(int i=0;i<op.size()-1;i++){
            if(check(op[i],op[i+1]))
                        uni(op[i].id,op[i+1].id);
        }
        random_shuffle(op.begin(),op.end());
        for(int i=0;i<op.size()-1;i++){
            if(check(op[i],op[i+1]))
                        uni(op[i].id,op[i+1].id);
        }
        for(int i=1;i<=n;i++)
        {
            fa[i]=fi(i);
            val2[fa[i]]+=val[i];
            ans=max(val2[fa[i]],ans);
        }
        cout<<ans<<endl;
    }
    int main(){
        while(scanf("%d",&n)!=EOF){
            work();
        }
    }
  • 相关阅读:
    C语言数据结构(二)
    面向对象
    Java集合类汇总
    C语言运算符优先级和结合性
    c语言数据结构(一)
    浏览器间bug
    HTTP协议中的1xx,2xx,3xx,4xx,5xx状态码分别表示什么,列举常见错误码及含义
    SSL是啥?
    {转}大公司里怎样开发和部署前端代码?
    浏览器 HTTP 缓存原理分析
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5677532.html
Copyright © 2020-2023  润新知