2300: [HAOI2011]防线修建

Description

近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了。可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于A国的经费有限,所以希望你能帮忙完成如下的一个任务:
1.给出你所有的A国城市坐标
2.A国上层经过讨论,考虑到经济问题,决定取消对i城市的保护,也就是说i城市不需要在防线内了
3.A国上层询问对于剩下要保护的城市,修建防线的总经费最少是多少
你需要对每次询问作出回答。注意单位1长度的防线花费为1。
A国的地形是这样的,形如下图,x轴是一条河流,相当于一条天然防线,不需要你再修建
A国总是有两个城市在河边,一个点是(0,0),一个点是(n,0),其余所有点的横坐标均大于0小于n,纵坐标均大于0。A国有一个不在(0,0)和(n,0)的首都。(0,0),(n,0)和首都这三个城市是一定需要保护的。

上图中,A,B,C,D,E点为A国城市,且目前都要保护,那么修建的防线就会是A-B-C-D,花费也就是线段AB的长度+线段BC的长度+线段CD的长度,如果,这个时候撤销B点的保护,那么防线变成下图

Input

第一行,三个整数n,x,y分别表示河边城市和首都是(0,0),(n,0),(x,y)。
第二行,一个整数m。
接下来m行,每行两个整数a,b表示A国的一个非首都非河边城市的坐标为(a,b)。
再接下来一个整数q,表示修改和询问总数。
接下来q行每行要么形如1 i,要么形如2,分别表示撤销第i个城市的保护和询问。

Output

对于每个询问输出1行,一个实数v,表示修建防线的花费,保留两位小数

Sample Input

4 2 1
2
1 2
3 2
5
2
1 1
2
1 2
2

Sample Output

6.47
5.84
4.47

HINT

m<=100000,q<=200000,n>1
所有点的坐标范围均在10000以内, 数据保证没有重点

Source

【分析】

  一开始真是想得太少了。

  这是动态凸包。可以离线,把删除点变成插入点。

  这题有特殊性,总是有两个城市在河边,一个点是(0,0),一个点是(n,0),其余所有点的横坐标均大于0小于n,纵坐标均大于0。

  就是说下凸包是最下面最长的直线,只要维护一个上凸包。

  (表示还不会真正的动态凸包)

  这一题只用set维护,就知道插入的点第一个影响的两个点(lower_bound)

  判断是以x为第一关键字,y为第二关键字。

  然后不断扩展删点就好了。

  好难打ORZ,,,竟然1A了。。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
#define Maxn 100010 struct P
{
int x,y;
}a[Maxn];
int len; int m; P operator - (P x,P y)
{
P tt;
tt.x=x.x-y.x;
tt.y=x.y-y.y;
return tt;
} bool operator < (P x,P y) {return (x.x==y.x)?(x.y<y.y):(x.x<y.x);} int Dot(P x,P y) {return x.x*y.x+x.y*y.y;}
int Cross(P x,P y) {return x.x*y.y-x.y*y.x;} set<P> t;
double ans; void ins(P nw)
{
set<P>:: iterator r=t.lower_bound(nw),l=r,tt;
l--;
if(Cross(nw-*l,*r-*l)>=) return;
ans-=sqrt((double)Dot(*r-*l,*r-*l));
while()
{
tt=r,r++;
if(r==t.end()) break;
if(Cross(nw-*tt,nw-*r)<=) break;
ans-=sqrt((double)Dot(*r-*tt,*r-*tt));
t.erase(tt);
}
while(l!=t.begin())
{
tt=l,l--;
if(Cross(*l-*tt,*l-nw)<=) break;
ans-=sqrt((double)Dot(*l-*tt,*l-*tt));
t.erase(tt);
}
t.insert(nw);
tt=t.find(nw);l=r=tt;
l--;r++;
ans+=sqrt((double)Dot(nw-*l,nw-*l))+sqrt((double)Dot(nw-*r,nw-*r));
} bool mark[Maxn];
int qr[*Maxn],al;
double as[Maxn];
void init()
{
int n;
scanf("%d",&n);
a[].x=,a[].y=;t.insert(a[]);
a[].x=n,a[].y=;t.insert(a[]);
ans=;
scanf("%d%d",&a[].x,&a[].y);
ans+=n;
ins(a[]);
scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
} memset(mark,,sizeof(mark));
int q;
scanf("%d",&q);
for(int i=;i<=q;i++)
{
int x,y;
scanf("%d",&x);
if(x==)
{
scanf("%d",&y);
qr[i]=y;
mark[y]=;
}
else
{
qr[i]=-;
}
}
for(int i=;i<=m;i++) if(!mark[i]) ins(a[i]);
al=;
for(int i=q;i>=;i--)
{
if(qr[i]==-)
{
as[++al]=ans;
}
else
{
ins(a[qr[i]]);
}
}
for(int i=al;i>=;i--) printf("%.2lf\n",as[i]);
} int main()
{
init();
return ;
}

2016-12-17 10:07:03

【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)的更多相关文章

  1. 【题解】P2521 [HAOI2011]防线修建(动态凸包)

    [题解]P2521 [HAOI2011]防线修建(动态凸包) 凸包是易插入不好删除的东西,按照剧情所以我们时光倒流 然后问题就是维护凸包的周长,支持加入 本来很简单,但是计算几何就是一些小地方经验不足 ...

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

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

  3. 【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set

    一句话题意:给你一个凸包,每次可以插入一个点或者询问周长. 动态凸包裸题嘛,用\(Set\)实现.最初每个点坐标做乘三处理,便于取初始三角形的重心作为凸包判定原点. #include <bits ...

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

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

  5. 【BZOJ2300】[HAOI2011]防线修建 set维护凸包

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

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

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

  7. P2521 [HAOI2011]防线修建

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

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

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

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

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

随机推荐

  1. C# 高精度加法 支持小数(待优化)

    直接上代码 实现思路: 1.首先小数点补 位,9223372036854775808.9+9223372036854775808.9223372036854775808 => 922337203 ...

  2. ASP.NET实现折线图的绘制

    用到.Net中绘图类,实现折线图的绘制,生成图片,在页面的显示,代码如下: /// <summary> /// 获取数据 /// strChartName:图名称: /// yName:纵 ...

  3. OpenGL1-创建窗口(建立Win32的OpenGL开发环境 )(代码上传)

    视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 代码下载 #pragma once #include < ...

  4. Linux RedHat无法安装软件问题(No package gcc available. Nothing to do)

    在一个新的Linux服务器上安装nginx的时候,命令都不能解析,缺少gcc编辑器,安装gcc的命令也出错. [root@localhost ~]# yum -y install gcc Loaded ...

  5. L004-oldboy-mysql-dba-lesson04

        L004-oldboy-mysql-dba-lesson04 [root@web01 mysql]# mysql -uroot -ptestpassword -S /tmp/mysql.soc ...

  6. [转载]mysql慢日志文件分析处理

    原文地址:mysql慢日志文件分析处理作者:maxyicha mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysq ...

  7. 《APUE》第6章练习1

    问题:编写一个程序,它调用uname并输出utsname结构中的所有字段,并将输出与uname(1)命令的输出结构做比较. 我本来以为utsname结构也跟passwd结构一样,也有那三个函数来获取整 ...

  8. DISCUZ! X2.5设置仅允许QQ登录注册论坛 加固会员注册机制

    论坛稍微有点起色之后,很多站长就会担心论坛经常被人恶意灌水.注册机.顶贴机等等一些列非法的手段.通常站长都会通过一些后台的设置和插件等等一 切有效的方法预防,但更多的站长会通过限制用户注册会员,需注册 ...

  9. FragmentActivity和Activity的具体区别在哪里

    fragment是3.0以后的东西,为了在低版本中使用fragment就要用到android-support-v4.jar兼容包,而fragmentActivity就是这个兼容包里面的,它提供了操作f ...

  10. 【IOS】利用ASIHTTPRequest 实现一个简单的登陆验证

    http://blog.csdn.net/toss156/article/details/7638529