题目大意

动态删点,求凸包周长

分析

反过来变成动态加点

用set维护平衡树

具体是找到凸包上左右两点

拆开

就可以把左边当作顺时针求的一个凸包,右边当作逆时针求的一个凸包,像栈那样出set就好了

注意新点在凸包内不用管它

每个点进一次出一次

\(O(n \log n)\)

solution

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <cctype>
  6. #include <algorithm>
  7. #include <set>
  8. using namespace std;
  9. typedef double db;
  10. const db eps=1e-7;
  11. const int M=200007;
  12. inline int rd(){
  13. int x=0;bool f=1;char c=getchar();
  14. for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
  15. for(;isdigit(c);c=getchar()) x=x*10+c-48;
  16. return f?x:-x;
  17. }
  18. db sum;
  19. int n,m;
  20. int kd[M],opr[M];
  21. bool vis[M];
  22. db ans[M];
  23. struct pt{
  24. db x,y;
  25. pt(db _x=0.0,db _y=0.0){x=_x; y=_y;}
  26. }p[M];
  27. /*精度已经把我搞啥了我都不知道加不加,加了set直接炸
  28. bool eq(db x,db y){return fabs(x-y)<=eps;}
  29. bool neq(db x,db y){return !eq(x,y);}
  30. bool le(db x,db y){return eq(x,y)||x<y;}
  31. bool ge(db x,db y){return eq(x,y)||x>y;}
  32. */
  33. pt operator -(pt x,pt y){return pt(x.x-y.x,x.y-y.y);}
  34. pt operator +(pt x,pt y){return pt(x.x+y.x,x.y+y.y);}
  35. pt operator *(pt x,db d){return pt(x.x*d,x.y*d);}
  36. pt operator /(pt x,db d){return pt(x.x/d,x.y/d);}
  37. bool operator <(pt x,pt y){if(x.x!=y.x)return x.x<y.x;return x.y<y.y;}
  38. db dot(pt x,pt y){
  39. return x.x*y.x+x.y*y.y;
  40. }
  41. db cross(pt x,pt y){
  42. return x.x*y.y-x.y*y.x;
  43. }
  44. db area(pt x,pt y,pt z){
  45. return cross(y-x,z-x);
  46. }
  47. db length(pt x){
  48. return sqrt(dot(x,x));
  49. }
  50. set<pt>S;
  51. typedef set<pt>::iterator its;
  52. void gao(pt x){
  53. its r=S.lower_bound(x);
  54. its l=r; --l;
  55. if(area(*l,x,*r)>=0) return;//凸包内
  56. sum-=length(*r-*l);
  57. its tp;
  58. while(1){
  59. tp=r;
  60. ++r;
  61. if(r==S.end()) break;
  62. if(area(*r,*tp,x)<=0){
  63. sum-=length(*tp-*r);
  64. S.erase(tp);
  65. }
  66. }
  67. while(1){
  68. if(l==S.begin()) break;
  69. tp=l;
  70. --l;
  71. if(area(*l,*tp,x)>=0){
  72. sum-=length(*tp-*l);
  73. S.erase(tp);
  74. }
  75. else break;
  76. }
  77. S.insert(x);
  78. l=r=S.find(x);
  79. l--; r++;
  80. sum+=length(x-*l);
  81. sum+=length(x-*r);
  82. }
  83. int main(){
  84. int i,z,x,y;
  85. z=rd(),x=rd(),y=rd();
  86. pt nw=pt(0,0);
  87. S.insert(nw);
  88. nw=pt(z,0);
  89. S.insert(nw);
  90. nw=pt(x,y);
  91. S.insert(nw);
  92. sum=length(pt(x,y))+length(pt(z-x,y));
  93. n=rd();
  94. for(i=1;i<=n;i++){
  95. x=rd(),y=rd();
  96. p[i]=pt(x,y);
  97. }
  98. m=rd();
  99. for(i=1;i<=m;i++){
  100. kd[i]=rd();
  101. if(kd[i]==1){
  102. opr[i]=rd();
  103. vis[opr[i]]=1;
  104. }
  105. }
  106. for(i=1;i<=n;i++)
  107. if(!vis[i]) gao(p[i]);
  108. for(i=m;i>0;i--){
  109. if(kd[i]==2) ans[i]=sum;
  110. else gao(p[opr[i]]);
  111. }
  112. for(i=1;i<=m;i++) if(kd[i]==2) printf("%.2lf\n",ans[i]);
  113. return 0;
  114. }

bzoj 2300 [HAOI2011]防线修建 set动态维护凸包的更多相关文章

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

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

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

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

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

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

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

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

  5. 【bzoj2300】[HAOI2011]防线修建 离线+STL-set维护凸包

    题目描述 给你(0,0).(n,0).(x,y)和另外m个点,除(0,0)(n,0)外每个点横坐标都大于0小于n,纵坐标都大于0. 输入 第一行,三个整数n,x,y分别表示河边城市和首都是(0,0), ...

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

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

  7. BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)

    题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...

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

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

  9. BZOJ [HAOI2011]防线修建(动态凸包)

    听说有一种很高端的东西叫动态凸包维护dp就像学一下,不过介于本人还不会动态凸包就去学了下,还是挺神奇的说,维护上下凸包的写法虽然打得有点多不过也只是维护复制黏贴的事情而已罢了. 先说下动态凸包怎么写吧 ...

随机推荐

  1. java基础——接口与抽象类的区别

    (1)首先接口和抽象类的设计目的就是不一样的.接口是对动作的抽象,而抽象类是对根源的抽象. (2)对于抽象类,一个类只能继承一个抽象类.但是一个类可以同时实现多个接口. (3)接口是公开的,里面不能有 ...

  2. NSStream实现发送和接受数据

    一.基本概念在iOS中以NSStream(流)来发送和接收数据,可以设置流的代理,对流状态的变化做出相应.1连接建立2接收到数据3连接关闭NSStream:数据流的父类,用于定义抽象特性,例如:打开. ...

  3. fiddler 模拟发送post请求

    打开fiddler,选择在右边的Composer工具栏,打开Parsed选项,然后数据发送协议,例如选择POST, POST右边输入框可以输入访问地址, 下方的输入框可以输入发送的输入操作,例如发送的 ...

  4. cocos2dx lua 热更新方案的实现

    (Upgrade.h) #include <stdio.h> #include "cocos2d.h" #include "framework/utils/U ...

  5. 使用虚拟环境来管理python的包

    1.背景 在开发python项目的过程中,我们会用到各种各样的包,我们使用pip来管理包,请看下图我们刚装好python解释器时已安装的包: 但是随着我们疯狂的使用pip install xxx后,系 ...

  6. CPL学习笔记(一)

    整型 计算机的内存的基本单位是位(bit),可以将其看作电子开关,可以开,表示1:也可以关表示0. 字节(byte)通常指八位的内存单元. 8bit=1byte=1B; 1KB=1024B; 1M=1 ...

  7. Python学习笔记: 闭包

    闭包的基本定义 在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数.这个被引用的自由变 ...

  8. 创建Django项目并将其部署在腾讯云上

    这段时间在做scrapy爬虫,对爬出来的数据基于Django做了统计与可视化,本想部署在腾讯云上玩玩,但是因为以前没有经验遇到了一些问题,在这里记录一下: 首先说下Django的创建与配置: 1. 创 ...

  9. Do not pour out HDU - 5954 数学积分

    题目:题目链接 思路:纯高等数学问题,不过不是很好积分,具体积分思路及过程参考大佬博客——https://blog.csdn.net/danliwoo/article/details/53002695 ...

  10. ACM Changchun 2015 L . House Building

    Have you ever played the video game Minecraft? This game has been one of the world's most popular ga ...