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



推荐阅读
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本文深入探讨了POJ2762问题,旨在通过强连通分量缩点和单向连通性的判断方法,解决有向图中任意两点之间的可达性问题。文章详细介绍了算法原理、实现步骤,并附带完整的代码示例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
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社区 版权所有