bzoj 2300 : [HAOI2011]防线修建
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]防线修建的更多相关文章
- BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )
离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...
- bzoj 2300: [HAOI2011]防线修建 凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题解 这道题让我们维护一个支持动态删除点的上凸壳 并且告诉了我们三个一定不会被删除 ...
- bzoj 2300 [HAOI2011]防线修建 set动态维护凸包
题目大意 动态删点,求凸包周长 分析 反过来变成动态加点 用set维护平衡树 具体是找到凸包上左右两点 拆开 就可以把左边当作顺时针求的一个凸包,右边当作逆时针求的一个凸包,像栈那样出set就好了 注 ...
- BZOJ 2300 [HAOI2011]防线修建 ——计算几何
只需要倒着插入,然后维护一个凸包就可以了. 可以用来学习set的用法 #include <map> #include <set> #include <cmath> ...
- 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)
2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...
- bzoj2300#2300. [HAOI2011]防线修建
题解:带删点的维护凸包,1.删点2.查询凸包周长 题解:倒着做就成了带加点的维护凸包,加点时维护一下周长就没了 //#pragma GCC optimize(2) //#pragma GCC opti ...
- bzoj千题计划236:bzoj2300: [HAOI2011]防线修建
http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...
- [luogu P2521] [HAOI2011]防线修建
[luogu P2521] [HAOI2011]防线修建 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国 ...
- P2521 [HAOI2011]防线修建
题目链接:P2521 [HAOI2011]防线修建 题意:给定点集 每次有两种操作: 1. 删除一个点 (除开(0, 0), (n, 0), 与指定首都(x, y)) 2. 询问上凸包长度 至于为什么 ...
随机推荐
- linux后台启动程序脚本实例
启动安装的zookeeper和kafka #!/bin/bash # start zookeeper and kafka service echo "========== Start the ...
- BOM 头是什么,怎么除去
WINDOWS自带的记事本,在保存一个以 UTF-8 编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM).它是一串隐藏的字符,用于让记事本等编辑器识别这个文 ...
- nodejs 几篇有用的文章
深入浅出Node.js(三):深入Node.js的模块机制 http://www.infoq.com/cn/articles/nodejs-module-mechanism Node.js简单介绍并实 ...
- Hadoop错误码速查
经常遇到的exception是:PipeMapRed.waitOutputThreads(): subprocess failed with code N "OS error code 1: ...
- FFmpeg简单转码程序--视频剪辑
学习了雷神的文章,慕斯人分享精神,感其英年而逝,不胜唏嘘.他有分享一个转码程序<最简单的基于FFMPEG的转码程序>其中使用了filter(参考了ffmpeg.c中的流程),他曾说想再编写 ...
- 第31次Scrum会议(11/19)【欢迎来怼】
一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/19 17:05~17:34,总计29min. 地 ...
- APP案例分析之华为浏览器
第一部分 对华为浏览器的调研,评测 1.对华为浏览器的第一次上手体验 我会使用华为浏览器呢,是因为我买的手机是华为nova,该浏览器也是手机里面预装的.刚开始用的时候也没太注意,感觉跟以前用的其他浏 ...
- 浏览器播放rtmp流
我是利用flash插件实现的,需要以下几个文件: flowplayer-3.2.8.min.js flowplayer-3.2.18.swf flowplayer.rtmp-3.2.8.swf flo ...
- 深入理解JAVA集合系列二:ConcurrentHashMap源码解读
HashMap和Hashtable的区别 在正式开始这篇文章的主题之前,我们先来比较下HashMap和Hashtable之间的差异点: 1.Hashtable是线程安全的,它对外提供的所有方法都是都使 ...
- js访问对象属性的两种方法
var obj={name:'fuuf',age:19} 第一种,用.访问 obj.name 第二种 用[]访问 obj['name'] //此时name是字符串,要加引号 注意事项 使用第二种方法 ...