set动态维护凸包

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
#define N 200005
using namespace std;
struct node
{
int x,y;
node(){;}
node(int _x,int _y){x=_x;y=_y;}
friend bool operator < (const node &aa,const node &bb)
{
if(aa.x!=bb.x)return aa.x<bb.x;
return aa.y<bb.y;
}
friend node operator - (const node &aa,const node &bb)
{
return node(aa.x-bb.x,aa.y-bb.y);
}
friend int operator * (const node &aa,const node &bb)
{
return aa.x*bb.y-aa.y*bb.x;
}
friend bool operator == (const node &aa,const node &bb)
{
return aa.x==bb.x&&aa.y==bb.y;
}
}q[N];
double dis(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
set<node>s;
set<node>::iterator it,st,t1,t2;
int n,xx,yy,m;
bool v[N];
int qr[N][2],cas;
double now;
double ans[N];
void add(node p)
{
it=s.lower_bound(p);
node suc=(*it);
if(suc==p)return ;
--it;st=it;
node pre=(*it);
if((p-suc)*(pre-suc)<=0)return ;
now-=dis(suc,pre);
it=s.lower_bound(p);
t1=it;++it;
while(it!=s.end())
{
if((*t1-p)*(*it-p)<0)break;
now-=dis(*it,*t1);
s.erase(t1);
t1=it;++it;
}
while(st!=s.begin())
{
t2=st;--st;
if((*t2-p)*(*st-p)>0)break;
now-=dis(*t2,*st);
s.erase(t2);
}
s.insert(p);
it=st=s.find(p);
it--;st++;
now+=dis(*it,p);now+=dis(*st,p);
return ;
}
int main()
{
scanf("%d%d%d",&n,&xx,&yy);
s.insert(node(n,0));s.insert(node(0,0));
s.insert(node(xx,yy));
now+=dis(node(xx,yy),node(n,0));
now+=dis(node(xx,yy),node(0,0));
scanf("%d",&m);
for(int i=1;i<=m;i++)scanf("%d%d",&q[i].x,&q[i].y);
scanf("%d",&cas);
for(int i=1;i<=cas;i++)
{
scanf("%d",&qr[i][0]);
if(qr[i][0]==1)
{
scanf("%d",&qr[i][1]);
v[qr[i][1]]=1;
}
}
for(int i=1;i<=m;i++)
{
if(!v[i])add(q[i]);
}
for(int i=cas;i>=1;i--)
{
if(qr[i][0]==2)
{
ans[i]=now;
}
else
{
add(q[qr[i][1]]);
}
}
for(int i=1;i<=cas;i++)
{
if(qr[i][0]==2)printf("%.2f\n",ans[i]);
}
return 0;
}

  

bzoj 2300 : [HAOI2011]防线修建的更多相关文章

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

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

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

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

  3. bzoj 2300 [HAOI2011]防线修建 set动态维护凸包

    题目大意 动态删点,求凸包周长 分析 反过来变成动态加点 用set维护平衡树 具体是找到凸包上左右两点 拆开 就可以把左边当作顺时针求的一个凸包,右边当作逆时针求的一个凸包,像栈那样出set就好了 注 ...

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

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

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

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

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

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

  7. bzoj千题计划236:bzoj2300: [HAOI2011]防线修建

    http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...

  8. [luogu P2521] [HAOI2011]防线修建

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

  9. P2521 [HAOI2011]防线修建

    题目链接:P2521 [HAOI2011]防线修建 题意:给定点集 每次有两种操作: 1. 删除一个点 (除开(0, 0), (n, 0), 与指定首都(x, y)) 2. 询问上凸包长度 至于为什么 ...

随机推荐

  1. Git----02本地仓库进行文件添加&修改&删除&查看

    一.将新文件上传到本地仓库----使用小乌龟工具 1.1.将文件添加到暂存区 进入仓库目录,创建文件,添加暂存区     1.2.将文件添加到本地仓库 选中已经添加到暂存区的文件,进行提交 二.查看本 ...

  2. java按照字节切割字符串,解决汉字的问题

    编写一个截取字符串的函数,输入为一个字符串,截取开始地址,截取字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个, 如“我ABC”,0,4,应该截为“我AB”,输入“我ABC汉DEF”,1, ...

  3. 什么是mvc模式

    MVC是一个架构,或者说是一个设计模式,它就是强制性使应用程序的输入,处理和输出分开.将一个应用程序分为三个部分:Model,View,Controller. 原理图: 分析: Model 模型(完成 ...

  4. 将eclipse上的web项目部署到Tomcat服务器上经验总结

    1.  将Tomcat插件添加到eclipse上 Window --> Preferences --> Server --> Runtime Environment --> A ...

  5. 08慕课网《进击Node.js基础(一)》事件events

    引用events模块中的EventEmitter 事件的监听和发射 相同的事件发射数量有限,可以通过setMaxListeners设置峰值 var EventEmitter = require('ev ...

  6. 第二阶段Sprint冲刺会议1

    进展:总结第一阶段冲刺成就,讨论第二阶段任务,要实现的主要功能,分工及任务认领.

  7. springboot maven

    更多信息请从官网获取https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE 1.parent基于自己项目而非spring-boot-starter- ...

  8. 单片机FLASH与RAM、ROM的关系

    片机FLASH主要用作程序存贮器,就是替代以前的ROM,最大的有有点是降低了芯片的成本并且可以做到电擦写,目前市场上单片机的FALSH寿命相差比较大,擦写次数从1000~10万的都有,但存储时间可以保 ...

  9. Cron表达式简单的介绍

    1.Cron是什么,用来做什么的 根据百度百科的解释:计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思.在Linux中,我们经常用到 cron 服务器来完成这项工作.cron服务器可以 ...

  10. linux下tomcat、jenkins环境搭建

    1.安装JDK  我不列出来了,自行百度 java -version 2.安装tomcat (1)将下载的tomcat压缩包 tar -zxvf apache-tomcat-8.5.29.tar.gz ...