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

动态凸包裸题嘛,用\(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 ();}
}

转载于:https://www.cnblogs.com/maomao9173/p/10931793.html

【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set相关推荐

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

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

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

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

  3. bzoj2300 [HAOI2011]防线修建 离线凸包

    这个题可以在线做,splay维护凸包的同时维护区间最值线段树,当删除一个点就找跨过这个点的不在凸包上的点的y最值,然后分下去 由于一次确定一个点,所以复杂度还是nlogn的,只是比较难写 如果一个操作 ...

  4. P2521 [HAOI2011]防线修建

    传送门 一眼看出可以倒着做转为加点维护凸包,然后--然后我就不会了-- 看了一眼题解,大概是这样的,我们先把所有点都读进来,然后按极角排序,也就是说定义点的大小为他们极角的大小(本题里实际上直接按x坐 ...

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

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

  6. [bzoj2300] [HAOI2011]防线修建

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

  7. cogs 547:[HAOI2011] 防线修建

    ★★★☆   输入文件:defense.in   输出文件:defense.out   简单对比 时间限制:1 s   内存限制:128 MB 题目描述: 近来A国和B国的矛盾激化,为了预防不测,A国 ...

  8. [haoi2011]防线修建

    动态加点维护凸包. 论STL的熟练运用. #include<cstdio> #include<algorithm> #include<cstring> #inclu ...

  9. BZOJ 2300: [HAOI2011]防线修建|set维护凸壳

    因为只支持插入操作,所以需要倒过来做.. 第一次写维护凸壳的东西-不抄题解..自己YY斜率乱搞(都忘了写叉乘)代码又长常数又大 1A一刻赛艇~ 还是找一个靠谱的的模板吧... #include< ...

最新文章

  1. mysql5.0修改字符集,查看mysql字符集及修改表结构
  2. 活动 | 5G万物智联下互联网通信技术升级之路
  3. jQuery 效果 - 动画 animate() 方法
  4. MySQL 查询数据表
  5. 45 WM配置-作业-库存盘点-清除差异(库存管理接口)
  6. 微信内置浏览器调起外部浏览器打开指定网页连接
  7. 第五章 线性回归 学习笔记上
  8. 《浪潮之巅》读书笔记(上)
  9. E1--千兆以太网接口测试应用2022-09-07
  10. 美年旅游_套餐管理_分页PageHelper
  11. Golang 内存分配之逃逸分析
  12. Proteus和Keil两个软件的联合使用
  13. 类加载器以及双亲委派模式
  14. 【web前端】js json转数组,数组转json,字符串转数字
  15. 计算机视觉、模式识别、机器学习牛人主页
  16. linux下安装php并配置运行环境
  17. 手机有监控功能?分分钟查询手机使用记录!早点知道就好了!
  18. ApiOne URL 调用说明
  19. 什么是阿里云Intel Xeon(Ice Lake) Platinum 8369B服务器?
  20. [Pandas] 相同分组条件下的特定列除第一行以外的值为空

热门文章

  1. linux c++开发问题汇总
  2. 文档生产工具 Doxygen
  3. xhan/qqbot试用
  4. atmega8 Flash的使用
  5. 接口与继承字段常量关系
  6. php https server_使用https,$_SERVER['HTTPS']却不等于on?
  7. python输出日期的模版_python按日期区间生成markdown日记模板
  8. 【转载】tkinter多线程防假死
  9. [C#学习笔记]C#中的decimal类型——《CLR via C#》
  10. 在人生路上对我影响最大的三位老师