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

动态凸包裸题嘛,用\(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. python 实验3 循环结构

    实验一   九九乘法表 ‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫‪描述:输出一个九九乘法表,格式如下:‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫‪ 1*1=1‪‪ ...

  2. malloc分配内存进行对齐的操作

    昨天面试高通Linux Kernel,面试官考了一个malloc内存对齐的问题,我晚上的时候细细的想了一下,实在是学习的不到位. 有的时候真的应该感谢,像是Qt.Ubuntu Gcc的编译器,他们做的 ...

  3. 部署php程序报错:站点已关闭

    场景: 之前把公司线上的php源码包拿到笔记本的虚拟机上测试部署,部署完成后通过浏览器访问总是出现站点已关闭 原因:把线上php程序配置文件config.php里面的数据库连接信息改成了笔记本虚拟机的 ...

  4. python目录和引用关系

    这是我的项目目录 像这样引用没有直接画横线   但是运行时会报错:找不到 typeidea.typeidea.文件路径 图片拖出来看更清晰 后期补充: 解决方案: 如:右击:typeidea----- ...

  5. 黑龙江网络安全技能竞赛awd后门分析复现

    0x0环境 0x1分析复现 0x2感想 围绕主办方留下的浅显后门可以打满整场,想拿第一还是要搞定深层后门

  6. 插入排序--python

    import random def insert_sort(nums): # 排序趟数 for i in range(1, len(nums)): current = nums[i] pre_inde ...

  7. (2.2)【转】mysql的SQL笔记

    一千行 MySQL 详细学习笔记 IT技术思维 4月1日 ↑↑↑点上方蓝字关注并星标⭐「IT技术思维」 一起培养顶尖技术思维 作者:格物 原文链接:https://shockerli.net/post ...

  8. for循环语句的用法

    1.for(int i : index){}用法[又称是foreach用法]: 比如: public class Test { public static void main(String[] arg ...

  9. [BZOJ 1013] [JSOI2008]球形空间产生器

    [BZOJ 1013] [JSOI2008]球形空间产生器 题面 给出一个n维球体上的n+1个点,求球心坐标 分析 设球心坐标为\((x_1,x_2,\dots x_n)\),由于一个球体上的所有点到 ...

  10. ubuntu 安装 TensorFlow、opencv3 的 tips

    安装tensorflow: 创建tensorflow虚拟环境 conda create -n  tensorflow python=2.7 输入命令查看可用版本的tensorflow-gpu cond ...