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就像学一下,不过介于本人还不会动态凸包就去学了下,还是挺神奇的说,维护上下凸包的写法虽然打得有点多不过也只是维护复制黏贴的事情而已罢了. 先说下动态凸包怎么写吧 ...
随机推荐
- axure的基本使用方法(侧边导航栏的制作)
1.创建一个动态面板control 2.在home中创建动态面板homepage和movepage并且完成布局 3.给home添加移动事件 4.给按钮添加点击事件 5.大功告成
- npm 安装插件失败
由于npm的很多安装包的下载源来自国外网站,所以比较缓慢甚至访问失败. 再此可以用淘宝的镜像文件来安装插件.方法其实很简单:
- Spring中使用事务搭建转账环境方法二 相对简便的注解方法 ——配置文件注入对象属性需要setter方法 注解方法,不需要生成setter方法
XML配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- Missing letters-freecodecamp算法题目
Missing letters 1.要求 从传递进来的字母序列中找到缺失的字母并返回它. 如果所有字母都在序列中,返回 undefined. 2.思路 设定缺失变量miss 在for循环遍历字符串的各 ...
- 基于matlab的蓝色车牌定位与识别---分割
接着上面的工作,接下去就该是进行字符分割了.考虑到为了后面的字符识别,因此在这部分需要实现的目标是需要把车牌的边框全部切除,对重新定位的车牌进行垂直方向水平方向调整,保证字符是正的.最后才是字符的分割 ...
- 学习笔记(三): Generalization/Overfitting/Validation
目录 Generalization: Peril of Overfitting Low loss, but still a bad model? How Do We Know If Our Mod ...
- python中的sort、sorted排序
我们通常会遇到对数据库中的数据进行排序的问题,今天学习一下对列表和字典的排序方法. 列表 第一种:内建方法sort sort()对列表排序是永久性的排序. 用法:sort(*, key=None, r ...
- Docker 自动运行Nginx容器
Dockerfile文件如下: FROM ubuntu #基础镜像 RUN apt-get update #更新apt RUN apt-get -y install nginx #安装nginx VO ...
- Ajax原生代码
Ajax传数据有两种方式:get/post.下面是前台的get/post方式的代码. //------------原生--------- function AjaxGET(){ //第一步 调用Aja ...
- destoon 配置文件config.inc.php参数说明
$CFG['db_host']数据库服务器,可以包括端口号,一般为localhost $CFG['db_user']数据库用户名,一般为root $CFG['db_pass']数据库密码 $CFG[' ...