【题目链接】:http://www.lydsy.com/JudgeOnline/problem.php?id=1038

【题意】

【题解】



可以看到所有村子的瞭望塔所在的位置只会是在相邻两个村子所代表的点连成的线的半平面交内;

它求的是相对高度;

有个结论是:

最小相对高度差的点,

1.在半平面交的直线的交点处

2.在村子往上的投影处;

平面交用单调队列搞;

搞之前需要先将直线按斜率升序排;

然后就可以想象一下斜率都是0..90°的情形,然后写一些就好;

具体实现看代码;



【完整代码】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define lson l,m,rt<<1
  4. #define rson m+1,r,rt<<1|1
  5. #define LL long long
  6. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  7. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  8. #define mp make_pair
  9. #define pb push_back
  10. #define fi first
  11. #define se second
  12. #define rei(x) scanf("%d",&x)
  13. #define rel(x) scanf("%lld",&x)
  14. #define ref(x) scanf("%lf",&x)
  15. typedef pair<int,int> pii;
  16. typedef pair<LL,LL> pll;
  17. const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
  18. const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
  19. const double pi = acos(-1.0);
  20. const int N = 1000;
  21. struct point
  22. {
  23. double x,y;
  24. }points[N];
  25. struct line
  26. {
  27. point a,b;
  28. double k,c;
  29. void get()
  30. {
  31. k = (a.y-b.y)/(a.x-b.x);
  32. c = a.y-k*a.x;
  33. }
  34. }lines[N],sta[N];
  35. int n,top = 0;
  36. double ans = 1e12;
  37. void in()
  38. {
  39. rei(n);
  40. rep1(i,1,n)
  41. ref(points[i].x);
  42. rep1(i,1,n)
  43. ref(points[i].y);
  44. }
  45. bool cmp1(line a,line b)//把线段按照斜率升序排
  46. {
  47. return a.k < b.k;
  48. }
  49. point getintersec(line a,line b)//求两条直线的交点
  50. {
  51. point t;
  52. t.x = (a.c-b.c)/(b.k-a.k);
  53. t.y = t.x*a.k+a.c;
  54. return t;
  55. }
  56. void Insert(line t)//插入一条新的平面
  57. //因为都会是往上的,所以处理起来会简单一点吧
  58. {
  59. while (top>=2)
  60. {
  61. if (getintersec(sta[top-1],sta[top]).x>getintersec(sta[top],t).x) top--;
  62. else
  63. break;
  64. }
  65. sta[++top] = t;
  66. }
  67. void halfpaneintersec()//搞平面交
  68. {
  69. rep1(i,1,n-1)
  70. Insert(lines[i]);
  71. }
  72. void pre()
  73. {
  74. rep1(i,1,n-1)
  75. lines[i].a = points[i],lines[i].b = points[i+1],lines[i].get();
  76. sort(lines+1,lines+1+(n-1),cmp1);
  77. halfpaneintersec();
  78. }
  79. double maxh(double x)//村子的投影往上的交点的纵坐标
  80. {
  81. double t = 0;
  82. rep1(i,1,top)
  83. {
  84. double y = sta[i].k*x+sta[i].c;
  85. t = max(t,y);
  86. }
  87. return t;
  88. }
  89. double jdy(double x)//平面交的直线的交点的横坐标往下的投影的交点纵坐标
  90. {
  91. rep1(i,2,n)
  92. {
  93. if (points[i].x>=x)
  94. return points[i].y-(points[i].y-points[i-1].y)*(points[i].x-x)/(points[i].x-points[i-1].x);
  95. }
  96. return 0;
  97. }
  98. void get_ans()
  99. {
  100. rep1(i,1,n)
  101. ans = min(ans,maxh(points[i].x)-points[i].y);
  102. rep1(i,1,top-1)
  103. {
  104. point t = getintersec(sta[i],sta[i+1]);
  105. ans = min(ans,t.y-jdy(t.x));
  106. }
  107. }
  108. void o()
  109. {
  110. printf("%.3f\n",ans);
  111. }
  112. int main()
  113. {
  114. //freopen("F:\\rush.txt","r",stdin);
  115. in();
  116. pre();
  117. get_ans();
  118. o();
  119. //printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
  120. return 0;
  121. }

【BZOJ 1038】[ZJOI2008]瞭望塔的更多相关文章

  1. bzoj 1038 [ZJOI2008]瞭望塔(半平面交)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] 找一个最低塔高使可以看到村庄的每一个角落. [思路] 半平面交 能够看 ...

  2. BZOJ 1038 ZJOI2008 瞭望塔 半平面交

    题目大意及模拟退火题解:见 http://blog.csdn.net/popoqqq/article/details/39340759 这次用半平面交写了一遍--求出半平面交之后.枚举原图和半平面交的 ...

  3. 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔

    1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 ...

  4. 1038: [ZJOI2008]瞭望塔 - BZOJ

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...

  5. 1038: [ZJOI2008]瞭望塔

    半平面交. 半平面指的就是一条直线的左面(也不知道对不对) 半平面交就是指很多半平面的公共部分. 这道题的解一定在各条直线的半平面交中. 而且瞭望塔只可能在各个点或者半平面交折线的拐点处. 求出半平面 ...

  6. 【BZOJ】1038: [ZJOI2008]瞭望塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=1038 题意:给出n个x轴各不相同的二维整点,且升序,n<=300,坐标绝对值<=10^6 ...

  7. bzoj千题计划126:bzoj1038: [ZJOI2008]瞭望塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=1038 本题可以使用三分法 将点按横坐标排好序后 对于任意相邻两个点连成的线段,瞭望塔的高度 是单峰函 ...

  8. [BZOJ1038][ZJOI2008]瞭望塔(半平面交)

    1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2999  Solved: 1227[Submit][Statu ...

  9. 【BZOJ1038】[ZJOI2008]瞭望塔 半平面交

    [BZOJ1038][ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如 ...

随机推荐

  1. 机房收费 &amp; 廊院食堂

    做机房收费系统时.常常想这个一般用户指的是谁?我当初以为是学生......可能是被数据库中的student带跑偏了...... 事实上把我们的系统联系一下实际,就会非常easy想到一般用户指的是谁的位 ...

  2. Loadrunner--Analysis网页细分图

    续LR实战之Discuz开源论坛项目,之前一直是创建虚拟用户脚本(Virtual User Generator)和场景(Controller),现在,终于到了LoadRunner性能测试结果分析(An ...

  3. GO语言学习(八)Go 语言常量

    Go 语言常量 常量是一个简单值的标识符,在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型. 常量的定义格式: const identifier ...

  4. FTP中的授权规则

    在授权规则中,你可以管理自己的FTP站点以怎样的方式进行访问,比如每个进入站点的人都需要输入用户名密码.正则可以在授权规则中删除默认的配置“允许匿名用户读取”的规则. 也可以在此处,对不同的组或用户进 ...

  5. 6.1、Android硬件访问服务之框架

    1.通过前面led点亮的例子,其流程如下 Android app(java)(通过loadLibrary)——>C library(C库做如下事情)——>1.JNI_Onload 2.jn ...

  6. Python 爬虫从入门到进阶之路(五)

    在之前的文章中我们带入了 opener 方法,接下来我们看一下 opener 应用中的 ProxyHandler 处理器(代理设置). 使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的. 很 ...

  7. CSDN日报20170406 ——《代码非常烂,所以离职。》

    [程序人生]代码非常烂.所以离职? 作者:stormzhang 我在面试的时候一般会问这么一个问题:你为什么离职? 当中有不少同学会提到这么一个原因.现在的项目代码太烂了,前人留下了非常多坑,我实在忍 ...

  8. [Angular] Show a loading indicator in Angular using *ngIf/else, the as keyword and the async pipe

    The network may be unreliable and loading data may take time. Thus it is important to give the user ...

  9. 使用ionic3快速开发webapp(一)

    Ionic可以让我们使用web技术快速构建接近原生体验的跨平台移动应用. 一.安装ionic 1.需要先安装 Node.js(版本8.x之上): 2.安装cordova 和 ionic: $ npm ...

  10. 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

    "chrome扩展程序无法启用"的解决方案 http://www.cnplugins.com/tool/installpluginfix.html win10家庭版没有组策略怎么办? https:// ...