http://poj.org/problem?id=3141 (题目链接)

题意

  给出平面上n个点,找出一个矩形,使边界上包含尽量多的点。

solution

  不难发现,除非所有输入点都在同一行或同一列上,最优矩形的4条边上都至少有一个点。这样的话,我们可以枚举四条边穿过的点,然后统计点数。

  考虑部分枚举,只枚举矩形上下界,用其它方法确定左右界。

  设一条竖线i,用left[i]表示竖线左边位于上下界上单点数(不统计位于该竖线上的点),on[i]和on2[i]表示竖线上位于上下边界之间的点数(on[i]不统计位于上下界上的点,而on2[i]要统计)。这样,当左右边界分别为i,j时,矩形边界上的点数为left[j]-left[i]+on[i]+on2[j]。当右边界j确定时,on[i]-left[i]应最大。

  枚举完上下边界后,我们花O(n)的时间按照从左到右的顺序for一遍所有的的点,计算left,on[i],on2[i],然后枚举右边界j,同时维护on[i]-left[i]的最大值。

代码:

// poj3141
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi 3.1415926535898
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; struct point {int x,y;}a[10010]; int y[10010],on[10010],on2[10010],L[10010],n; bool cmp(point a,point b) {return a.x<b.x;}
int main() {
int T=0;
while (scanf("%d",&n)!=EOF && n) {
T++;
printf("Case %d: ",T);
for (int i=0;i<n;i++) {scanf("%d%d",&a[i].x,&a[i].y);y[i]=a[i].y;}
sort(a,a+n,cmp);
sort(y,y+n);
int m=unique(y,y+n)-y;
if (m<=2) {printf("%d\n",n);continue;}
int ans=0;
for (int l=0;l<m;l++)
for (int r=l+1;r<m;r++) {
int ymin=y[l],ymax=y[r],k=0;
memset(L,0,sizeof(L));
for (int i=0;i<n;i++) {
if (i==0 || a[i].x!=a[i-1].x) {
k++;
on[k]=on2[k]=0;
L[k]=L[k-1]+on2[k-1]-on[k-1];
}
if (a[i].y>ymin && a[i].y<ymax) on[k]++;
if (a[i].y>=ymin && a[i].y<=ymax) on2[k]++;
}
int M=0;
for (int j=1;j<=k;j++) {
ans=max(ans,L[j]+on2[j]+M);
M=max(M,on[j]-L[j]);
}
}
printf("%d\n",ans);
}
return 0;
}

  

【poj3141】 Distant Galaxy的更多相关文章

  1. 【巧妙预处理系列+离散化处理】【uva1382】Distant Galaxy

    给出平面上的n个点,找一个矩形,使得边界上包含尽量多的点. [输入格式] 输入的第一行为数据组数T.每组数据的第一行为整数n(1≤n≤100):以下n行每行两个整数,即各个点的坐标(坐标均为绝对值不超 ...

  2. 分享50款 Android 移动应用程序图标【上篇】

    在这个移动程序流行的时代,持续增长的应用程序经济充满了商业机遇.任何对应用程序设计感兴趣的人,将会喜欢上这里的50个独特的 Android 应用程序图标.这些例子中的图标能够让应用程序的设计更具吸引力 ...

  3. 【转】图片缓存之内存缓存技术LruCache、软引用 比较

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...

  4. 【NOI2002】银河英雄传说(并查集)

    [NOI2002]银河英雄传说 题面 题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军 ...

  5. 【Android】1.2 创建Android模拟器

    分类:C#.Android.VS2015:  创建日期:2016-01-20 调试手机应用程序一般先用模拟器来实现,只是因为每次都发布到手机上调试太麻烦了.当应用程序在模拟器上调试没错后,再发布到手机 ...

  6. 【BZOJ2527】[Poi2011]Meteors 整体二分

    [BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...

  7. 【题解】UVA10140 [Prime Distance]

    [题解]UVA10140 Prime Distance 哈哈哈哈\(miller-rabbin\)水过去了哈哈哈 还能怎么办呢?\(miller-rabbin\)直接搞.枚举即可,还跑得飞快. 当然此 ...

  8. 【bzoj2527】[Poi2011]Meteors(树状数组(单点查询,区间修改)+整体二分)

    [bzoj2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...

  9. 【u010】银河英雄传说

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开 ...

随机推荐

  1. Java中run(), start(), join(), wait(), yield(), sleep()的使用

    run(), start(), join(), yield(), sleep() 这些是多线程中常用到的方法. run(): 每个Thread中需要实现的方法, 如果直接调用的话, 会是和单线程一样的 ...

  2. usb驱动开发22之驱动生命线

    我们总是很喜欢高潮,不是吗?那就好好对待她哦.我们来看一下linux中的高潮部分设备是怎么从Address进入Configured的. usb_set_configuration函数的代码就不贴了,可 ...

  3. 阿里云Center OS 6.2 Nginx 配置 SSL/TLS HTTPS配置

    1.通过https://www.startssl.com/ 免费SSL证书 STARTSSL 跟VeriSign一样,StartSSL(网址:http://www.startssl.com,公司名:S ...

  4. zepto笔记 001

    $(function(){}) 在页面加载完成后运行的方法 等于window.onload; $("#id"),$(this) 都和jquery一样, tap方法不能阻止事件冒泡, ...

  5. BASE64 编码和解码

    依赖jar: import org.apache.commons.codec.binary.Base64; BASE64和其他相似的编码算法通常用于转换二进制数据为文本数据,其目的是为了简化存储或传输 ...

  6. JAVA_集合框架虐我千百遍,虐也是一种进步

    1.Collection和Collections区别: Collection是java的一个集合接口,集合类的顶级接口 Collections是一个包装类(工具类),不能被实例化(由于其构造函数设为私 ...

  7. Scala函数式编程进阶

    package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...

  8. Android开发自学笔记(Android Studio1.3.1)—1.环境搭建

    一.引言 .Google推出的 毫无疑问,这个是它的最大优势,Android Stuido是Google推出,专门为Android"量身订做"的,是Google大力支持的一款基于I ...

  9. MC700 安装双系统

    2011年买的MBP MC700给老婆用了一段时间后,老婆还不习惯不了Mac OS或是虚拟机,要求必须给安装windows,无奈时隔四年后,只能重新尝试在MC700上用bootcamp安装Window ...

  10. java中的注解

    注解为程序提供信息,但不是程序本身的组成部分.注解有以下用途: * 为编译器提供信息,相当于C语言中的预编译指令 * 部署时处理,软件工具可以根据注解来生成代码,XML文件等,例如编写servlet, ...