https://www.luogu.org/problemnew/show/P1663

给定山的性状,求一个最低点可以看见所有的地方。

就是半平面交。

粘贴全家福:

```cpp
#include
using namespace std;
typedef long long ll;

//不要输出-0.0之类的数

const double eps=1e-8;

const double inf=1e9;

const double pi=acos(-1.0); //小数点后15位精度,和atan2相同

//判断浮点数的符号

inline int cmp(double x) {

return (fabs(x)<eps)?0:((x>0.0)?1:-1);

}

inline double sqr(double x) {

return x*x;

}

struct Point {

double x,y;

Point() {};

Point(const double x,const double y):x(x),y(y) {};

friend Point operator+(const Point &a,const Point &b) {
return Point(a.x+b.x,a.y+b.y);
}
friend Point operator-(const Point &a,const Point &b) {
return Point(a.x-b.x,a.y-b.y);
}
friend Point operator*(const Point &p,const double k) {
return Point(p.x*k,p.y*k);
}
friend Point operator*(const double k,const Point &p) {
return Point(p.x*k,p.y*k);
}
friend Point operator/(const Point &p,const double k) {
return Point(p.x/k,p.y/k);
}
inline double angle() {
//返回向量的倾斜角,[-pi, pi]
return atan2(y,x);
}

};

double det(const Point &a,const Point &b) {

return a.xb.y-a.yb.x;

}

double dot(const Point &a,const Point &b) {

return a.xb.x+a.yb.y;

}

//半平面交,O(nlogn)

vector halfplane_intersection(vector v) {

sort(v.begin(),v.end(),compare);

deque q;

deque ans;

q.push_back(v[0]);

int vs=v.size();
for(int i=1;i<vs;++i){
if(cmp((v[i].second-v[i].first).angle()-(v[i-1].second-v[i-1].first).angle())==0)
continue;
while(!ans.empty()&&!satisfy(ans.back(),v[i])){
ans.pop_back();
q.pop_back();
}
while(!ans.empty()&&!satisfy(ans.front(),v[i])){
ans.pop_front();
q.pop_front();
}
ans.push_back(intersect_point(q.back(),v[i]));
q.push_back(v[i]);
}
while(!ans.empty()&&!satisfy(ans.back(),q.front())){
ans.pop_back();
q.pop_back();
}
while(!ans.empty()&&!satisfy(ans.front(),q.back())){
ans.pop_front();
q.pop_front();
}
ans.push_back(intersect_point(q.back(),q.front()));
return vector<Point>(ans.begin(),ans.end());

}

void solve() {

int n;

scanf("%d",&n);

double x[5005],y[5005];

for(int i=1;i<=n;i++){

scanf("%lf%lf",&x[i],&y[i]);

}

vector hp;

hp.push_back(Halfplane(Point(x[1],inf),Point(x[1],y[1])));

hp.push_back(Halfplane(Point(x[n],y[n]),Point(x[n],inf)));

hp.push_back(Halfplane(Point(x[n],inf),Point(x[1],inf)));

for(int i=2;i<=n;i++){

hp.push_back(Halfplane(Point(x[i-1],y[i-1]),Point(x[i],y[i])));

}

/*for(int i=0;i<(int)hp.size();i++){
printf("Point1 %d: (%.4f, %4f)\n",i+1,hp[i].first.x,hp[i].first.y);
printf("Point2 %d: (%.4f, %4f)\n",i+1,hp[i].second.x,hp[i].second.y); puts("");
}*/ double ans=inf;
vector<Point> hpi=halfplane_intersection(hp);
int hs=hpi.size();
for(int i=0;i<hs;i++){
//printf("Point %d: (%.4f, %4f)\n",i+1,hpi[i].x,hpi[i].y);
ans=min(ans,hpi[i].y);
}
printf("%8f\n",ans);

}

int main() {

ifdef Yinku

freopen("Yinku.in","r",stdin);

endif // Yinku

solve();
return 0;

}

<details>

最新文章

  1. 在 Visual Studio 中调试时映射调用堆栈上的方法
  2. 游标的使用之压缩数据库Log文件
  3. 信息加密之非对称加密DH算法
  4. Android 自定义对话框使用静态Handler传递参数
  5. android 打包 /${zipalign}&amp;quot; error=2, No such file or directory
  6. Golang+Mongodb
  7. 每天一个linux命令(44)--ss命令
  8. hibernate sql查询转换成VO返回list
  9. Spark2.3(四十):如何使用java通过yarn api调度spark app,并根据appId监控任务,关闭任务,获取任务日志
  10. SAS DATA步读取数据
  11. Django中的应用
  12. PAT 甲级 1078 Hashing
  13. 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra
  14. 20135234mqy-——信息安全系统设计基础第二周学习总结
  15. python 用到的函数记录
  16. Implementing the On Item Checked Event for the TListView Control
  17. 20155236范晨歌_exp6信息搜集与漏洞扫描
  18. 分布式java应用基础与实践
  19. debug 调试原理理解
  20. [BZOJ 2821] 作诗

热门文章

  1. EasyPusher实现将asterisk直播流以RTSP转发实现通话直播与录像
  2. Performance Tuning Using Linux Process Management Commands
  3. tornado安全应用之cookie
  4. 一文读懂P2P和区块链的异同
  5. 项目中一个普通的Java类如何获取service接口(一)
  6. 2014 ACM-ICPC Beijing Invitational Programming Contest
  7. include vector 编译出错VC++
  8. HDU3065 病毒侵袭持续中 —— AC自动机
  9. TCP与HTTP连接管理
  10. IPFS中文简介