热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Bzoj1185最小矩阵覆盖[旋转卡壳+凸包+处理[0]情况]

题目链接题目大意:就是给你若干个点用一个最小的矩形把这些点覆盖掉就是给你若干个点用一个最小的矩形把这些点覆盖掉就是给你若干个点用一个最小的矩形把这些点覆盖掉解题思路&

题目链接



题目大意:
就是给你若干个点用一个最小的矩形把这些点覆盖掉就是给你若干个点用一个最小的矩形把这些点覆盖掉



解题思路:
1.首先很明显我们可以对这些点求一个凸包,那么答案的矩形的一定是卡在凸包外面的1.首先很明显我们可以对这些点求一个凸包,那么答案的矩形的一定是卡在凸包外面的1.,
2.我们手动模一下就是逐渐增加凸包上面的点数,去看一下最小的矩形覆盖情况,就是矩形的一条边有两个点在上面就是和凸多边形一条边重合,其他三条边就卡在其他三个点上面。2.我们手动模一下就是逐渐增加凸包上面的点数,去看一下最小的矩形覆盖情况,就是矩形的一条边有两个点在上面就是和凸多边形一条边重合,其他三条边就卡在其他三个点上面。2.,,,
3.那么我们就可以O(n)枚举一下矩形卡着哪条边,我们通过用发现up点和bottem围成的三角形是一个单峰函数。left和right点的在bottom处的投影也是一个凹函数3.那么我们就可以O(n)枚举一下矩形卡着哪条边,我们通过用发现up点和bottem围成的三角形是一个单峰函数。left和right点的在bottom处的投影也是一个凹函数3.O(n),upbottemleftrightbottom



在这里插入图片描述



#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mid ((l + r) >> 1)
#define Lson rt <<1, l , mid
#define Rson rt <<1|1, mid &#43; 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define _for(i,a,b) for( int i &#61; (a); i <(b); &#43;&#43;i)
#define _rep(i,a,b) for( int i &#61; (a); i <&#61; (b); &#43;&#43;i)
#define for_(i,a,b) for( int i &#61; (a); i >&#61; (b); -- i)
#define rep_(i,a,b) for( int i &#61; (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define f first
#define s second
using namespace std;
const int maxn &#61; 1e5 &#43; 10;
const double eps &#61; 1e-10;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
struct Point//点或向量
{double x, y;Point() {}Point(double x, double y) :x(x), y(y) {}
};
typedef Point Vector;
double minsqr &#61; 1e12;
int n;
Point ploy[maxn], sta[maxn], ans[10];
int dcmp(double x)//精度三态函数(>0,<0,&#61;0)
{if (fabs(x) < eps)return 0;else if (x > 0)return 1;return -1;
}
double Dot(Vector a, Vector b)//内积
{return a.x*b.x &#43; a.y*b.y;
}
Vector operator &#43; (Vector a, Vector b)//向量加法
{return Vector(a.x &#43; b.x, a.y &#43; b.y);
}
Vector operator - (Vector a, Vector b)//向量减法
{return Vector(a.x - b.x, a.y - b.y);
}
Vector operator * (Vector a, double p)//向量数乘
{return Vector(a.x*p, a.y*p);
}
Vector operator / (Vector a, double p)//向量数除
{return Vector(a.x / p, a.y / p);
}
double Distance(Point a, Point b)//两点间距离
{return sqrt((a.x - b.x)*(a.x - b.x) &#43; (a.y - b.y)*(a.y - b.y));
}
bool operator &#61;&#61; (const Point &a, const Point &b)//向量相等
{return dcmp(a.x - b.x) &#61;&#61; 0 && dcmp(a.y - b.y) &#61;&#61; 0;
}bool operator<(Point a,Point b)
{if(!dcmp(a.y-b.y)) return a.x<b.x;return a.y<b.y;
}double Cross(Vector a, Vector b)//外积
{return a.x*b.y - a.y*b.x;
}double DistanceToLine(Point A, Point M, Point N)//点A到直线MN的距离,Error:MN&#61;0
{return fabs(Cross(A - M, A - N) / Distance(M, N));
}double relation(Point A, Point B, Point C)
{return Dot(B - A, C - A) / Distance(A,B) / Distance(A,B);
}
//求C在AB所在直线的垂足P坐标
Point pedal(Point A, Point B, Point C)
{double r &#61; relation(A,B,C);Point res;res.x &#61; A.x &#43; r * (B.x - A.x);res.y &#61; A.y &#43; r * (B.y - A.y);return res;
}bool cmp(Point a,Point b)
{if(!dcmp(a.x-b.x)) return a.y<b.y;return a.x<b.x;
}
int top &#61; 0;
void Graham() {sort(ploy,ploy&#43;n,cmp);for(int i &#61; 0; i < n; &#43;&#43; i) {while(top >&#61; 2 && dcmp(Cross(sta[top]-sta[top-1],ploy[i]-sta[top-1])) <&#61; 0) top--;sta[&#43;&#43;top] &#61; ploy[i];}int tmp &#61; top;for(int i &#61; n - 2; i >&#61; 0; -- i) {while(top >&#61; tmp &#43; 1 && dcmp(Cross(sta[top]-sta[top-1],ploy[i]-sta[top-1])) <&#61; 0) top--;sta[&#43;&#43; top] &#61; ploy[i];}top --;
}void qiake() {int left &#61; 1, right &#61; 1, up &#61; 1;for(int i &#61; 1; i <&#61; top; &#43;&#43; i) {while(dcmp(Cross(sta[i]-sta[up&#43;1],sta[i&#43;1]-sta[up&#43;1]) - Cross(sta[i]-sta[up],sta[i&#43;1]-sta[up])) >&#61; 0) up &#61; up % top &#43; 1;while(dcmp(Dot(sta[right&#43;1] - sta[i],sta[i&#43;1]-sta[i]) - Dot(sta[right]-sta[i],sta[i&#43;1]-sta[i])) >&#61; 0) right &#61; right % top &#43; 1;if(i &#61;&#61; 1) left &#61; right;while(dcmp(Dot(sta[i]-sta[i&#43;1],sta[left&#43;1]-sta[i&#43;1]) - Dot(sta[i]-sta[i&#43;1],sta[left]-sta[i&#43;1])) >&#61; 0) left &#61; left % top &#43; 1;double L &#61; DistanceToLine(sta[up],sta[i],sta[i&#43;1]);double Len &#61; Distance(sta[i],sta[i&#43;1]);//i 和 i &#43; 1 点之间的长度double botten &#61; Dot(sta[right]-sta[i],sta[i&#43;1]-sta[i]) / Len &#43; Dot(sta[i]-sta[i&#43;1],sta[left]-sta[i&#43;1]) / Len - Len;if(dcmp(minsqr - botten * L) > 0) {//逆时针存储矩形minsqr &#61; botten * L;ans[0] &#61; pedal(sta[i],sta[i&#43;1],sta[right]);ans[1] &#61; pedal(ans[0],sta[right],sta[up]);ans[2] &#61; pedal(ans[1],sta[up],sta[left]);ans[3] &#61; pedal(sta[i],sta[i&#43;1],sta[left]);}}
}int main()
{IOS;cin >> n;for(int i &#61; 0; i < n; &#43;&#43; i) {double x, y;cin >> x >> y;ploy[i] &#61; (Point){x,y};}Graham();qiake();cout << fixed << setprecision(5) << minsqr << endl;int tmp &#61; 0;for(int i &#61; 0; i <&#61; 3; i &#43;&#43;)if(ans[i]<ans[tmp]) tmp &#61; i;for(int i &#61; 0; i < 4; &#43;&#43; i)cout << fixed << setprecision(5) << ans[(i &#43; tmp) % 4].x &#43; eps/*防止-0的出现*/ << " " << ans[(i &#43; tmp) % 4].y &#43; eps << endl;
}



推荐阅读
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 本文详细介绍了如何在循环双链表的指定位置插入新元素的方法,包括必要的步骤和代码示例。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 本文将深入探讨C语言中的位操作符——按位与(&)、按位或(|)和按位异或(^),通过具体示例解释这些操作符如何在位级别上对数据进行操作。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
author-avatar
好kc好先生之家
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有