【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set
一句话题意:给你一个凸包,每次可以插入一个点或者询问周长。
动态凸包裸题嘛,用\(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的更多相关文章
- 【题解】P2521 [HAOI2011]防线修建(动态凸包)
[题解]P2521 [HAOI2011]防线修建(动态凸包) 凸包是易插入不好删除的东西,按照剧情所以我们时光倒流 然后问题就是维护凸包的周长,支持加入 本来很简单,但是计算几何就是一些小地方经验不足 ...
- [luogu P2521] [HAOI2011]防线修建
[luogu P2521] [HAOI2011]防线修建 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国 ...
- BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )
离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...
- P2521 [HAOI2011]防线修建
题目链接:P2521 [HAOI2011]防线修建 题意:给定点集 每次有两种操作: 1. 删除一个点 (除开(0, 0), (n, 0), 与指定首都(x, y)) 2. 询问上凸包长度 至于为什么 ...
- Bzoj2300 / 洛谷P2521 [HAOI2011]防线修建
题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...
- 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)
2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...
- 【BZOJ2300】[HAOI2011]防线修建 set维护凸包
[BZOJ2300][HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可 ...
- bzoj千题计划236:bzoj2300: [HAOI2011]防线修建
http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...
- 【bzoj2300】[HAOI2011]防线修建 离线+STL-set维护凸包
题目描述 给你(0,0).(n,0).(x,y)和另外m个点,除(0,0)(n,0)外每个点横坐标都大于0小于n,纵坐标都大于0. 输入 第一行,三个整数n,x,y分别表示河边城市和首都是(0,0), ...
随机推荐
- Jmeter(六)事务
事务是性能测试之必不可少的关注点, Jmeter默认把每一个请求都统计成了一个事务, 但有时候我们根据业务需求, 会把多个操作统计成一个事务, Jmeter当然也考虑到了这个需求, 因此我们可以通过逻 ...
- ping命令介绍
1.ping是TCP/IP协议的一部分,所以只要安装了TCP/IP协议就(无论windows或linux)都可以使用ping命令. 2.ping命令的原理:本机创建一个数据包发送给(ping对象)目标 ...
- 阶段3 2.Spring_01.Spring框架简介_01.spring课程四天安排
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- Report List 报表开发
1. Report List的输出定义 * ...NO STANDARD PAGE HEADING: 输出的报表不包含表头: * ...LINE-SIZE col : 输出的报表不包含表头: * .. ...
- IDEA和VS快捷键对比
IDEA和Visual Studio快捷键对比 VS F5 F9 resume programe 恢复程序 Alt+F10 show executio ...
- c++ 数据抽象 、封装 接口(抽象类)
一.数据抽象 即,只向外界提供关键信息,并隐藏其后台的实现细节 ———— 一种依赖于接口和实现分离的编程(设计)技术 例如,程序可以调用 sort() 函数,而不需要知道函数中排序数据所用到的算法 c ...
- ubuntu/work
1.Ubuntu16.04 创建桌面快捷方式 cd /usr/share/applications vim goland.desktop ##add content [Desktop Entry] E ...
- scrapy架构图与执行流程
概览 本文描述了Scrapy的架构图.数据流动.以及个组件的相互作用 架构图与数据流 上图中各个数字与箭头代表数据的流动方向和流动顺序,具体执行流程如下: 0. Scrapy将会实例化一个Crawle ...
- 使用Koa.js离不开这十个中间件
随着ES6的普及,async/await的语法受到更多JS开发者的青睐,Koa.js作为比较早支持使用该语法的Node框架越来越受到大家的喜爱,虽然Koa.js本身支持的功能很有限,但官方和社区提供了 ...
- 匿名函数lambda和map函数
一.map函数,实现迭代操作 map(f1,x) f1为函数的名称(不加括号),x为map的参数,示例如下: def add(a): return a+10 print map(add,[1,2,3] ...