第一次写计算几何,ac,感动。

不过感觉自己的代码还可以美化一下。

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5128

题意:

在一个坐标系中,有n个点,从中找到两个互不touch,互不cross的两个矩形(边要和坐标轴平行),使得面积最大。

思路:

枚举每个点,n的四次方,这题有个坑点是“回型矩阵”,是真的坑,然后discuss区里说的十字形矩阵是骗人的。

每次对枚举的四个点进行check,如果两个矩阵的四个点相互不在对方的矩阵中,那么这组就是合法的。

如果(这四个点组成一个回型矩阵),那么上面判check的结果就是,*一个矩阵的四个点在另一个矩阵中,而另一个矩阵没有*。

注意**中的条件是必要条件,还有判断一下,这个回型矩阵中,有没有边重合。

ac代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <list>
#include <iterator>
#include <cmath>
using namespace std; #define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue #define Pll pair<ll,ll>
#define Pii pair<int,int> #define fi first
#define se second #define OKC ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef long long ll;
typedef unsigned long long ull; /*-----------------show time----------------*/
int n;
int l[],r[];
int mp[][];
bool check(int i,int j,int x,int y)
{
int e[][];
e[][] = l[i],e[][] = r[i];
e[][] = l[i],e[][] = r[j];
e[][] = l[j],e[][] = r[j];
e[][] = l[j],e[][] = r[i];
int le1 = min(l[x],l[y]),le2 = max(l[x],l[y]);
int ri1 = min(r[x],r[y]),ri2 = max(r[x],r[y]);
if(mp[l[x]][r[y]]==||mp[l[y]][r[x]]==)return false;
for(int w=; w<=; w++)
{
if(mp[e[w][]][e[w][]]==)return false;
if(e[w][]>=le1 && e[w][] <= le2 && e[w][]>=ri1 && e[w][] <= ri2)
return false;
}
return true;
}
/*
bool tepan(int i,int j,int q,int w)
{
//1
int l1 = min(l[i],l[j]),l2 = max(l[i],l[j]);
int r1 = min(r[i],r[j]),r2 = max(r[i],r[j]); //2 int x1 = min(l[q],l[w]),x2 = max(l[q],l[w]);
int y1 = min(r[q],r[w]),y2 = max(r[q],r[w]); if(y1<r1 && y2>r2 && l1<x1 && l2 > x2)return true;
if(y1>r1 && y2<r2 && l1>x1 && l2 < x2)return true;
return false;
}
*/
int main(){
while(~scanf("%d", &n)&&n){
memset(mp,,sizeof(mp));
for(int i=; i<=n; i++){
scanf("%d%d", &l[i],&r[i]);
mp[l[i]][r[i]] = ;
}
int ans = ;
for(int i=; i<=n; i++){
for(int j=; j<=n; j++){
for(int q = ; q<=n; q++){
for(int w = ; w<=n; w++){ if(check(i,j,q,w)&&check(q,w,i,j)){
//if(tepan(i,j,q,w) ||tepan(q,w,i,j))continue;
if(l[i]==l[j]||r[i]==r[j]||l[q]==l[w]||r[q]==r[w])continue;
int tmp = abs(l[i]-l[j]) * abs(r[i] - r[j]) + abs(l[q]-l[w]) * abs(r[q] - r[w]) ;
ans = max (ans,tmp);
}
else if(check(i,j,q,w))
{
if(l[i]==l[j]||r[i]==r[j]||l[q]==l[w]||r[q]==r[w])continue;
if(mp[l[q]][r[w]]==||mp[l[w]][r[q]]==)continue;
int tmp = abs(l[i]-l[j]) * abs(r[i] - r[j]) ;
// int tmp = max(tmp,)
int e[][];
e[][] = l[q],e[][] = r[q];
e[][] = l[q],e[][] = r[w];
e[][] = l[w],e[][] = r[w];
e[][] = l[w],e[][] = r[q];
int le1 = min(l[i],l[j]),le2 = max(l[i],l[j]);
int ri1 = min(r[i],r[j]),ri2 = max(r[i],r[j]);
int flag = ;
for(int s = ; s<=;s++){ //用于判断回字型的合法,里面完全包于
if(e[s][]==le1||e[s][]==le2||e[s][]==ri1||e[s][]==ri1){
flag = ;
break;
}
}
if(flag)ans = max (ans,tmp);
/*
if(tmp==3) //样例一自己跑出3.发现了回型矩阵的奥秘;
{
cout<<"----------------"<<endl;
cout<<"zhe;"<<i<<" "<<j<<" "<<q<<" "<<w<<endl;
int e[5][4];
e[1][1] = l[i],e[1][2] = r[i];
e[2][1] = l[i],e[2][2] = r[j];
e[3][1] = l[j],e[3][2] = r[j];
e[4][1] = l[j],e[4][2] = r[i];
int le1 = min(l[q],l[w]),le2 = max(l[q],l[w]);
int ri1 = min(r[q],r[w]),ri2 = max(r[q],r[w]);
debug(le1);debug(le2);debug(ri1);debug(ri2);
}
*/
} }}}} //这是四重循环的右括号
if(ans == )puts("imp");
else printf("%d\n",ans);
}
return ;
}

HDU5128

HDU - 5128The E-pang Palace+暴力枚举,计算几何的更多相关文章

  1. hdu 1172 猜数字(暴力枚举)

    题目 这是一道可以暴力枚举的水题. //以下两个都可以ac,其实差不多一样,呵呵 //1: //4 wei shu #include<stdio.h> struct tt { ],b[], ...

  2. hdu 4445 Crazy Tank (暴力枚举)

    Crazy Tank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. HDU 4770 Lights Against Dudely 暴力枚举+dfs

    又一发吐血ac,,,再次明白了用函数(代码重用)和思路清晰的重要性. 11779687 2014-10-02 20:57:53 Accepted 4770 0MS 496K 2976 B G++ cz ...

  4. HDU 4930 Fighting the Landlords(暴力枚举+模拟)

    HDU 4930 Fighting the Landlords 题目链接 题意:就是题中那几种牌型.假设先手能一步走完.或者一步让后手无法管上,就赢 思路:先枚举出两个人全部可能的牌型的最大值.然后再 ...

  5. HDU 4431 Mahjong (DFS,暴力枚举,剪枝)

    题意:给定 13 张麻将牌,问你是不是“听”牌,如果是输出“听”哪张. 析:这个题,很明显的暴力,就是在原来的基础上再放上一张牌,看看是不是能胡,想法很简单,也比较好实现,结果就是TLE,一直TLE, ...

  6. HDU 1270 小希的数表 (暴力枚举+数学)

    题意:... 析:我们可以知道,a1+a2=b1,那么我们可以枚举a1,那么a2就有了,并且a1+a3=b2,所以a3就有了,我们再从把里面的剩下的数两两相加,并从b数组中去掉, 那么剩下的最小的就是 ...

  7. hdu 5491 The Next(暴力枚举)

    Problem Description Let L denote the number of 1s in integer D’s binary representation. Given two in ...

  8. HDU 4462 Scaring the Birds (暴力枚举DFS)

    题目链接:pid=4462">传送门 题意:一个n*n的区域,有m个位置是能够放稻草人的.其余都是玉米.对于每一个位置(x,y)所放稻草人都有个作用范围ri, 即abs(x-i)+ab ...

  9. HDU 6351暴力枚举 6354计算几何

    Beautiful Now Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)T ...

随机推荐

  1. 考试安排查询脚本(CUP)

    去年热情高涨的时候心血来潮做了个简易的查询脚本,限于当时技术水平(菜),实现得不是很好,这几天终于想起来填坑了.环境依赖: brew install python3 pip3 install requ ...

  2. kafka集群跨双网段及多网段通信问题解决

    一.问题场景: 实际生产环境总存在很多kafka集群跨网段的问题.kafka集群可能存在多个网卡,对应多个网段.不同网段之间需要同时与集群通信,即跨网段生产消费问题. 二.解决方法:自定义listen ...

  3. 【iOS】更换证书遇到的问题

    今天给一个项目换证书的时候遇到了这个问题: Code Sign error: Provisioning profile does not match bundle identifier: The pr ...

  4. 基于zookeeper集群的云平台-配置中心的功能设计

    最近准备找工作面试,就研究了下基于zookeeper集群的配置中心. 下面是自己设想的关于开源的基于zookeeper集群的云平台-配置中心的功能设计.大家觉得哪里有问题,请提出宝贵的意见和建议,谢谢 ...

  5. Apache Flink 1.9 重大特性提前解读

    今天在 Apache Flink meetup ·北京站进行 Flink 1.9 重大新特性进行了讲解,两位讲师分别是 戴资力/杨克特,zhisheng 我也从看完了整个 1.9 特性解读的直播,预计 ...

  6. Ubuntu 执行chmod -R 777 / 挽救方法

    mgj怎么会有堪比rm -rf /*这样神奇的命令,本想着把当前目录下的权限改为777,没想到把整个/目录下全设成777了,直觉告诉我好像哪里有些不对劲,好在一顿xjb折腾最终弄好了,应该没啥大问题, ...

  7. 前端面试 js 你有多了解call,apply,bind?

    函数原型链中的 apply,call 和 bind 方法是 JavaScript 中相当重要的概念,与 this 关键字密切相关,相当一部分人对它们的理解还是比较浅显,所谓js基础扎实,绕不开这些基础 ...

  8. 如何选择合适的SSL证书类型

    网站安装SSL证书就可以将http升级为https加密模式,网站安装SSL证书因此成为一种趋势.如何为网站选择适合的SSL证书类型呢? SSL证书类型可分为2大类:1)按照验证方式分类2)按照支持域名 ...

  9. java虚拟机学习笔记(六)---垃圾收集算法

    主要讨论集中垃圾收集算法的思想及发展过程. 1.标记-清除法 最基础的收集算法是标记-清除法,算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,其标记过程 ...

  10. 怎么把PicPick设置成中文版?

    1.首先打开软件 2.在File文件中中点击能看到Program Options这一选项,单击打开 3.右下方有个Language选项,改成简体中文