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



推荐阅读
  • 方阵|回路_HDU2859 Phalanx(动态规划/哈希表)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了HDU-2859Phalanx(动态规划/哈希表)相关的知识,希望对你有一定的参考价值。题目链接:点 ... [详细]
  • 标准库Vector类型使用需要的头文件:#includeVector:Vector是一个类模板。不是一种数据类型。Vector ... [详细]
  • *题意:往区间[1,10000000]的墙上贴海报,海报数量 ... [详细]
  • 在做linux下面的网络编程时写了如下一段程序[cpp:showcolumns]viewplaincopy102030405060708090100110120130140150& ... [详细]
  • 1、打开终端设备文件及复制文件句柄   代码路径:initmain.c 目前处于进程1的3特权级voidinit(void){intpid,i;setup((voi ... [详细]
  • 笔试强训(二十六)
    目录一、选择题二、编程题2.1快到碗里来2.1.1题目2.1.2题解2.2跳台阶扩展问题2.2.1题目2.2.2题解一、选择题(1)下列哪些语句关于内 ... [详细]
  • 联邦学习: 联邦场景下的时空数据挖掘
    不论你望得多远,仍然有无限的空间在外边,不论你数多久,仍然有无限的时间数不清。——惠特曼《自己之歌》1.导引时空数据挖掘做为智慧城市的重要组成部分,和我们的日常生活息息相关。如我 ... [详细]
  • 区块链技术与应用【肖臻老师】笔记整理之22ETH智能合约
    注:没有全部复原,抽取了主体知识,加入了一些自己的理解,强烈建议去学习肖臻老师的课程,这绝对算得上是国内区块链讲解的顶级教程,纯学术和技术智能合约是以太坊的精髓。智能合约是运行在区 ... [详细]
  • 1.什么是B/S架构?什么是C/S架构 ... [详细]
  • poj 2421 Constructing Roads 解题报告
    题目链接:http:poj.orgproblem?id2421实际上又是考最小生成树的内容,也是用到kruskal算法。但稍稍有点不同的是, ... [详细]
  • MyBatis的返回参数类型分两种1.对应的分类为:1.1.resultMap:1.2.resultType:2.对应返回值类型:2.1.resultM ... [详细]
  • 生活最近还是在学习flask和java,java马上也快看完了,然后就准备开始复习一下数据结构,同时也预习一下算法。都说程序数据结构算法 ... [详细]
  • 1、深拷贝和浅拷贝是什么意思?浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当 ... [详细]
  • ※Java初级 常见面试题①
    2022春招面试指南:Java岗位基础篇(适用于各大企业招聘Java初级工程师岗位,附配套MD文档)_哔哩哔哩_bilibi ... [详细]
  • 在某些时候,我们可能想基于字符串做一些事情,比如:针对同一用户的并发同步操作,使用锁字符串的方式实现比较合理。因为只有在相同字符串的情况下,并发操作才是不被允许的。而如果我们不分青 ... [详细]
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社区 版权所有