一句话题意:给你一个凸包,每次可以插入一个点或者询问周长。

动态凸包裸题嘛,用\(Set\)实现。最初每个点坐标做乘三处理,便于取初始三角形的重心作为凸包判定原点。

#include <bits/stdc++.h>
using namespace std; const int N = 500000 + 5;
const double eps = 1e-8; int n, m, x, y, q, px[N], py[N], ban[N]; struct Point {
int x, y; double ang;
}o; Point operator - (Point lhs, Point rhs) {
return (Point) {lhs.x - rhs.x, lhs.y - rhs.y};
} double disPP (Point lhs, Point rhs) {
return hypot (abs (lhs.x - rhs.x), abs (lhs.y - rhs.y));
} bool operator < (Point lhs, Point rhs) {
if (fabs (lhs.ang - rhs.ang) > eps) {
return lhs.ang < rhs.ang;
} else {
return disPP (lhs, o) < disPP (rhs, o);
}
} int Cross (Point lhs, Point rhs) {
return lhs.x * rhs.y - lhs.y * rhs.x;
} struct Query {int opt, x;}qry[N]; set <Point> s; typedef set <Point> :: iterator Iter; double cur_ans = 0; stack <double> ans; Iter Prev (Iter it) {
return it == s.begin () ? (--s.end ()) : (--it);
} Iter Next (Iter it) {
return (++it) == s.end () ? s.begin () : it;
} void Insert (Point P) {
Iter nxt = s.lower_bound (P);
if (nxt == s.end ()) {
nxt = s.begin ();
}
Iter pre = Prev (nxt);
if (Cross (P - *pre, *nxt - P) <= 0) {
return; // 已经在凸包里面
}
s.insert (P);
Iter i, j, cur = s.find (P);
i = Prev (cur), j = Prev (i);
pre = Prev (cur), nxt = Next (cur);
cur_ans += disPP (*cur, *pre);
cur_ans += disPP (*cur, *nxt);
cur_ans -= disPP (*pre, *nxt);
while (Cross (*i - *j, *cur - *i) <= 0) {
cur_ans -= disPP (*cur, *i);
cur_ans -= disPP (*i, *j);
cur_ans += disPP (*cur, *j);
s.erase (i); i = j; j = Prev (j);
}
i = Next (cur), j = Next (i);
while (Cross (*i - *cur, *j - *i) <= 0) {
cur_ans -= disPP (*cur, *i);
cur_ans -= disPP (*i, *j);
cur_ans += disPP (*cur, *j);
s.erase (i); i = j; j = Next (j);
}
} int main () {
// freopen ("data.in", "r", stdin);
cin >> n >> x >> y >> m;
x *= 3, y *= 3, n *= 3;
for (int i = 1; i <= m; ++i) {
cin >> px[i] >> py[i];
px[i] *= 3; py[i] *= 3;
}
cin >> q;
for (int i = 1; i <= q; ++i) {
cin >> qry[i].opt;
if (qry[i].opt == 1) {
cin >> qry[i].x;
ban[qry[i].x] = true;
}
}
o = (Point) {(n + x) / 3, y / 3, 0};
Point P1 = (Point) {0, 0, atan2 (0 - o.y, 0 - o.x)};
Point P2 = (Point) {n, 0, atan2 (0 - o.y, n - o.x)};
Point P3 = (Point) {x, y, atan2 (y - o.y, x - o.x)};
s.insert (P1);
s.insert (P2); cur_ans += disPP (P2, P3);
s.insert (P3); cur_ans += disPP (P1, P3);
for (int i = 1; i <= m; ++i) {
if (!ban[i]) {
Insert ((Point) {px[i], py[i], atan2 (py[i] - o.y, px[i] - o.x)});
}
}
for (int i = q; i >= 1; --i) {
if (qry[i].opt == 1) {
int t = qry[i].x;
Insert ((Point) {px[t], py[t], atan2 (py[t] - o.y, px[t] - o.x)});
} else {
ans.push (cur_ans);
}
}
while (!ans.empty ()) {
cout << fixed << setprecision (2) << ans.top () / 3.0 << endl;
ans.pop ();
}
}

【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set的更多相关文章

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

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

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

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

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

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

  4. P2521 [HAOI2011]防线修建

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

  5. Bzoj2300 / 洛谷P2521 [HAOI2011]防线修建

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

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

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

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

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

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

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

  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. 【flask】环境配置-python-dotenv的使用

    [自动发现程序实例] 一般来说,在执行flask run命令运行程序前,我们需要提供程序实例所在模块的位置 . Flask会自动探测程序实例,自动探测存在下面这些规则: 从当前目录寻找app.py和w ...

  2. git使用遇到的问题

    1.我新建了一个django项目,然后又在git上新建了一个仓库,然后我在django的项目文件内,将git上的项目clone到这个文件内的时候 git clone https://gitee.com ...

  3. vim技巧1

    在编辑模式或可视模式下输入的命令会另外注明.1. 查找   /xxx(?xxx)       表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示                   ...

  4. sql server 字符串拆分

    最近项目调取存储的时候直接传入string 作为in的查询范围,结果报错了,深思之后才发现,数据库对于传进来的String,并不是我们想的直接可以作为参数,而是作为一个整体,而in是需要一个类似arr ...

  5. 使用IDEA工具创建本地项目并且上传到码云

    需要条件: 1.码云/Github建好的git项目 2.IDEA编辑器 3.本地项目 步骤1:创建远程项目 步骤2:复制远程项目地址  注意:此处码云官方已经给出上传项目方法,不过用的是命令行的形式, ...

  6. CSS3 长度单位

    http://www.w3chtml.com/css3/units/length/vh.html https://www.html.cn/book/css/values/length/vh.htm . ...

  7. CTF—攻防练习之HTTP—PUT上传漏洞

    主机:192.168.32.152 靶机:192.168.32.159 中间件PUT漏洞 包括apache,tomcat,IIS等中间件设置支持的HTTP方法(get,post,head,delete ...

  8. TensorFlow基础总结

    1.基础概念 Tensor:类型化的多维数组,图的边:Tensor所引用的并不持有具体的值,而是保持一个计算过程,可以使用session.run()或者t.eval()对tensor的值进行计算. O ...

  9. python 包的概念

    包的概念 包的概念: 在python中包即使模块,是一系列功能的集合体, 为什么要用包? 提高开发效率 如何用包 import ... from ... import ..... 如何认识它就是一包 ...

  10. input type=file accept中文件格式限制

    原文链接:https://blog.csdn.net/usuallyuser/article/details/83060341 accept="application/msexcel,app ...