【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), ...
随机推荐
- python threading.current_thread().name和.getName()有什么区别
今天学到python多线程这块,想显示当前线程是主线程还是子线程.网上一搜,有个方法叫 threading.current().name 定海偶然 但是发现,同样的threading.current_ ...
- ArcGISDynamicMapServiceLayer 和 ArcGISTiledMapServiceLayer 区别
ArcGISDynamicMapServiceLayer(动态地图服务)通常用于实时显示经常变化的数据,支持控制单个图层可见性,可动态投影.但缺点是显示效果较差,整个服务出图较慢:ArcGISTile ...
- oracle 12 安装
oracle 12 第二版本安装 下载地址 https://www.oracle.com/technetwork/cn/middleware/webcenter/content/downloads/ ...
- 阶段3 2.Spring_06.Spring的新注解_2 spring的新注解-Bean
下面要解决第二部分的配置问题 这两行一出场,就表示可以通过调用构造函数实例化.因为这都是newInstance 上面的需要加上参数,下面的没有任何参数 下面这俩实现的效果不一样. 下面这个除了会创建对 ...
- MySQL orzdba、dodba、top、iostat、vmstat、perf等
1 mysq自带的mysqladmin命令 mysqladmin -usystem -p*** -h127.0.0.1 -P3306 -r -i 1 extended-status \ |grep & ...
- PHP 按照时区获取当前时间
/** * 时间格式化 * @param string $dateformat 时间格式 * @param int $timestamp 时间戳 * @param int $timeoffse ...
- centos8飞行驾驶舱和docker安装
零.先解决cenos8的网络(systemctl restart network.service已被废弃) 1.# vim /etc/sysconfig/network-scripts/ifcfg-e ...
- windows OS安全配置【持续更新20190618】
https://www.52stu.org/?p=76 来源:5号暗区 5号黯区 五号黯区 5号暗区 windows系统的一些加固方法等 关闭445端口: REG ADD HKLM\SYSTEM\Cu ...
- 关于liunx 机器脱机环境(netcore)Nuget包迁移的问题
首先nuget脱机环境是没办法加载第三方nuget包的,我这里的做法是使用nuget缓存文件(正确的做法还是推荐使用自己搭建的nuget服务器然后正常发布,这里只是做应急之需) 我们都知道项目的dot ...
- flaskurl传参用法
from flask import Flask,request app = Flask(__name__) @app.route("/") def index(): return ...