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

先说下动态凸包怎么写吧,搞棵平衡树存上下凸壳然后每次插入一个点就往他左右维护看是否满足凸性否则就弹出,就是这么简单

这道题就是删点然后询问凸壳,那么离线反着做就行了

出题人还是挺良心的直接让你维护上凸壳就行了,还不用管边界条件

用set打了一下,比较慢但还是挺好打的= =

换新blog挺多功能得试试的,现在想搞个像HZWER的那个球还有一个虾米等有时间试试(当然还有头像!!!)

好了不多说了发完睡觉了= =

CODE:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
typedef pair<int,int> ii;
typedef set<ii>::iterator iter;
#define fi first
#define se second
#define sqr(x) ((x)*(x))
inline double dist(ii u,ii v) {return sqrt(sqr(u.fi-v.fi)+sqr(u.se-v.se));}
inline int cross(ii x,ii y,ii z) {
return (y.fi-x.fi)*(z.se-x.se)-(y.se-x.se)*(z.fi-x.fi);
}
set<ii> gap;
#define maxn 201000
int a[maxn][],c[maxn][];
bool b[maxn];
double sum,ans[maxn];
inline void del(iter x){
iter u=x,v=x;
u--,v++;
sum-=dist(*u,*x)+dist(*x,*v);
sum+=dist(*u,*v);
gap.erase(x);
}
inline void ins(ii x){
iter it=gap.upper_bound(x);
--it;
iter v=it,u;++v;
if (cross(*it,x,*v)>=) return;
gap.insert(x);
it=gap.find(x);
v=it,u=it;
--u,++v;
sum+=dist(*u,*it)+dist(*it,*v);
sum-=dist(*u,*v);
for (iter v=it,u;;v=it){
++v;u=v;++v;
if (v==gap.end()) break;
if (cross(*it,*u,*v)<) break;
del(u);
}
for (iter v=it,u;;v=it){
--v;
if (v==gap.begin()) break;
u=v;--v;
if (cross(*v,*u,*it)<) break;
del(u);
}
}
int main(){
int n,m,q;
scanf("%d%d%d",&n,&a[][],&a[][]);
scanf("%d",&m);
for (int i=;i<=m;i++) scanf("%d%d",a[i],a[i]+);
scanf("%d",&q);
for (int i=;i<=q;i++) {
scanf("%d",c[i]);
if (c[i][]==) scanf("%d",c[i]+),b[c[i][]]=;
}
gap.insert(ii(,));
gap.insert(ii(n,));
sum=n;
for (int i=;i<=m;i++) if (!b[i]) ins(ii(a[i][],a[i][]));
for (int i=q;i;i--) {
if (c[i][]==) ins(ii(a[c[i][]][],a[c[i][]][]));
else ans[i]=sum;
}
for (int i=;i<=q;i++)
if (ans[i]) printf("%.2lf\n",ans[i]);
return ;
}

BZOJ [HAOI2011]防线修建(动态凸包)的更多相关文章

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

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

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

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

  3. 【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set

    一句话题意:给你一个凸包,每次可以插入一个点或者询问周长. 动态凸包裸题嘛,用\(Set\)实现.最初每个点坐标做乘三处理,便于取初始三角形的重心作为凸包判定原点. #include <bits ...

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

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

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

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

  6. 【BZOJ2300】[HAOI2011]防线修建 set维护凸包

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

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

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

  8. P2521 [HAOI2011]防线修建

    题目链接:P2521 [HAOI2011]防线修建 题意:给定点集 每次有两种操作: 1. 删除一个点 (除开(0, 0), (n, 0), 与指定首都(x, y)) 2. 询问上凸包长度 至于为什么 ...

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

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

随机推荐

  1. model first,DB first,code first

    code first迁移数据库1.打开程序包管理器控制台2.运行Enable-Migrations,运行之后会生成Migrations文件夹与相应的文件 Configuration.cs3.设置 Au ...

  2. iOS开发网络篇之文件下载、大文件下载、断点下载

    from: http://www.jianshu.com/p/f65e32012f07

  3. IOS开发-UI学习-UIPageControl(页码控制器)的使用

    UIPageControl即页码控制器,是在翻动图片阅览时下面显示的几个小点,属性设置如下: UIPageControl *pagecontrol = [[UIPageControl alloc]in ...

  4. 【转】Android ListView加载不同的item布局

    原创教程,转载请保留出处:http://www.eoeandroid.com/thread-72369-1-1.html     最近有需求需要在listView中载入不同的listItem布局,开始 ...

  5. javascript AOP

    Function.prototype.bind = function(b) { var a = this; return function() { a.apply(b, arguments) } }; ...

  6. jQuery初始化

    jQuery 初始化的理解 var jQuery = function( selector, context ) { // The jQuery object is actually just the ...

  7. HDU-1754-I Hate It(线段树,简单,不过好像有点问题)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1754 题目不难,不过开始我犯了一个低级错误,输入n,m,m代表操作的数目,我没有写了,写代码的时候,就 ...

  8. Mysql密码忘记后如何重设密码

    1. 首先检查mysql服务是否启动,若已启动则先将其停止服务 2. 打开第一个cmd窗口,切换到mysql的bin目录,运行命令: mysqld --defaults-file="C:\P ...

  9. document.body.clientHeight的取值

    http://www.cnblogs.com/fullhouse/archive/2012/01/05/2313800.html 有时候需要取页面的底部, 就会用到document.body.clie ...

  10. bootstrap 树

    http://jsfiddle.net/jhfrench/GpdgF/ 把原文的i标签中的图标显示出来: 源码: <div class="tree well"> < ...