bzoj3707 圈地【计算几何】
来源:互联网 发布:linux命令记录日志 编辑:程序博客网 时间:2024/04/28 07:26
解题思路:
如果枚举了两个点a,b。如果以点a,b所在直线为y轴的话,可以看出面积最小的就是离这个坐标系y轴最近的一个点。如果我们能够快速的得知最近的点的话,就可以将复杂度降低到O(
把这些点两两之间求出一条直线,记录这条直线是哪两个点取到的,记录这条直线的斜率k。然后按照k排序,我们可以依次按照k递增连续变化的顺序处理这些直线。
我们将点按x为第一关键字,y为第二关键字排序组成一个序列,可以发现当处理到直线(a,b)时,a,b在序列中是相邻的(假设a在序列中位置在b前面),且离(a,b)最近的点就是序列中a左边的点或b右边的点,即可计算答案。且此时相当于b在当前坐标系中刚刚比a小(按排序定义),所以交换a,b在序列中的位置即可处理下一条直线了。
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<algorithm>#include<ctime>#include<vector>#include<queue>#define ll long longusing namespace std;int getint(){ int i=0,f=1;char c; for(c=getchar();(c!='-')&&(c<'0'||c>'9');c=getchar()); if(c=='-')c=getchar(),f=-1; for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f;}const int N=1005;int n,m;int pos[N],id[N];double k[N*N],ans;struct point{ double x,y; point(){} point(int _x,int _y): x(_x),y(_y){} friend inline point operator -(const point &a,const point &b) {return point(a.x-b.x,a.y-b.y);} friend inline double operator *(const point &a,const point &b) {return a.x*b.y-a.y*b.x;} inline friend bool operator <(const point &a,const point &b) { if(a.x==b.x)return a.y<b.y; return a.x<b.x; }}a[N];struct node{ int s,t; double k; inline friend bool operator <(const node &a,const node &b) { return a.k<b.k; }}b[N*N];double area(point u,node v){ return fabs((a[v.s]-u)*(a[v.t]-u))*0.5;}int main(){ //freopen("lx.in","r",stdin); //freopen("lx.out","w",stdout); n=getint(); for(int i=1;i<=n;i++) a[i].x=getint(),a[i].y=getint(); sort(a+1,a+n+1); for(int i=1;i<=n;i++)pos[i]=id[i]=i; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { ++m; b[m].s=i,b[m].t=j; if(a[i].x==a[j].x)b[m].k=1e18; else b[m].k=(a[i].y-a[j].y)*1.0/(a[i].x-a[j].x); } sort(b+1,b+m+1); ans=1e18; for(int i=1;i<=m;i++) { int j=pos[b[i].s],k=pos[b[i].t]; if(j>k)swap(j,k); if(j>1)ans=min(ans,area(a[id[j-1]],b[i])); if(k<n)ans=min(ans,area(a[id[k+1]],b[i])); swap(pos[b[i].s],pos[b[i].t]); swap(id[j],id[k]); } printf("%0.2f",ans); return 0;}
阅读全文
0 0
- bzoj3707 圈地【计算几何】
- 【BZOJ3707】圈地 计算几何 旋转坐标系
- BZOJ3707 圈地
- BZOJ3707: 圈地
- 计算几何几何函数库
- 计算几何-几何库
- 计算几何
- 计算几何
- 计算几何
- 计算几何
- 计算几何
- 计算几何
- 计算几何
- 计算几何
- 计算几何
- 计算几何
- 计算几何
- 计算几何
- Linux netstat命令详解
- 当外面是数组的时候,解析的3中方法
- HiBench算法简介
- solr(一)solr7.1.0整合tomcat8.5.20
- java金额大写转换
- bzoj3707 圈地【计算几何】
- Java 基础 —— String中替换指定字符,字符种类判定,字符大小写转换,遍历字符串
- 微信小程序-轮播图
- Windows 性能监视器的基本指标(CPU,内存,硬盘参数)
- java中StringTokenizer使用
- [转]【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析
- CSDN 博客小发现
- 单例模式的七种写法
- Quartz总结(四):动态修改定时器二