题目大意:

http://www.lydsy.com/JudgeOnline/problem.php?id=2300

题解

这道题让我们维护一个支持动态删除点的上凸壳

并且告诉了我们三个一定不会被删除的点

也就是说,无论什么时候这都是一个凸包

如果我们考虑从凸包里删除一个点吗...这个点在凸包里还好说,不用管了

在凸包上嘛...哪位dalao写出来了请教教我,并不会删除QAQ

所以我们倒序考虑所有的操作,将其变成动态插入点

每一次插入一个点的时候,我们找到凸包上与这个点关联的两个点

(按照横纵坐标进行双关键字排序后与之相邻的两个点)

我们就从这两个点开始依次向左右拓展,并且即时更新凸包的长度

所以我们用set存一下所有在凸包上的点即可

  1. #include <set>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. using namespace std;
  7. typedef long long ll;
  8. inline void read(int &x){
  9. x=0;char ch;bool flag = false;
  10. while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
  11. while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
  12. }
  13. inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
  14. inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
  15. const int maxn = 100010;
  16. const int maxm = 200010;
  17. struct Point{
  18. int x,y;
  19. Point(const int &a = 0,const int &b = 0){x=a;y=b;}
  20. void print(){
  21. printf("Point : (%d,%d)\n",x,y);
  22. }
  23. };
  24. typedef Point Vector;
  25. Vector operator + (const Vector &a,const Vector &b){
  26. return Vector(a.x+b.x,a.y+b.y);
  27. }
  28. Vector operator - (const Vector &a,const Vector &b){
  29. return Vector(a.x-b.x,a.y-b.y);
  30. }
  31. bool operator < (const Point &a,const Point &b){
  32. return a.x == b.x ? a.y < b.y : a.x < b.x;
  33. }
  34. int operator * (const Vector &a,const Vector &b){
  35. return a.x*b.x + a.y*b.y;
  36. }
  37. inline int cross(const Vector &a,const Vector &b){
  38. return a.x*b.y - a.y*b.x;
  39. }
  40. inline double sqr(const double &x){
  41. return x*x;
  42. }
  43. inline double dis(Point a,Point b){
  44. return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));
  45. }
  46. struct Node{
  47. int cmd,x;
  48. }quer[maxm];
  49. set<Point>s;
  50. Point p[maxn];bool vis[maxn];
  51. double ans = .0;
  52. double anss[maxm];int cnt;
  53. void insert(Point x){
  54. set<Point>::iterator r = s.lower_bound(x);
  55. set<Point>::iterator l = --r;r++;
  56. set<Point>::iterator it;
  57. if(cross(x - *l,*r - *l) >= 0) return;
  58. ans -= dis(*l,*r);
  59. while(1){
  60. it = r++;
  61. if(r == s.end()) break;
  62. if(cross(*r - *it,*it - x) > 0) break;
  63. ans -= dis(*it,*r);s.erase(it);
  64. }
  65. ans += dis(x,*it);
  66. while(1){
  67. it = l--;
  68. if(it == s.begin()) break;
  69. if(cross(x - *it,*it - *l) > 0) break;
  70. ans -= dis(*it,*l);s.erase(it);
  71. }
  72. ans += dis(x,*(it));
  73. s.insert(x);
  74. }
  75. int main(){
  76. int n,x,y;read(n);read(x);read(y);
  77. s.insert(Point(0,0));
  78. s.insert(Point(x,y));
  79. s.insert(Point(n,0));
  80. ans += dis(Point(0,0),Point(x,y)) + dis(Point(x,y),Point(n,0));
  81. read(n);
  82. for(int i=1;i<=n;++i){
  83. read(p[i].x);
  84. read(p[i].y);
  85. }
  86. int m;read(m);
  87. for(int i=1;i<=m;++i){
  88. read(quer[i].cmd);
  89. if(quer[i].cmd == 1){
  90. read(quer[i].x);
  91. vis[quer[i].x] = true;
  92. }
  93. }
  94. for(int i=1;i<=n;++i){
  95. if(!vis[i]) insert(p[i]);
  96. }
  97. for(int i=m;i>=1;--i){
  98. if(quer[i].cmd == 1) insert(p[quer[i].x]);
  99. else anss[++cnt] = ans;
  100. }
  101. for(int i=cnt;i>=1;--i) printf("%.2lf\n",anss[i]);
  102. getchar();getchar();
  103. return 0;
  104. }

bzoj 2300: [HAOI2011]防线修建 凸包的更多相关文章

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

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

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

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

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

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

  4. BZOJ 2300 [HAOI2011]防线修建 ——计算几何

    只需要倒着插入,然后维护一个凸包就可以了. 可以用来学习set的用法 #include <map> #include <set> #include <cmath> ...

  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. 【BZOJ2300】[HAOI2011]防线修建 set维护凸包

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

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

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

随机推荐

  1. sql server 2008 去除html标签

    由于商品详情数据库的字段是text,存放的是html,但是要求导出的商品详情中只是商品的描述,不要标签,原来打算先把数据导入excel中,然后利用java的正则去替换,结果由于商品详情太大,一个单元格 ...

  2. Java 学习 day08

    01-面向对象(多态-概念) package myFirstCode; /* 多态:可以理解为事务存在的多种体现形态. 人:男人,女人 动物:猫,狗 猫 x = new 猫(); 动物 x = new ...

  3. 【BZOJ3270】博物馆 期望DP+高斯消元

    [BZOJ3270]博物馆 Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n ...

  4. 自然常数e的神奇之美

  5. saltStack 证书管理

    SaltStack 使用 SSL 签证的方式进行安全认证,我们可以在 Master 端看到 Minion 端的整数签证请求 1.查看当前证书签证情况 [root@SaltStack-Master ~] ...

  6. VS2017下编译iconv

    从http://www.gnu.org/software/libiconv/ 下载 libiconv-1.11.1, 这是最后一个支持MSVC编译的版本. 打开 Visual Studio 2017 ...

  7. Linux显示网络相关信息

    netstat -tlun    查看本机监听的端口 netstat -an      查看本机所有的网络连接 netstat -rn      查看本机路由表 -t TCP协议 -u UDP协议 - ...

  8. 深入理解ByteBuffer(转)

    转:http://blog.csdn.net/workformywork/article/details/26699345?utm_source=tuicool&utm_medium=refe ...

  9. eclipse安装Activiti Designer插件(转载:http://blog.csdn.net/qq_33547950/article/details/54926435)

    为了完成毕业设计,需要学习Activiti.万事开头难,果然刚开始就遇到了问题.<Activiti实战>和视频教程里提供的安装Activiti Designer插件方法(即下文方法一)不能 ...

  10. RLearning第2弹:创建数据集

    任何一门语言,数据类型和数据结构是最基础,也是最重要的,必须要学好!1.产生向量 a<-c(1,2,5,3,6,-2,4) b<-c("one","two&q ...