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;视频有详细解题…

hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告

题目来源&#xff1a;小Hi小Ho的惊天大作战&#xff1a;扫雷一 解题思路&#xff1a;因为只要确定了第一个是否有地雷就可以推算出后面是否有地雷&#xff08;要么为0&#xff0c;要么为1&#xff0c;如果不是这两个值就说明这个方案行不通&#xff09;&#xff0c;如果两种可能…

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

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

谈谈对python这门课的认识_【Python公开课】1-认识Python

一、 课程介绍● 初识 Python● Hello,World● print()● 顺序执行、注释二、重难点解析为什么选择 Python&#xff1f;Python 是一门对初学者最友好的编程语言&#xff0c;人们可以利用它轻松地实现想要的功能&#xff0c;将更多精力和时间花在更应该专注思考的地方。本节课将…

软件测试作业(一)

说起程序中的bug&#xff0c;真是一个令所有程序员深恶痛绝的东西&#xff0c;然而大部分都是源于接触少&#xff0c;缺乏经验。 在上学期javaWeb大作业中&#xff0c;在写一个jsp的时候&#xff0c;由于一个button的功能是提交&#xff0c;于是把这个button的name赋值为submit…

怎么在服务器上加端口映射,Windows服务器中命令行添加端口映射

微软Windows的netsh工具可以查看或变更本地计算机或远程计算机的网络配置。不仅可以在本地计算机上运行这些命令&#xff0c;而且可以在服务器上直接运行&#xff0c;本文对一些特定部署环境的服务器配置有一定帮助。首先使用查看当前端口映射配置&#xff1a;netsh interface …

python企业微信回调_回调模式

回调模式在回调模式下&#xff0c;企业不仅可以主动调用企业号接口&#xff0c;还可以接收成员的消息或事件。接收的信息使用XML数据格式、UTF8编码&#xff0c;并以AES方式加密。企业号的每个应用都有自己的回调模式开关。在管理端开启并设置好相关参数后&#xff0c;此应用的…

Centos7 Apache 2.4.18编译安装

安装环境&#xff1a;CentOS Linux release 7.0.1406 (Core) 0x01 到官网http://httpd.apache.org/download.cgi#apache24下载apache http最新版 tar zxf httpd-2.4.18.tar.gz [rootlocalhost httpd-2.4.18]# rpm -qa | grep apr 查看当前主机上是否安装apr/apr-util,…

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

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

python两个同切圆_求两个圆的交点

我试图在Python中找到两个圆之间的交集(使用Matplotlib)&#xff0c;但是找不到任何值。在为此&#xff0c;我为每个单独的圆创建X和Y的列表(Matplotlib在绘制圆时将第一个参数作为X值&#xff0c;第二个参数作为Y值)&#xff0c;然后相应地使列表相交(例如&#xff0c;circle1…

oracle性能优化之awr分析

oracle性能优化之awr分析 作者&#xff1a;bingjava 最近某证券公司系统在业务期间系统运行缓慢&#xff0c;初步排查怀疑是数据库存在性能问题&#xff0c;因此导出了oracle的awr报告进行分析&#xff0c;在此进行记录。 导致系统的性能问题有很多&#xff0c;比如内存、cpu占…

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

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

python json.loads namespace_python json.loads兼容单引号数据的方法

Python的json模块解析单引号数据会报错&#xff0c;示例如下>>> import json>>> data "{field1: 0, field2: hehehehe, field3: hahaha}">>> json.loads(data)Traceback (most recent call last):File “”, line 1, inFile “/usr/lib/…

@class #import辨析 #include

解析&#xff1a; 很多刚开始学习iOS开发的同学可能在看别人的代码的时候会发现有部分#import操作写在 .m 文件中&#xff0c;而 .h 文件仅仅使用class进行声明&#xff0c;不禁纳闷起来&#xff0c;为什么不直接把#import放到h文件中呢&#xff1f; 这是因为 .h 文件在修改后&…

修改数据包欺骗服务器,Fiddler协议捕获编辑工具与Session欺骗原理详解

今天Kitty主要与大家分享Fiddler抓包工具与协议捕获编辑工具来与大家讲解Session欺骗原理过程&#xff0c;咱们主要通过Fiddller协议捕获工具来对比HTTPWatch两款工具之间的差别&#xff0c;最主要的是我们可以通过捕获到的请求进行二次编辑重新发送给服务器&#xff0c;这中间…

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

统计源期刊是什么意思&#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…

python requests 重试_我可以为requests.request设置最大重试次数吗?

这不仅会改变最大重试次数&#xff0c;而且还会启用回退策略&#xff0c;使所有http://地址在重试前睡眠一段时间(总共5次)&#xff1a;import requestsfrom urllib3.util.retry import Retryfrom requests.adapters import HTTPAdapters requests.Session()retries Retry(to…

产品专家Marty Cagan:不做仅仅会编码的人

Marty Cagan是享有世界声誉的产品管理专家&#xff0c;曾担任Netscape副总裁、eBay产品管理及设计高级副总裁。近日&#xff0c;记者在“PM-China首届产品经理高峰论坛”上对他做了专訪&#xff0c;请他分享自己的产品管理历程。 程序猿的工作 《程序猿》&#xff1a;据我所知。…