cogs 547:[HAOI2011] 防线修建

                  ★★★☆   输入文件:defense.in   输出文件:defense.out   简单对比
                      时间限制:1 s   内存限制:128 MB

题目描述:

近来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点的保护,那么防线变成下图

 

输入格式:

第一行,三个整数n,x,y分别表示河边城市和首都是(0,0),(n,0),(x,y)。

第二行,一个整数m。

接下来m行,每行两个整数a,b表示A国的一个非首都非河边城市的坐标为(a,b)。

再接下来一个整数q,表示修改和询问总数。

接下来q行每行要么形如1 i,要么形如2,分别表示撤销第i个城市的保护和询问。

输出格式:

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

样例输入:

4 2 1

2

1 2

3 2

5

2

1 1

2

1 2

2

样例输出:

6.47

5.84

4.47

数据范围:

30%的数据m<=1000,q<=1000

100%的数据m<=100000,q<=200000,n>1

所有点的坐标范围均在10000以内, 数据保证没有重点

题解:

  此题要求动态地去维护一个凸包的周长,我们可以发现,要想从凸包上删除一个点然后更新答案并不容易,因为凸包内部的点的信息不好维护,不妨把所有操作先存下来,离线反向操作。每碰到一个操作1,添加一个点,添加点无非是看这个点是在凸包的内部还是外部,内部的就不用管了,对答案并没有什么卵用,如果是在外部,就看在这个点左边的凸包上的点和右边凸包上的点会不会被覆盖,这个用向量的叉积判断即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<cstring>
 7 #include<queue>
 8 #include<cstring>
 9 #include<set>
10 using namespace std;
11 const double eps=1e-7;
12 int n,x,y,m,q;
13 double now;
14 struct Q{
15     int kin,i;
16     double ans;
17 }opt[300000];
18 bool vis[200000];
19 struct P{
20     int x,y;
21 }p[200005],del[200005];
22 inline P operator-(P a,P b){
23     P t; t.x=a.x-b.x; t.y=a.y-b.y;
24     return t;
25 }
26 inline double operator*(P a,P b){
27     return a.x*b.y-b.x*a.y;
28 }
29 inline bool operator<(P a,P b){
30     if(a.x==b.x) return a.y<b.y;
31     return a.x<b.x;
32 }
33 inline double dis(P a,P b){
34     return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
35 }
36 
37 set<P> A;
38 inline void insert(int a,int b){
39     P x=(P){a,b};
40     set<P>::iterator r=A.lower_bound(x),l=r,t;
41     l--;
42     if((*l-x)*(*r-x)<0) return ;
43     now-=dis(*l,*r);
44     A.insert(x);
45     while(r!=A.end()){
46         t=r; r++;
47         if((*r-x)*(*t-x)>0) break;
48         now-=dis(*t,*r);
49         A.erase(t);
50     }
51     while(l!=A.begin()){
52         t=l; l--;
53         if((*t-x)*(*l-x)>0) break;
54         now-=dis(*t,*l);
55         A.erase(t);
56     }
57     A.insert(x);
58     l=r=t=A.find(x);
59     l--; r++;
60     now+=dis(*l,x)+dis(*r,x);
61 }
62 
63 int main(){
64 //    freopen("defense.in","r",stdin);
65 //    freopen("defense.out","w",stdout);
66     scanf("%d%d%d",&n,&x,&y);
67     scanf("%d",&m);
68     for(int i=1;i<=m;i++) scanf("%d%d",&p[i].x,&p[i].y);
69     scanf("%d",&q);
70     for(int i=1;i<=q;i++){
71         scanf("%d",&opt[i].kin);
72         if(opt[i].kin==1){
73             scanf("%d",&opt[i].i);
74             vis[opt[i].i]=true;    
75         }
76     }
77     P cap; cap.x=x; cap.y=y; 
78     now+=dis((P){0,0},cap); now+=dis((P){n,0},cap);
79     A.insert((P){0,0}); A.insert((P){n,0}); A.insert((P){x,y});
80     for(int i=1;i<=m;i++){
81         if(vis[i]==false) insert(p[i].x,p[i].y);
82     }
83     for(int i=q;i>=1;i--){
84         if(opt[i].kin==2){
85             opt[i].ans=now;
86         }
87         else{
88             insert(p[opt[i].i].x,p[opt[i].i].y);
89         }
90     }
91     for(int i=1;i<=q;i++){
92         if(opt[i].kin==2){
93             printf("%.2lf\n",opt[i].ans);
94         }
95     }
96     return 0;
97 }

 

转载于:https://www.cnblogs.com/CXCXCXC/p/5246619.html

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

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

相关文章

人工智能和计算机软件,人工智能在计算机软件方面有什么应用?

人工智能(Artificial Intelligence) &#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支&#xff0c;它企图了解智能的实质&#xff0c;并生产出一种新的能以人类智能相似…

pq分解法中b’怎么求_14.初中数学:二元一次方程组,加减消元法怎么解?视频有详细解题步骤...

欢迎您来到方老师数学课堂&#xff0c;请点击上方蓝色字体&#xff0c;关注方老师数学课堂。所有的视频内容&#xff0c;全部免费&#xff0c;请大家放心关注&#xff0c;放心订阅。初中数学&#xff1a;二元一次方程组&#xff0c;加减消元法怎么解&#xff1f;视频有详细解题…

win8计算机可用内存不足,Win8.1玩游戏提示计算机内存不足,Win8.1内存不足怎么办?...

Win8.1玩游戏提示计算机内存不足,Win8.1内存不足怎么办?有朋友使用Win8.1系统&#xff0c;这一段时间&#xff0c;在玩游戏(如孤岛危机3、鬼泣4)过程中&#xff0c;频繁出现下面提示框&#xff1a;关闭程序以防止信息丢失计算机的内存不足。请保存文件并关闭这些程序Windows将…

css划上去变长,Css3如何实现鼠标移上变长特效?(图文+视频)

本篇文章主要给大家介绍用css3实现鼠标移入变长效果的方法。在前端页面设计中&#xff0c;css的功能是异常强大的&#xff0c;只要运用好它&#xff0c;你能实现很多网站各种精彩的动态效果。那么在之前的文章中也给大家分享介绍了一些用css实现动画效果的方法&#xff0c;比如…

小米路由器怎么连接无盘服务器,播放器+服务器的方法瞬间玩转小米路由方法图文介绍...

“厨具”&#xff1a;小米路由及其外接硬盘、安卓手机、威动播放器(VidOn Player)、威动服务器(VidOn Server)“食材”&#xff1a;冰雪奇缘、生活大爆炸用两种方法将其“熬制”&#xff0c;时间短、内容丰富&#xff0c;“营养价值”相当的高。一、将小米路由作为NAS&#xff…

统计源期刊目录_统计源期刊是什么意思

统计源期刊是什么意思&#xff1f;统计源期刊全称中国科技论文统计源期刊&#xff0c;也就是我们常说的科技核心期刊&#xff0c;科技核心期刊是我国核心期刊体系中的一类&#xff0c;在国内个人评职晋升、学术评估中占据着重要地位&#xff0c;统计源期刊也是根据期刊多方面指…

ajax 请求post和get,ajax请求get和post

ajax请求get和post 内容精选换一换正常返回值类型说明200OKGET、PUT、POST操作正常返回204No ContentDELETE操作正常返回异常返回值说明400 Bad Request服务器未能处理请求。401 Unauthorized被请求的页面需要用户名和密码。403 Forbidden对被请求页面的访问被禁止。404 Not Fo…

网页底部的版权信息_Shopify底部的版权信息(Powered by Shopify )如何删除

大多数新的Shopify商店所有者通常在一开始就遇到一个小问题。他们通常想摆脱商店页脚中的“Powered by Shopify”文本/链接。Shopify提供支持的含义是什么&#xff1f;Shopify是一个电子商务平台&#xff0c;可帮助创建和自定义电子商务商店。当您在此平台上创建商店时&#xf…

ftp 服务器 文件 连接 导出,ftp 服务器 文件 连接 导出

ftp 服务器 文件 连接 导出 内容精选换一换“数据导入”章节适用于MRS 3.x及后续版本。Loader是实现MRS与外部数据源如关系型数据库、SFTP服务器、FTP服务器之间交换数据和文件的ETL工具&#xff0c;支持将数据或文件从关系型数据库或文件系统导入到MRS系统中。Loader支持如下数…

多个虚拟主机服务器,Windows多个虚拟主机服务器

Windows多个虚拟主机服务器 内容精选换一换迁移前&#xff0c;您需要设置目的端服务器。该目的端用来接收源端的数据&#xff0c;同时您也可以使用该目的端进行迁移测试和启动目的端。只有“迁移阶段”为“已就绪”时才可设置目的端。或单击“操作”列的“更多 > 设置目的端…

armv8 汇编 绝对地址赋值_详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系...

[TOC]为什么要有相对跳转和绝对跳转&#xff1f;顺序执行&#xff1a;指令一条一条按照顺序往下执行&#xff0c;比如变量的定义和赋值都是按照顺序执行的。跳转执行&#xff1a;当指令执行到当前位置后跳转到其他位置执行。比如&#xff0c;在主函数中调用其他函数就是典型的跳…

mongodb3.0 性能測试报告 一

mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三測试环境&#xff1a; 服务器&#xff1a;X86 pcserver 共6台 cpu&#xff1a; 单颗8核 内存&#xff1a;64G 磁盘&#xff1a; raid 10 操作系统 &#xff1a;centos 6.5 mongo…

HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。...

今天&#xff0c;在vs2013中新建了一个placard.json文件&#xff0c;当我用jq读取它的时候&#xff0c;去提示404&#xff0c;直接在浏览器访问这个文件&#xff0c;提示&#xff1a; HTTP 错误 404.3 – Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本&…

ArcGIS将CAD等高线转换为TIN/DEM数据

1.CAD图层分离 CAD快捷命令QSELECT&#xff08;快速选择&#xff09; 选择DGX,GCD图层&#xff0c;复制到新的CAD文件中 2.在ArcGIS中&#xff0c;将dwg文件转化为可编辑的要素类文件&#xff08;shapefiles&#xff09; 分析工具-提取分析-筛选 3.高程数据修正 鼠标右键生…

字节跳动专家会_字节跳动招聘直播策略运营专家/经理/海外财务AR BP,ACCA优先...

字节跳动是把人工智能技术大规模应用于信息分发的公司&#xff0c;短短7年&#xff0c;从最初的一个“今日头条”&#xff0c;已经发展为拥有“抖音”、“西瓜视频”、“火山小视频”、“FaceU”等十几款产品的公司。每天&#xff0c;都有6亿用户通过字节跳动的产品看见更大的世…

矩形河道中心排放污染物浓度点源二维移流扩散MATLAB解析解计算

某非可降解物质在20℃水体中从河道中心排放&#xff0c;速度与水流流速方向相同&#xff0c;排污口为时间连续点源。河道为矩形河道&#xff0c;长度16.0m&#xff0c;宽度3.0m&#xff0c;水深2.0m&#xff0c;水流流速2.0m/s。单位时间投放的污染物强度为30mg/L。假设污染物排…

ArcGIS如何将经纬度坐标显示转化为xy坐标显示

GIS中经纬度坐标显示如图&#xff1a; 视图-数据框属性-常规-显示&#xff08;米&#xff09; 点击确定&#xff0c;然后坐标显示就转换为xy坐标了 注意&#xff0c;以上设置只是设置了当前文档的坐标系统&#xff0c;并不是数据的坐标系 举个例子&#xff1a;我将2160这条等高…

ArcGIS改变数据集或要素类的的坐标系(投影)

数据管理工具-投影和变换-投影-输入数据集或要素类-输出数据集或要素类-输出坐标系(选择合适的投影坐标系)

地形图如何转换为数字高程模型(DEM)

1.设置参考坐标信息 一般的地形图没有坐标参考&#xff0c;在ArcCatalog 10.7中打开地形图&#xff0c;右键属性-空间参考-编辑&#xff0c;选择对应的空间参考坐标信息。 2..地图配准 将地形图在ArcMap中打开&#xff0c;一般地形图四角都有经纬度坐标信息&#xff0c;即通过…

HEC-RAS二维溃坝洪水模拟(尾矿库)

1.建模 1.1新建工程文件 注意路径不要有中文&#xff0c;主义单位设置为国际单位SI 1.2导入地形数据 导入地形如图&#xff1a; 1.3建立几何模型 1)新建几何文件 2&#xff09;导入坝轴线 提前在GIS中制作坝轴线shp文件&#xff0c;注意在将制作好的坝轴线shp文件复制到工程…