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

动态凸包裸题嘛,用\(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. 前端必须掌握的 nginx 技能(2)

    概述 作为一个前端,我觉得必须要学会使用 nginx 干下面几件事: 代理静态资源 设置反向代理(添加https) 设置缓存 设置 log 部署 smtp 服务 设置 redis 缓存(选) 下面我按 ...

  2. 我非要捅穿这 Neutron(三)架构分析与代码实现篇(基于 OpenStack Rocky)

    目录 文章目录 目录 Neutron 的软件架构分析与实现 Neutron Server 启动流程 获取 WSGI Application Core API & Extension API C ...

  3. nginx禁止指定的user_agent访问

    #禁止指定user_agent(浏览器标识)if ($http_user_agent ~ 'curl|baidu'){ return 403;} if ($http_user_agent ~* 'cu ...

  4. linux 系统下删除tar.gz的tar

    在终端输入: 1.删除环境配置 vi /etc/profile 删除对应的jdk配置. 2.删除jvm rm /usr/lib/jvm 3.删除对应的tar解压的java目录. 4.输入 java 或 ...

  5. OpenCV 中获取图像或矩阵最大、最小值的简便方法

    C++: void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc ...

  6. win10更新导致chrome打开网页速度太慢

    升级win10之后如果出现chrome内核的浏览器网页总是打不开 打开很慢 而ie和edge是可以正常访问的 用这个方法可以 我弄了几天终于 搞好了 我直接转载过来了 近期,工程师收到大量反馈360浏 ...

  7. codeblocks无法识别的16位程序解决方法

    被codeblocks心态搞崩了,分享一下经验给大家,具体就是无法运行编译好的程序,还有就是调试功能没法用. 查了很多资料,自己搞了一个终极解决方法:1卸载codeblocks,2打开我的电脑,全盘搜 ...

  8. 【VS开发】【图像处理】RGB各种格式

    RGB格式 RGB组合格式 名字 RGB组合格式 描述 此格式用来匹配PC图形帧缓存.每个像素占据8,16,24或32个位,他们都是组合像素格式,其意为在内存中所有像素数据都是相邻排列的.当使用这些格 ...

  9. seata demo

    0. 介绍 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案.Fes ...

  10. http请求跨域问题分析

    http请求跨域问题分析 个人认为可能涉及很多http的知识,本人才疏学浅不敢妄自揣测,只是做个笔记为了以后对比理解,从原生fetch说起吧,前提假设有个后端服务,我用express来模拟,如下: v ...