题目描述

Description
  艾泽拉斯世界经历一场亘古未有的地震过后,大地和海洋被完全撕裂,旧大陆残缺不全。联盟和部落各种族的居民们被迫离开了世代居住的家园,来寻找新的生存空间。原本平坦的陆地上现在隆起了一座座山峰,暴风城的人类开始在艾尔文山脉重建家园。他们决定在山脉之中建造一座瞭望塔和一个魔法浮空岛,以便于在瞭望塔和浮空岛上可以俯视艾尔文山脉的全貌。
  艾尔文山脉被描述为一个折线,给定每个点的坐标(横纵坐标均不小于0),按照横坐标从小到大顺次连接起来就是就是山脉的折线。折线上所有点的横坐标均不相同。如果一个位置与山脉任何一点的连线均不被挡住(但可以与地面相切),那么就说这一点可以望到整个艾尔文山脉。瞭望塔的塔身不会挡住视线,而且瞭望塔和浮空岛可以建造在同一位置。为节省建筑材料,瞭望塔塔身的高度必须尽量小,即从塔顶到塔底的距离尽量小,瞭望塔可以建在山坡上。由于气候因素,浮空岛应建立在海拔尽量低的位置(甚至可以建在地面上),海平面高度为0。如果有多个位置均满足条件,则选择横坐标最小的那个。瞭望塔和浮空岛横坐标范围应在艾尔文山脉横坐标范围之内。
  给定艾尔文山脉,请你求出瞭望塔和浮空岛的位置。

Input
  第1行,一个整数N,表示描述艾尔文山脉的折线的顶点数。
  第2-N+1行,每行两个整数,xi,yi表示折线上点的坐标。

Output
  第1行,两个保留2位小数的浮点数x1,y1,表示瞭望塔顶端的坐标。
  第2行,两个保留2位小数的浮点数x2,y2,表示浮空岛的坐标。

Sample Input
6
2 2
6 1
8 6
10 3
16 5
20 2

Sample Output
8.00 11.00
9.54 9.85

Data Constraint

Hint
【样例说明】   样例中描述的艾尔文山脉各个顶点,按照横坐标顺序顺次连接后的折线如下图所示:

瞭望塔应建造在山峰(8,6)处,塔顶端为(8,11),高度为5,此时瞭望塔的高度最小。      

浮空岛建立在(9.54,9.85)处,海拔高度最低。

【数据规模】
  40%的数据2<=N<=10
  100%的数据2<=N<=1 000 000;
0<=xi,yi<=5 000 000

题解

半平面交裸题
而且只有下凸壳所以不用队列

浮空岛就是凸壳最低点
瞭望塔的x只可能是下凸壳/原点中的某个x
加上凸壳的首尾两个点,排序后单调找,每次找相邻的一类点中间的其它点来求交

然鹅
本题的坑点在于时间/空间/精度

自己感受


上面两个是同一个程序

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define cj(a,b,c) ((c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y))
#define abs(x) ((x)>0?(x):-(x))
#define max(a,b) (a>b?a:b)
#define pi 3.14159265358979323846
#define E 0.0000001
using namespace std;struct P{double x,y;P (double _x=0,double _y=0) {x=_x,y=_y;}
} O=P(0,0),p[100001],Jd,A[1000001];
struct P2{double x,y;int type;
} b[2000001];
struct L{P s1,s2;float xl;L (double _x1=0,double _y1=0,double _x2=0,double _y2=0) {s1.x=_x1,s1.y=_y1,s2.x=_x2,s2.y=_y2;}
} a[1000001],l1,l2; //s1-->s2
int N,n,i,j,k,l,t,tot,ls1,ls2;
double ans1,ans1x,ans1y,ans2,ans2x,ans2y,s;
long double s1,s2,S;
char ch[16000001];
char *Ch=ch;int getint()
{int x=0;while (*Ch<'0'  || *Ch>'9' ) *++Ch;while (*Ch>='0' && *Ch<='9') x=x*10+(*Ch-'0'),*++Ch;return x;
}//long double cj(P a,P b,P c)
//{//  long double s=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
//
//  if (abs(s)<=E)
//  return 0;
//  else
//  return s;
//}bool cmp(L a,L b)
{return abs(a.xl-b.xl)>E && a.xl<b.xl || abs(a.xl-b.xl)<=E && cj(a.s1,a.s2,b.s2)<0;
}
bool Cmp(P2 a,P2 b)
{return a.x<b.x;
}
bool CMP(P a,P b)
{return a.x<b.x;
}P jd(L a,L b)
{s1=cj(a.s1,b.s1,a.s2),s2=cj(a.s1,a.s2,b.s2);S=s1/(s1+s2);return P(b.s1.x+(b.s2.x-b.s1.x)*S,b.s1.y+(b.s2.y-b.s1.y)*S);
}float xl(L a)
{float x=a.s2.x-a.s1.x,y=a.s2.y-a.s1.y;if (abs(y)<=E){if (x>0)return 0;elsereturn pi;}if (abs(x)<=E){if (y>0)return pi/2;elsereturn pi*3/2;}if (x>0 && y>0)return atan(y/x);if (x<0 && y>0)return atan(y/x)+pi;if (x<0 && y<0)return atan(y/x)+pi;if (x>0 && y<0)return atan(y/x)+pi+pi;
}int main()
{//  freopen("cataclysm38.in","r",stdin);
//  freopen("S8_2_3.in","r",stdin);fread(ch,1,16000001,stdin);n=getint();fo(i,1,n)A[i].x=getint(),A[i].y=getint();sort(A+1,A+n+1,CMP);N=0;fo(i,2,n){++N;a[N]=L(A[i].x,A[i].y,A[i-1].x,A[i-1].y);a[N].xl=xl(a[N]);}sort(a+1,a+N+1,cmp);j=0;fo(i,1,N)if (i==1 || abs(a[i].xl-a[i-1].xl)>E)a[++j]=a[i];N=j;t=1;fo(i,2,N){while (t>1 && cj(a[i].s1,a[i].s2,p[t-1])<=0)--t;a[++t]=a[i];p[t-1]=jd(a[t-1],a[t]);}tot=0;fo(i,1,n){++tot;b[tot].x=A[i].x;b[tot].y=A[i].y;b[tot].type=0;}fo(i,1,t-1){++tot;b[tot].x=p[i].x;b[tot].y=p[i].y;b[tot].type=1;}if (t==1 || p[1].x>A[1].x){++tot;l1=L(A[1].x,A[1].y,A[1].x,233333333333333ll);Jd=jd(l1,a[1]);b[tot].x=Jd.x;b[tot].y=Jd.y;b[tot].type=1;}if (t==1 || p[t-1].x<A[n].x){++tot;l1=L(A[n].x,A[n].y,A[n].x,233333333333333ll);Jd=jd(l1,a[t]);b[tot].x=Jd.x;b[tot].y=Jd.y;b[tot].type=1;}sort(b+1,b+tot+1,Cmp);ans1=233333333333333ll;ans2=233333333333333ll;ls1=0;ls2=0;fo(i,1,tot){if (i<tot && abs(b[i].x-b[i+1].x)<=E){s=abs(b[i].y-b[i+1].y);if (abs(s-ans1)>E && s<ans1 || abs(s-ans1)<=E && b[i].x<ans1x){ans1=s;ans1x=b[i].x;ans1y=max(b[i].y,b[i+1].y);}}if (!b[i].type){if (ls1){fo(j,ls1+1,i-1){//                  l1=L(b[j].x,-233333333333333ll,b[j].x,b[j].y);
//                  l2=L(b[ls1].x,b[ls1].y,b[i].x,b[i].y);
//
//                  Jd=jd(l1,l2);Jd.x=b[j].x;Jd.y=b[ls1].y+(b[j].x-b[ls1].x)/(b[i].x-b[ls1].x)*(b[i].y-b[ls1].y);s=b[j].y-Jd.y;if (abs(s-ans1)>E && s<ans1 || abs(s-ans1)<=E && b[j].x<ans1x){ans1=s;ans1x=b[j].x;ans1y=b[j].y;}}}ls1=i;}else{if (ls2){fo(j,ls2+1,i-1){//                  l1=L(b[j].x,233333333333333ll,b[j].x,b[j].y);
//                  l2=L(b[ls2].x,b[ls2].y,b[i].x,b[i].y);
//
//                  Jd=jd(l1,l2);Jd.x=b[j].x;Jd.y=b[ls2].y+(b[j].x-b[ls2].x)/(b[i].x-b[ls2].x)*(b[i].y-b[ls2].y);s=Jd.y-b[j].y;if (abs(s-ans1)>E && s<ans1 || abs(s-ans1)<=E && Jd.x<ans1x){ans1=s;ans1x=Jd.x;ans1y=Jd.y;}}}ls2=i;s=b[i].y;if (abs(s-ans2)>E && s<ans2 || abs(s-ans2)<=E && b[i].x<ans2x){ans2=s;ans2x=b[i].x;ans2y=b[i].y;}}}if (abs(ans1x)<=E) ans1x=0;if (abs(ans1y)<=E) ans1y=0;if (abs(ans2x)<=E) ans2x=0;if (abs(ans2y)<=E) ans2y=0;printf("%0.2lf %0.2lf\n",ans1x,ans1y);printf("%0.2lf %0.2lf\n",ans2x,ans2y);
}

jzoj1896. 大灾变相关推荐

  1. [BZOJ2033][清橙A1215][2009国家集训队]大灾变-半平面交

    大灾变 Description 艾泽拉斯世界经历一场亘古未有的地震过后,大地和海洋被完全撕裂,旧大陆残缺不全.联盟和部落各种族的居民们被迫离开了世代居住的家园,来寻找新的生存空间.原本平坦的陆地上现在 ...

  2. 51nod 1171 大灾变

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1757 二分答案mid 避难所拆为mid个点 每个避难所的第一个点向第二个 ...

  3. 51nod1757 大灾变

    能想到二分答案+最大流判断是否符合.但是不知道如何建图qaq.参考的是http://blog.csdn.net/fsss_7/article/details/52132046的建图方法 #includ ...

  4. CDDA大灾变 编译安装

    CDDA大灾变 编译安装 网站:链接 文章已经迁移:链接 cdda大灾变?昨天我看到了这个游戏,于是乎,去官网下载,先是下了二进制包,运行后提示没有找到库.ldd命令一看,libSDL这个库没有.但是 ...

  5. 51nod 1757大灾变(拆点二分网络流)

    大灾变 发现士兵的流动很像网络流 但是网络流无法表示时间的流逝 所以可以把每个终点拆分为 n n n个点,分别表示不同时刻的点 这样就可以二分转换为判定性的问题,假设二分的值为 m i d mid m ...

  6. 网络营销案例复制 魔兽大灾变也来“包场门”

    7月11日,多家游戏网站首页又现一幕熟悉的"包场门",铺天盖地的是魔兽大灾变7.12开区的广告.此情此景,不由得让人联想到了<征途2>7月1日的"红色包场&q ...

  7. linux游戏大灾变,深度商店应用数独、大灾变:劫后余生、Tux Typing、Pacman网页版...

    深度商店收录数独.大灾变:劫后余生.Tux Typing.Pacman网页版应用,如果使用Deepin或是统信UOS操作系统,可在深度商店程序上安装它们. 1.数独 数独是一款逻辑性强的数字填充游戏, ...

  8. CDDA大灾变游戏linux,《大灾变CDDA》审判日游戏心得

    <大灾变CDDA>是一款趣味性比较强的沙盒类游戏,庞大的地图和各种建造系统可以让玩家体验到游戏众多的类容,在最新版本的审判日中,游戏也越来越趋于平衡. 审判日游戏心得 审判日这个版本除了尼 ...

  9. [二分+最大流]51 Nod——1757 大灾变

    题目描述 死亡之翼降临了!艾泽拉斯大陆的子民们必须逃出他的魔爪! 艾泽拉斯的结构是一棵树,这棵树上的一些节点是地精建造的通往地下避难所的洞口. 除了这些洞口之外,树上的每个节点上都有一个种族,每个种族 ...

最新文章

  1. 莫队 ---- 值域分块处理优化字典树上的查询 杭电多校2021第二场1004 i love counting
  2. 【数理知识】《数值分析》李庆扬老师-第7章-非线性方程与方程组的数值解法
  3. static关键字总结
  4. hibernate的查询缓存
  5. php生成迷宫和迷宫寻址算法实例
  6. art.dialog重设弹窗大小和刷新位置
  7. Oracle修改表空间为自动扩展
  8. Strus2_Action中访问Web资源
  9. 掌握 Ajax,第 1 部分: Ajax 入门简介
  10. Debian Mysql stop 问题
  11. 【渝粤题库】 广东开放大学 劳动和社会保障法 形成性考核
  12. QT-程序依赖打包-windeployqt方式(简述版)
  13. SQL查询分析器的使用说明
  14. Js常用40个页面效果
  15. SSD、eMMC、UFS的区别
  16. java基于easypoi实现对导出的excel文档加密
  17. SSR在天猫优品大促会场的探索实践
  18. 三至六世紀浙東地區的經濟發展
  19. Linux下的常用的打包和解压缩命令
  20. 1.8-20:反反复复

热门文章

  1. 猜数游戏 (do while循环
  2. Python项目实战——纽约出租车运行情况分析建模
  3. 国外虚拟服务器,国外虚拟主机
  4. Jupyter 魔术命令(magic commands)
  5. 如何安装 Eigen
  6. UWPWP8.1图片照片添加水印
  7. springboot+poi-tl根据模板导出word(含动态表格和图片)
  8. Python随机游走模型
  9. 【LVI-SAM论文全文翻译】: LVI-SAM: Tightly-coupled Lidar-Visual-Inertial Odometry via Smoothing and Mapping
  10. HCI 电脑串口工具验证CSR8311初始化