只需要倒着插入,然后维护一个凸包就可以了。

可以用来学习set的用法

  1. #include <map>
  2. #include <set>
  3. #include <cmath>
  4. #include <queue>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <iostream>
  8. #include <algorithm>
  9. using namespace std;
  10. #define F(i,j,k) for (int i=j;i<=k;++i)
  11. #define D(i,j,k) for (int i=j;i>=k;--i)
  12. #define inf 100000
  13. #define ll long long
  14. #define mp make_pair
  15. #define sqr(x) x*x
  16.  
  17. int n,x,y,m,k;
  18. struct Vector{
  19. double x,y;
  20. void print(){printf("Vector (%.3f,%.3f)\n",x,y);}
  21. };
  22.  
  23. struct Point{
  24. int x,y;
  25. void print(){printf("Point (%d,%d)\n",x,y);}
  26. bool operator < (const Point b) const{
  27. return x==b.x?y<b.y:x<b.x;
  28. }
  29. }a[200005];
  30.  
  31. set <Point> s;
  32.  
  33. struct Options{int opt,id;}q[200005];
  34.  
  35. double dist (Point a,Point b)
  36. {
  37. // printf("dist\n");
  38. // a.print();b.print();
  39. // printf("The ans is %.6f\n",sqr((double)a.x-b.x)+sqr((double)a.y-b.y));
  40. return sqrt(((double)a.x-b.x)*((double)a.x-b.x)+((double)a.y-b.y)*((double)a.y-b.y));
  41. }
  42.  
  43. Vector operator - (Point a,Point b)
  44. {Vector ret;ret.x=a.x-b.x;ret.y=a.y-b.y;return ret;}
  45.  
  46. double operator * (Vector a,Vector b)
  47. {
  48. // a.print(); printf("* * *\n");
  49. // b.print();
  50. // printf("= %.6f\n",a.x*b.y-a.y*b.x);
  51. return a.x*b.y-a.y*b.x;
  52. }
  53.  
  54. int tot,del[200005];
  55. double ans[200005],now;
  56. Point newnode;
  57.  
  58. void init()
  59. {
  60. now=n*1.0;
  61. newnode.x=0;newnode.y=0;
  62. s.insert(newnode);
  63. // newnode.x=0;newnode.y=-inf;
  64. // s.insert(newnode);
  65. newnode.x=n;newnode.y=0;
  66. s.insert(newnode);
  67. // newnode.x=n;newnode.y=-inf;
  68. // s.insert(newnode);
  69. // printf("now is %.6f\n",now);
  70. }
  71.  
  72. void add(Point x)
  73. {
  74. // printf("Add "); x.print();
  75. set<Point>::iterator it,iL,iR;
  76. it=s.lower_bound(x);
  77. iL=it;iL--;iR=it;
  78. if ((x-*iL)*(*iR-x)>0) return;
  79. // printf("New node\n");
  80. now-=dist(*iL,*iR);
  81. for (;;)
  82. {
  83. iR=it;it++;
  84. if (it==s.end()) break;
  85. if ((*iR-x)*(*it-x)>0)
  86. {
  87. now-=dist(*iR,*it);
  88. s.erase(*iR);
  89. // printf("del R\n"); while (1);
  90. }
  91. else break;
  92. }
  93. for (;;)
  94. {
  95. if (iL==s.begin()) break;
  96. Point L=*iL; iL--;
  97. // (*iL-*it).print();
  98. // (*it-x).print();
  99. if ((L-*iL)*(x-*iL)>0)
  100. {
  101. now-=dist(*iL,L);
  102. s.erase(L);
  103. // printf("del L\n"); //while(1);
  104. }
  105. else break;
  106. }
  107. s.insert(x);
  108. it=s.find(x);
  109. iL=it;iL--;iR=it;iR++;
  110. now+=dist(*iL,x)+dist(x,*iR);
  111. // printf("now is %.6f\n",now);
  112. return ;
  113. }
  114.  
  115. void Finout()
  116. {
  117. freopen("defense.in","r",stdin);
  118. freopen("defense.out","w",stdout);
  119. }
  120.  
  121. int main()
  122. {
  123. // freopen("in.txt","r",stdin);
  124. scanf("%d%d%d",&n,&x,&y);
  125. scanf("%d",&m);
  126. F(i,1,m) scanf("%d%d",&a[i].x,&a[i].y);
  127. scanf("%d",&k);
  128. // printf("k is %d\n",k);
  129. F(i,1,k)
  130. {
  131. scanf("%d",&q[i].opt);
  132. switch(q[i].opt)
  133. {
  134. case 1:scanf("%d",&q[i].id); del[q[i].id]=1;break;
  135. case 2:q[i].id=++tot; break;
  136. }
  137. }
  138. // F(i,1,k) printf("Opt %d id %d\n",q[i].opt,q[i].id);
  139. init(); newnode.x=x;newnode.y=y;add(newnode);
  140. F(i,1,m) if (!del[i]) add(a[i]);
  141. D(i,k,1)
  142. {
  143. switch(q[i].opt)
  144. {
  145. case 1:add(a[q[i].id]);break;
  146. case 2:ans[q[i].id]=now;break;
  147. }
  148. }
  149. F(i,1,tot) printf("%.2f\n",ans[i]);
  150. }

  

BZOJ 2300 [HAOI2011]防线修建 ——计算几何的更多相关文章

  1. BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )

    离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...

  2. bzoj 2300: [HAOI2011]防线修建 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题解 这道题让我们维护一个支持动态删除点的上凸壳 并且告诉了我们三个一定不会被删除 ...

  3. bzoj 2300 : [HAOI2011]防线修建

    set动态维护凸包 #include<iostream> #include<cstdio> #include<cstring> #include<algori ...

  4. bzoj 2300 [HAOI2011]防线修建 set动态维护凸包

    题目大意 动态删点,求凸包周长 分析 反过来变成动态加点 用set维护平衡树 具体是找到凸包上左右两点 拆开 就可以把左边当作顺时针求的一个凸包,右边当作逆时针求的一个凸包,像栈那样出set就好了 注 ...

  5. 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)

    2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...

  6. bzoj2300#2300. [HAOI2011]防线修建

    题解:带删点的维护凸包,1.删点2.查询凸包周长 题解:倒着做就成了带加点的维护凸包,加点时维护一下周长就没了 //#pragma GCC optimize(2) //#pragma GCC opti ...

  7. bzoj千题计划236:bzoj2300: [HAOI2011]防线修建

    http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...

  8. 【题解】P2521 [HAOI2011]防线修建(动态凸包)

    [题解]P2521 [HAOI2011]防线修建(动态凸包) 凸包是易插入不好删除的东西,按照剧情所以我们时光倒流 然后问题就是维护凸包的周长,支持加入 本来很简单,但是计算几何就是一些小地方经验不足 ...

  9. [luogu P2521] [HAOI2011]防线修建

    [luogu P2521] [HAOI2011]防线修建 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国 ...

随机推荐

  1. angulajs中引用chart.js做报表,修改线条样式

    目前还有个问题,在手机上看,当折线y轴值超过1000,会有点问题 1.下载chart js,可以用bower 命令下载 http://www.chartjs.org/docs/#line-chart- ...

  2. mysqlsla安装和使用介绍

    安装mysqlsla源码路径:https://github.com/daniel-nichter/hackmysql.com源码存放路径:/usr/local/src1.获取源码如果没有git命令,请 ...

  3. 清理ThreadLocal

    在我很多的课程里(master.concurrency.xj-conc-j8),我经常提起ThreadLocal.它经常受到我严厉的指责要尽可能的避免使用.ThreadLocal是为了那些使用完就销毁 ...

  4. iphone图片简单处理

    使用sips批量缩放图片大小 >>sips -s format jpeg -Z 250 someImage.PNG --out myImage.JPEG 把someImage.PNG转换为 ...

  5. 关于highchts X时间轴比设置时间相差好几个小时的解决

    经过一番查询和研究发现,在曲线图里,x轴的UNIX时间戳是要乘以1000的(通过在线的UNIX转换,结果与原来没有乘以1000的时间戳相差甚远),不然显示的时间会有很大的误差,真是百思不得其解. 另外 ...

  6. SSH中的jar包讲解

    我们在搭建SSH框架的时候,需要引入各自的一些jar包 首先,先来看一下我们使用的SSH的各自版本及引入的jar包.   struts2.3.1.2: struts2-core-2.3.1.jar j ...

  7. 使用Microsoft Hadoop(一)

    To run this program, stage some data in HDFS: 1. create a text file called input.txt that has one in ...

  8. H3C交换机系统时间设置漏洞

    H3C交换机系统时间设置存在漏洞 1. 背景说明 由于在编写<主机房网络延伸实施方案>,调试H3C S5120S-28P-EI交换机时,发现交换机设置成现在的时间后,导致本地用户通过ssh ...

  9. Java第十二次作业:什么是一维数组?什么是对象数组?吃金币游戏2.0版 新增炸弹功能 新增游戏倒计时功能 新增胜利失败检测功能 使用如鹏游戏引擎制作窗体 一维数组设置金币

    什么是数组? 数组的定义:是用统一的名字代表这批数据,用序号来区分各个数据.数组是无序的数据元素按有序的下标组成的集合,分配固定空间大小的一种容器. 如何理解:其实就是一个同时放很多数据的变量. a= ...

  10. js的命令模式

    命令模式: 什么叫命令模式: 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式主要有四个部分: 命令对象(comma ...