bzoj 2300 [HAOI2011]防线修建 set动态维护凸包
题目大意
动态删点,求凸包周长
分析
反过来变成动态加点
用set维护平衡树
具体是找到凸包上左右两点
拆开
就可以把左边当作顺时针求的一个凸包,右边当作逆时针求的一个凸包,像栈那样出set就好了
注意新点在凸包内不用管它
每个点进一次出一次
\(O(n \log n)\)
solution
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <set>
using namespace std;
typedef double db;
const db eps=1e-7;
const int M=200007;
inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
}
db sum;
int n,m;
int kd[M],opr[M];
bool vis[M];
db ans[M];
struct pt{
db x,y;
pt(db _x=0.0,db _y=0.0){x=_x; y=_y;}
}p[M];
/*精度已经把我搞啥了我都不知道加不加,加了set直接炸
bool eq(db x,db y){return fabs(x-y)<=eps;}
bool neq(db x,db y){return !eq(x,y);}
bool le(db x,db y){return eq(x,y)||x<y;}
bool ge(db x,db y){return eq(x,y)||x>y;}
*/
pt operator -(pt x,pt y){return pt(x.x-y.x,x.y-y.y);}
pt operator +(pt x,pt y){return pt(x.x+y.x,x.y+y.y);}
pt operator *(pt x,db d){return pt(x.x*d,x.y*d);}
pt operator /(pt x,db d){return pt(x.x/d,x.y/d);}
bool operator <(pt x,pt y){if(x.x!=y.x)return x.x<y.x;return x.y<y.y;}
db dot(pt x,pt y){
return x.x*y.x+x.y*y.y;
}
db cross(pt x,pt y){
return x.x*y.y-x.y*y.x;
}
db area(pt x,pt y,pt z){
return cross(y-x,z-x);
}
db length(pt x){
return sqrt(dot(x,x));
}
set<pt>S;
typedef set<pt>::iterator its;
void gao(pt x){
its r=S.lower_bound(x);
its l=r; --l;
if(area(*l,x,*r)>=0) return;//凸包内
sum-=length(*r-*l);
its tp;
while(1){
tp=r;
++r;
if(r==S.end()) break;
if(area(*r,*tp,x)<=0){
sum-=length(*tp-*r);
S.erase(tp);
}
}
while(1){
if(l==S.begin()) break;
tp=l;
--l;
if(area(*l,*tp,x)>=0){
sum-=length(*tp-*l);
S.erase(tp);
}
else break;
}
S.insert(x);
l=r=S.find(x);
l--; r++;
sum+=length(x-*l);
sum+=length(x-*r);
}
int main(){
int i,z,x,y;
z=rd(),x=rd(),y=rd();
pt nw=pt(0,0);
S.insert(nw);
nw=pt(z,0);
S.insert(nw);
nw=pt(x,y);
S.insert(nw);
sum=length(pt(x,y))+length(pt(z-x,y));
n=rd();
for(i=1;i<=n;i++){
x=rd(),y=rd();
p[i]=pt(x,y);
}
m=rd();
for(i=1;i<=m;i++){
kd[i]=rd();
if(kd[i]==1){
opr[i]=rd();
vis[opr[i]]=1;
}
}
for(i=1;i<=n;i++)
if(!vis[i]) gao(p[i]);
for(i=m;i>0;i--){
if(kd[i]==2) ans[i]=sum;
else gao(p[opr[i]]);
}
for(i=1;i<=m;i++) if(kd[i]==2) printf("%.2lf\n",ans[i]);
return 0;
}
bzoj 2300 [HAOI2011]防线修建 set动态维护凸包的更多相关文章
- 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)
2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...
- BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )
离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...
- bzoj 2300 : [HAOI2011]防线修建
set动态维护凸包 #include<iostream> #include<cstdio> #include<cstring> #include<algori ...
- bzoj 2300: [HAOI2011]防线修建 凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题解 这道题让我们维护一个支持动态删除点的上凸壳 并且告诉了我们三个一定不会被删除 ...
- 【bzoj2300】[HAOI2011]防线修建 离线+STL-set维护凸包
题目描述 给你(0,0).(n,0).(x,y)和另外m个点,除(0,0)(n,0)外每个点横坐标都大于0小于n,纵坐标都大于0. 输入 第一行,三个整数n,x,y分别表示河边城市和首都是(0,0), ...
- BZOJ 2300 [HAOI2011]防线修建 ——计算几何
只需要倒着插入,然后维护一个凸包就可以了. 可以用来学习set的用法 #include <map> #include <set> #include <cmath> ...
- BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...
- bzoj2300#2300. [HAOI2011]防线修建
题解:带删点的维护凸包,1.删点2.查询凸包周长 题解:倒着做就成了带加点的维护凸包,加点时维护一下周长就没了 //#pragma GCC optimize(2) //#pragma GCC opti ...
- BZOJ [HAOI2011]防线修建(动态凸包)
听说有一种很高端的东西叫动态凸包维护dp就像学一下,不过介于本人还不会动态凸包就去学了下,还是挺神奇的说,维护上下凸包的写法虽然打得有点多不过也只是维护复制黏贴的事情而已罢了. 先说下动态凸包怎么写吧 ...
随机推荐
- 查询linux文件的MD5值
Linux下查询文件的MD5值:md5sum xxx.iso.md5 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5全称是报文摘要算法(Message-Digest Algor ...
- JsonPath 语法 与 XPath 对比
JsonPath 语法 与 XPath 对比 XPath JSONPath Description / $ the root object/element . @ the current obje ...
- 功能强大的CURL
linux下的curl,有着非同一般的魔力,有人称它为下载工具,我更倾向于叫它“文件传输工具”因为它好像无所不能.从常见的 FTP, HTTP, TELNET, 等协议,还支持代理服务器,cook ...
- iOS应用架构谈part3 网络层设计方案
前言 网络层在一个App中也是一个不可缺少的部分,工程师们在网络层能够发挥的空间也比较大.另外,苹果对网络请求部分已经做了很好的封装,业界的AFNetworking也被广泛使用.其它的ASIHttpR ...
- 20181111 计时器影响DOM点击事件的逻辑
今天在群里看见一个人在问"点击按钮使图片产生旋转为什么要使用计时器来实现",我自己操作了一遍她的代码才发现里面的逻辑实现很有意思,所以写出来分享一下. 她的代码是这样写的: < ...
- JQuery 在线编辑器和手册
JQuery 在线编辑器 JQuery 在线编辑器 JQuery 菜鸟教程 手册 JQuery 菜鸟教程 手册
- 图解Disruptor框架(一):初识Ringbuffer
图解Disruptor框架(一):初识Ringbuffer 概述 1. 什么是Disruptor?为什么是Disruptor? Disruptor是一个性能十分强悍的无锁高并发框架.在JUC并发包中, ...
- MYSQL安装与库的基本操作
mysql数据库 什么是数据库 # 用来存储数据的仓库 # 数据库可以在硬盘及内存中存储数据 数据库与文件存储数据区别 数据库本质也是通过文件来存储数据, 数据库的概念就是系统的管理存储数据的文件 数 ...
- Python 中的for,if-else和while语句
for 循环 功能 for 循环是一种迭代循环机制,迭代即重复相同的逻辑操作,每次的操作都是基于上一次的结果而进行的.并且for循环可以遍历任何序列的项目,如一个列表或者一个字符串 语法 for 循环 ...
- OpenCV中图像的BGR格式及Img对象的属性说明
1. 图像的BGR格式说明 OpenCV中图像读入的数据格式是numpy的ndarray数据格式.是BGR格式,取值范围是[0,255]. 如下图所示,分为三个维度: 第一维度:Height 高度,对 ...