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

【BZOJ2300】[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以内, 数据保证没有重点

题解:容易想到离线,然后本题就变成了加点和维护凸包,可以用平衡树来维护凸包来搞(以前一直以为必须用Splay,结果发现好像set就行)。

具体地,我们在set中的点是按x值从小到大排序的。在加入一个点时,先找到凸包中它的前驱和后继节点,用叉积判一下当前点是否已经在凸包里面。如果在则不用加点,否则加入当前点,并不断执行以下操作:

如果当前点和左侧两个点形成的不是上凸包,则将当前点的前驱删掉,否则退出。

右面同理。

然后就做完了,细节也不是特别多。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <cmath>
using namespace std;
const int maxn=200010;
struct point
{int x,y;point() {}point(int a,int b) {x=a,y=b;}bool operator != (const point &a) const {return (x!=a.x)||(y!=a.y);}bool operator < (const point &a) const {return (x==a.x)?(y<a.y):(x<a.x);}point operator - (const point &a) const {return point (x-a.x,y-a.y);}int operator * (const point &a) const {return x*a.y-y*a.x;}
}p[maxn];
double dis(const point &a,const point &b) {return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
set<point> s;
set<point>::iterator it;
double ans;
int n,m,q;
int del[maxn],op[maxn],qi[maxn];
double qa[maxn];
inline int rd()
{int ret=0,f=1;	char gc=getchar();while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}while(gc>='0'&&gc<='9')	ret=ret*10+(gc^'0'),gc=getchar();return ret*f;
}
inline void add(point x)
{point a,b,c;it=s.upper_bound(x),b=*it,it--,a=*it;if(x.x==b.x)	return ;if((x-a)*(b-x)>=0)	return ;ans-=dis(a,b);while(a!=point(0,0)){it--,c=*it;if((a-c)*(x-a)>=0)	ans-=dis(a,c),s.erase(s.find(a)),a=c;else	break;}it=s.find(b);while(b!=point(n,0)){it++,c=*it;if((b-x)*(c-b)>=0)	ans-=dis(b,c),s.erase(s.find(b)),b=c;else	break;}ans+=dis(a,x)+dis(x,b);s.insert(x);
}
int main()
{int i,a,b;n=rd(),a=rd(),b=rd(),m=rd();s.insert(point(0,0)),s.insert(point(n,0)),s.insert(point(a,b));ans=dis(point(0,0),point(a,b))+dis(point(n,0),point(a,b));for(i=1;i<=m;i++)	p[i].x=rd(),p[i].y=rd();q=rd();for(i=1;i<=q;i++){op[i]=rd();if(op[i]==1)	qi[i]=rd(),del[qi[i]]=1;}for(i=1;i<=m;i++)	if(!del[i])	add(p[i]);for(i=q;i>=1;i--){if(op[i]==2)	qa[i]=ans;else	add(p[qi[i]]);}for(i=1;i<=q;i++)	if(op[i]==2)	printf("%.2lf\n",qa[i]);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7965400.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sass笔记(CSS 的预编译语言)

在线转换&#xff1a;https://www.sass.hk/css2sass/ Sass 是一种 CSS 的预编译语言。它提供了 变量&#xff08;variables&#xff09;、嵌套&#xff08;nested rules&#xff09;、 混合&#xff08;mixins&#xff09;、 函数&#xff08;functions&#xff09;等功能。 S…

mysql 主从同步-读写分离

主从同步与读写分离测试 一、 实验环境(主从同步) Master centos 7.3 192.168.138.13 Slave centos 7.3 192.168.138.14 二、在master操作 安装并配置文件[rootlocalhost ~]# yum install mariadb-server …

coherence安装_Oracle Coherence:分布式数据管理

coherence安装本文介绍如何使用Oracle Coherence提供分布式&#xff08;分区&#xff09;数据管理。 在下面的示例应用程序中&#xff0c;创建了一个名为OTV的新集群&#xff0c;并且在该集群的两个成员之间分配了一个名为user-map的缓存对象。 二手技术&#xff1a; JDK 1.6.…

AtomicReference 原子引用

原创 2016年03月04日 13:35:2076381.简介 赋值操作不是线程安全的。若想不用锁来实现&#xff0c;可以用AtomicReference<V>这个类&#xff0c;实现对象引用的原子更新。 使用场景&#xff1a;一个线程使用student对象&#xff0c;另一个线程负责定时读表&#xff0c;更新…

MongoDB基础使用

5.MongoDB基础使用 5.1.常用的命令&#xff08;重点&#xff09; > Help 查看帮助 显示数据库列表 > show dbs 创建数据库 > use dbname 如果数据库不存在&#xff0c;则创建数据库dbname&#xff0c;否则切换到指定数据库dbname。创建的数据库并不在数据库的列表中…

使用一些可选的将字符串配置属性转换为其他类型

有一天&#xff0c;您遇到一些代码&#xff0c;并认为这很漂亮&#xff0c;为什么我没有想到呢&#xff1f; 因此&#xff0c;我的长期同事Mark Warner在使用方法引用处理从String进行转换的标准名称/值存储模式方面有一个不错的选择。 int size store.getProperty("cac…

AttributeError: module 're' has no attribute 'sub'

文件不能同名&#xff08;import re re.py)转载于:https://www.cnblogs.com/realmonkeykingsun/p/7992613.html

django-uwsgi配置

一、安装uwsgi uwsgi是一个应用服务器&#xff0c;非静态文件的网络请求就必须通过他完成&#xff0c;他也可以充当静态文件服务器&#xff0c;但不是它的强项。 注意&#xff1a;uwsgi必须安装在系统级别的Python环境中&#xff0c;不要安装到虚拟环境中。 uwsgi是使用pytho…

C++堆和栈详解(转)

一、预备知识—程序的内存分配 一个由C/C编译的程序占用的内存分为以下几个部分 1、栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区&#xf…

JavaFX技巧来节省内存! 属性和可观察物的阴影场

在 JavaFX的世界中&#xff0c; Properties API允许UI开发人员将值绑定到UI控件。 这种功能非常容易&#xff0c;但是当对象模型经常使用属性时&#xff0c;应用程序可能会很快耗尽内存。 我通常会编写两个单独的对象&#xff0c;例如pojo类和表示模型对象。 此技术通常在基于S…

nginx部署与小程序配置

nginx部署与小程序配置说明 1、安装nginx $ sudo apt-get update $ sudo apt-get install nginx2、配置https: 查看&#xff1a; https://help.aliyun.com/knowledge_detail/95491.html?spm5176.2020520154.cas.64.7dd7Quq8Quq8ap mkdir /opt/cert把证书上传到这个文件夹…

Maven实战:Pom.xml详解

什么是pom? pom作为项目对象模型。通过xml表示maven项目&#xff0c;使用pom.xml来实现。主要描述了项目&#xff1a;包括配置文件&#xff1b;开发者需要遵循的规则&#xff0c;缺陷管理系统&#xff0c;组织和licenses&#xff0c;项目的url&#xff0c;项目的依赖性&…

Liunx 命令大全

1.ifconfig 用于配置和显示Linux内核中网络接口的网络参数 2.type 用来显示指定命令的类型&#xff0c;判断给出的指令是内部 令还是外部指令 3.man Linux下的帮助指令&#xff0c;通过man指令可以查看Linux 中的指令帮助、配置文件帮助和编程帮助等信息 4.help 用于显示 shell…

如何在Hibernate Search 5.5.2 / Apache Lucene 5.4.x中处理停用词?

停用词&#xff0c;例如[“ a”&#xff0c;“ an”&#xff0c;“ and”&#xff0c;“ are”&#xff0c;“ as”&#xff0c;“ at”&#xff0c;“ be”&#xff0c;“ but”&#xff0c;“ by”&#xff0c;“ for”&#xff0c;“ if”&#xff0c;“在”&#xff0c;“成…

windows路径操作API函数

路径截断与合并函数 PathRemoveArgs 去除路径的参数 PathRemoveBackslash 去除路径最后的反斜杠“\” PathAddBackslash 在路径最后加上反斜杠“\” PathRemoveBlanks 去除路径前后的空格 PathAddExtension 在文件路径后面加上扩展名 PathRemoveExtensio…

docker安装问题

1、卸载docker重装 将所有含docker的文件找出来 find / -name ‘docker’ 或cd到根目录后搜索&#xff1a; find -name ‘docker 删除搜索的文件或目录&#xff1a; rm -rf … 删除全部的docker有关文件命令 rm -rf $(find -name ‘docker’) 2、安装docker 安装依赖 su…

【BZOJ1814】Ural 1519 Formula 1 插头DP

【BZOJ1814】Ural 1519 Formula 1 题意&#xff1a;一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数。(n,m<12) 题解&#xff1a;插头DP板子题&#xff0c;刷板子&#xff0c;附带题解链接。 如何存放状态呢&#xff1f;可以采用hash&#xff0c;…

docker-compose安装问题

&#xff08;一&#xff09;docker-compose安装超时 1、设置一个timeout pip install --default-timeout100 docker-compos2、下载到本地 docker_compose-1.27.0-py2.py3-none-any.whl首先去下载&#xff1a;https://pypi.org/project/docker-compose/#files 然后用xftp上传…

java更改包名称_更改Java包名称如何改变我的系统架构

java更改包名称即使只是少量更改角度&#xff0c;也可能对您如何使用系统产生深远影响。 假设您正在用Java编写Web应用程序。 在系统中&#xff0c;您处理订单&#xff0c;客户和产品。 作为一个Web应用程序&#xff0c;您的类包括诸如Controller&#xff0c;PersonRepository&…

linux系统界面光标不见了---木有了

直接在界面输入命令 echo -e “\033[?25l” 隐藏光标 echo -e “\033[?25h” 显示光标