热门标签 | 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;
}



推荐阅读
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
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社区 版权所有