[ZJOI2008]瞭望塔
IX.[ZJOI2008]瞭望塔
ZJOI2008咋总喜欢考这种计算几何的题啊……
同我们的IV.监视摄像机[CTSC1998]一样,本题相当于求多边形的核,可以使用半平面交。但因为和VI.[HNOI2008]水平可见直线一样,所有半平面都是向上的,故直接求凸包即可。
发现求完凸包后,答案的横坐标一定是凸包上点的横坐标/题目中给出的横坐标,故直接双针扫一遍即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int X[310],Y[310],stk[310],tp;
pair<double,double>p[310],q[310];
double res=0x3f3f3f3f3f3f3f3f;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&X[i]);
for(int i=1;i<=n;i++)scanf("%d",&Y[i]);
for(int i=1;i<n;i++)q[i]=p[i]=make_pair(1.0*(Y[i+1]-Y[i])/(X[i+1]-X[i]),1.0*(1ll*Y[i+1]*(X[i+1]-X[i])-1ll*X[i+1]*(Y[i+1]-Y[i]))/(X[i+1]-X[i]));
// for(int i=1;i<n;i++)printf("%lf %lf\n",p[i].first,p[i].second);
sort(p+1,p+n),stk[++tp]=1;
for(int i=2;i<n;i++){
if(fabs(p[i].first-p[i-1].first)<1e-6){stk[tp]=i;continue;}
while(tp>=2&&(p[i].second-p[stk[tp]].second)/(p[i].first-p[stk[tp]].first)>=(p[stk[tp]].second-p[stk[tp-1]].second)/(p[stk[tp]].first-p[stk[tp-1]].first))tp--;
stk[++tp]=i;
}
for(int i=1,j=1;i<=n;i++){
while(j<tp&&(p[stk[j+1]].second-p[stk[j]].second)/(p[stk[j]].first-p[stk[j+1]].first)<=X[i]){
if(i>1){
double x=(p[stk[j+1]].second-p[stk[j]].second)/(p[stk[j]].first-p[stk[j+1]].first),y=x*p[stk[j]].first+p[stk[j]].second;
double yy=x*q[i-1].first+q[i-1].second;
res=min(res,y-yy);
}
j++;
}
double y=X[i]*p[stk[j]].first+p[stk[j]].second;
res=min(res,y-Y[i]);
}
printf("%.3lf\n",res);
return 0;
}
分类:
计算几何
, 计算几何——凸包与凸壳
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?