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

可以用来学习set的用法

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define inf 100000
#define ll long long
#define mp make_pair
#define sqr(x) x*x int n,x,y,m,k;
struct Vector{
double x,y;
void print(){printf("Vector (%.3f,%.3f)\n",x,y);}
}; struct Point{
int x,y;
void print(){printf("Point (%d,%d)\n",x,y);}
bool operator < (const Point b) const{
return x==b.x?y<b.y:x<b.x;
}
}a[200005]; set <Point> s; struct Options{int opt,id;}q[200005]; double dist (Point a,Point b)
{
// printf("dist\n");
// a.print();b.print();
// printf("The ans is %.6f\n",sqr((double)a.x-b.x)+sqr((double)a.y-b.y));
return sqrt(((double)a.x-b.x)*((double)a.x-b.x)+((double)a.y-b.y)*((double)a.y-b.y));
} Vector operator - (Point a,Point b)
{Vector ret;ret.x=a.x-b.x;ret.y=a.y-b.y;return ret;} double operator * (Vector a,Vector b)
{
// a.print(); printf("* * *\n");
// b.print();
// printf("= %.6f\n",a.x*b.y-a.y*b.x);
return a.x*b.y-a.y*b.x;
} int tot,del[200005];
double ans[200005],now;
Point newnode; void init()
{
now=n*1.0;
newnode.x=0;newnode.y=0;
s.insert(newnode);
// newnode.x=0;newnode.y=-inf;
// s.insert(newnode);
newnode.x=n;newnode.y=0;
s.insert(newnode);
// newnode.x=n;newnode.y=-inf;
// s.insert(newnode);
// printf("now is %.6f\n",now);
} void add(Point x)
{
// printf("Add "); x.print();
set<Point>::iterator it,iL,iR;
it=s.lower_bound(x);
iL=it;iL--;iR=it;
if ((x-*iL)*(*iR-x)>0) return;
// printf("New node\n");
now-=dist(*iL,*iR);
for (;;)
{
iR=it;it++;
if (it==s.end()) break;
if ((*iR-x)*(*it-x)>0)
{
now-=dist(*iR,*it);
s.erase(*iR);
// printf("del R\n"); while (1);
}
else break;
}
for (;;)
{
if (iL==s.begin()) break;
Point L=*iL; iL--;
// (*iL-*it).print();
// (*it-x).print();
if ((L-*iL)*(x-*iL)>0)
{
now-=dist(*iL,L);
s.erase(L);
// printf("del L\n"); //while(1);
}
else break;
}
s.insert(x);
it=s.find(x);
iL=it;iL--;iR=it;iR++;
now+=dist(*iL,x)+dist(x,*iR);
// printf("now is %.6f\n",now);
return ;
} void Finout()
{
freopen("defense.in","r",stdin);
freopen("defense.out","w",stdout);
} int main()
{
// freopen("in.txt","r",stdin);
scanf("%d%d%d",&n,&x,&y);
scanf("%d",&m);
F(i,1,m) scanf("%d%d",&a[i].x,&a[i].y);
scanf("%d",&k);
// printf("k is %d\n",k);
F(i,1,k)
{
scanf("%d",&q[i].opt);
switch(q[i].opt)
{
case 1:scanf("%d",&q[i].id); del[q[i].id]=1;break;
case 2:q[i].id=++tot; break;
}
}
// F(i,1,k) printf("Opt %d id %d\n",q[i].opt,q[i].id);
init(); newnode.x=x;newnode.y=y;add(newnode);
F(i,1,m) if (!del[i]) add(a[i]);
D(i,k,1)
{
switch(q[i].opt)
{
case 1:add(a[q[i].id]);break;
case 2:ans[q[i].id]=now;break;
}
}
F(i,1,tot) printf("%.2f\n",ans[i]);
}

  

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. Git .gitignore 设置为全局global

    在操作Git时,我们会将修改的内容$git add . 到Git,Git会提示我们哪些文件都修改了.此时提示中会包括系统自动修改的文件,bin文件等.而我们add到Git时,并不希望将这些文件也一同a ...

  2. CSS布局之-强大的负边距

    css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果.很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的. ...

  3. Idea 2017注册码

    BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  4. LR中下载文件的脚本

    #include "web_api.h" Action(){ int iflen; //文件大小 long lfbody; //响应数据内容大小 web_url("xxx ...

  5. 洛谷 P1168 中位数

    题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.[color=red]即[/color] ...

  6. Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理

    面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问"茴香豆的茴字有哪几种写法?" 所谓代理模式,是指客户端(Cl ...

  7. Sublime 设置移动光标快捷键

    发现问题 在使用Sublime和其他编辑器一个很不爽的问题是:在输入一个函数或者有左右的符号或者在引号内时,总是要跳出来,无奈方向键又在主键盘的另一边,只能不断的切换,太特么操蛋,就不能让手指不离开主 ...

  8. gEdit - GTK+ 基础文本编辑器

    语法 gedit [--help] [--version] [文件名] [文件名] [文件名] 等等... 描述 gEdit 是一个 X窗口系统下的基础文本编辑器由 GTK+ 写成.它现在支持建立,打 ...

  9. JavaWeb项目实现图片验证码

    一.什么是图片验证码? 可以参考下面这张图: 我们在一些网站注册的时候,经常需要填写以上图片的信息. 这种图片验证方式是我们最常见的形式,它可以有效的防范恶意攻击者采用恶意工具,调用“动态验证码短信获 ...

  10. 【414】Code::Blocks增加主题

    替换文件地址:C:\Users\z5194293\AppData\Roaming\CodeBlocks 文件下载地址:default.rar 通过 Settings -> Editor... - ...