并查集 - UVALive 6889 City Park

简介: City Park  Problem's Link:  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=129725   Mean:  在网格中给你一些矩形,求最大连通块的面积。

City Park 

Problem's Link:  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=129725


 

Mean: 

在网格中给你一些矩形,求最大连通块的面积。

analyse:

由于题目保证了矩形不会相交,所以不用扫描线也可做。

先把所有的线段分为横向和纵向,然后排序,依次判断是否相邻,相邻就用并查集合并,最后再用并查集统计一下面积,取最大值即可。

Time complexity: O(N)

 

Source code: 

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-08-09-16.10
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

void scan( int & x)
{
      x = 0;
      char c = getchar();
      while( !( c >= '0' && c <= '9'  || c == '-')) { c = getchar(); }
      bool flag = 1;
      if( c == '-')
      {
            flag = 0; c = getchar();
      }
      while( c >= '0' && c <= '9')
      {
            x = x * 10 + c - '0'; c = getchar();
      }
      if( ! flag) { x =- x; }
}
void scan2( int & x , int & y) { scan( x ), scan( y );}
void scan3( int & x , int & y , int & z) { scan( x ), scan( y ), scan( z); }
/**************************************END     define***************************************/
const int MAXN = 50010;
int n , x , y , w , h , f [ MAXN ], area [ MAXN ], answer [ MAXN ];
struct L {
      int x , l , r , id;
      L( int a , int b , int c , int d) : x( a ), l(b ), r( c ), id( d) {}
      bool operator <( const L & a) const { return x == a . x ? l < a . l: x < a . x ;}
};
vector < L > L1 , L2;
int Find( int x) { return f [ x ] == x ? x: f [ x ] = Find( f [ x ]); }

void work( int si , vector < L > & LL) {
      int a ,b , j = 1;
      for( int i = 0; i < si; i = j , ++ j) {
            while( j < si && LL [ j ]. x == LL [ i ]. x) ++ j;
            int li = LL [ i ]. r , id = LL [ i ]. id;
            for( int k = i + 1; k < j; ++ k) {
                  if( LL [ k ]. l <= li) {
                        a = Find( id ),b = Find( LL [ k ]. id);
                        if( a !=b) f [ a ] =b;
                  }
                  if( LL [ k ]. r > li) li = LL [ k ]. r , id = LL [ k ]. id;
            }
      }
}
int main()
{
      ios_base :: sync_with_stdio( false);
      cin . tie( 0);
      while( ~ scanf( "%d" , &n))
      {
            L1 . clear (), L2 . clear();
            for( int i = 0; i <n; ++ i)
            {
                  scan2( x , y ), scan2( w , h);
                  L1 . push_back( L( x , y , y + h , i));
                  L1 . push_back( L( x + w , y , y + h , i));
                  L2 . push_back( L( y , x , x + w , i));
                  L2 . push_back( L( y + h , x , x + w , i));
                  f [ i ] = i , area [ i ] = w * h , answer [ i ] = 0;
            }
            sort( L1 . begin (), L1 . end());
            sort( L2 . begin (), L2 . end());
            work( L1 . size (), L1);
            work( L2 . size (), L2);
            int ans = INT_MIN;
            for( int i = 0; i <n; ++ i) { answer [ Find( i )] += area [ i ]; }
            for( int i = 0; i <n; ++ i) ans = max( ans , answer [ i ]);
            cout << ans << endl;
      }
      return 0;
}
/*

*/

 

目录
相关文章
|
7月前
|
存储 人工智能 Oracle
initialCapacity
initialCapacity是Java中的一个概念,指的是类初始化时分配的内存大小。在Java中,当创建一个对象时,会根据该对象的类型和需要存储的数据量来分配一定大小的内存空间。这个大小就是initialCapacity。initialCapacity可以通过构造函数或静态代码块来设置。
88 2
Leetcode 24.Swap Nodes in Pairs
 给你一个链表,交换相邻两个节点,例如给你 1->2->3->4,输出2->1->4->3。   我代码里在head之前新增了一个节点newhead,其实是为了少写一些判断head的代码。
41 0
|
C++
【PAT甲级 - C++题解】1113 Integer Set Partition
【PAT甲级 - C++题解】1113 Integer Set Partition
78 0
LeetCode 86. Partition List
给定链表和值x,对其进行分区,使得小于x的所有节点都在大于或等于x的节点之前. 您应该保留两个分区中每个分区中节点的原始相对顺序.
80 0
LeetCode 86. Partition List
html+css实战167-opacity
html+css实战167-opacity
108 0
html+css实战167-opacity
|
编解码 分布式计算 Hadoop
Spark HadoopRdd partition的开始位置计算
- 源码分析Spark HadoopRDD是如何读取HDFS上的文件 - 分析HadoopRDD预分区的计算方式,非首个分区的开始位置计算
1134 0