题目大意

动态删点,求凸包周长

分析

反过来变成动态加点

用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动态维护凸包的更多相关文章

  1. 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)

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

  2. BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )

    离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...

  3. bzoj 2300 : [HAOI2011]防线修建

    set动态维护凸包 #include<iostream> #include<cstdio> #include<cstring> #include<algori ...

  4. bzoj 2300: [HAOI2011]防线修建 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题解 这道题让我们维护一个支持动态删除点的上凸壳 并且告诉了我们三个一定不会被删除 ...

  5. 【bzoj2300】[HAOI2011]防线修建 离线+STL-set维护凸包

    题目描述 给你(0,0).(n,0).(x,y)和另外m个点,除(0,0)(n,0)外每个点横坐标都大于0小于n,纵坐标都大于0. 输入 第一行,三个整数n,x,y分别表示河边城市和首都是(0,0), ...

  6. BZOJ 2300 [HAOI2011]防线修建 ——计算几何

    只需要倒着插入,然后维护一个凸包就可以了. 可以用来学习set的用法 #include <map> #include <set> #include <cmath> ...

  7. BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)

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

  8. bzoj2300#2300. [HAOI2011]防线修建

    题解:带删点的维护凸包,1.删点2.查询凸包周长 题解:倒着做就成了带加点的维护凸包,加点时维护一下周长就没了 //#pragma GCC optimize(2) //#pragma GCC opti ...

  9. BZOJ [HAOI2011]防线修建(动态凸包)

    听说有一种很高端的东西叫动态凸包维护dp就像学一下,不过介于本人还不会动态凸包就去学了下,还是挺神奇的说,维护上下凸包的写法虽然打得有点多不过也只是维护复制黏贴的事情而已罢了. 先说下动态凸包怎么写吧 ...

随机推荐

  1. Java中线程的通讯

    线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法:因为wait和notify方法定义在Object类中,因此会被所有 ...

  2. 编译安装 nginx php swoole

    安装之前先 准备环境 yum install gcc gcc-c++ automake pcre pcre-devel zlip zlib-devel openssl openssl-devel 然后 ...

  3. C++简易酒店管理系统,实现(查询、入住、退房、楼层选择、退出)功能

    #include <iostream> #include <string.h> #include <stdlib.h> void enter(); void che ...

  4. Vue 父子组件间的通信

    前言 在 Vue 项目中父子组件的通信是非常常见的,最近做项目的时候发现对这方面的知识还不怎么熟练,在这边做一下笔记,系统学习一下吧. 1 父组件传值给子组件 1.1 传值写法 父组件传值给子组件,这 ...

  5. 【android】【android studio】修改emulator的本地化环境

    Changing the emulator locale from the adb shell To change the locale in the emulator by using the ad ...

  6. IAR单片机启动文件与程序入口

    最近在做TI单片机TM4C123GE6PZ的BootLoader,需要对启动文件做出修改,折腾了半宿,弄得事实而非. IAR默认提供了单片机的启动文件,cstart.s或者其他cstartxxx.s, ...

  7. Persona5

    65536K   Persona5 is a famous video game. In the game, you are going to build relationship with your ...

  8. HDU 3667 费用流 拆边 Transportation

    题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...

  9. dubbo doc入门文档

    dubbo document http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-protocol.html

  10. 【Alpha】Scrum Meeting 5-end

    第一天:2019/6/19 前言: 第5次会议在6月19日由PM在教9C-501召开. 总结项目,进行单元测试并进行简单的整合.时长60min. 团队GitHub仓库 仓库连接 1.1 今日完成任务情 ...