题目描述

近来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,表示修建防线的花费,保留两位小数


提示

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

  • 题解:

    • 考虑倒着把点插入凸包;
    • 只需要每次找到点在原凸包的$x$坐标前驱后继删掉不构成凸包的再插入;
    • 可以用$splay$维护即可(常数不太好看)
    •  #include<cstdio>
      #include<iostream>
      #include<algorithm>
      #include<cstring>
      #include<queue>
      #include<cmath>
      #include<vector>
      #include<stack>
      #include<map>
      #include<set>
      #define Run(i,l,r) for(int i=l;i<=r;i++)
      #define Don(i,l,r) for(int i=l;i>=r;i--)
      #define ll long long
      #define ld double
      #define inf 0x3f3f3f3f
      #define mk make_pair
      #define fir first
      #define sec second
      #define il inline
      #define rg register
      #define pb push_back
      using namespace std;
      const int N=;
      int n,m,mx,tx,ty,ch[N][],sz[N],fa[N],vis[N],rt,cnt;
      ld now,ans[N<<];
      il char gc(){
      static char*p1,*p2,s[];
      if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
      return(p1==p2)?EOF:*p1++;
      }
      il int rd(){
      int x=; char c=gc();
      while(c<''||c>'')c=gc();
      while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
      return x;
      }
      struct poi{
      int x,y;
      poi(int _x=,int _y=):x(_x),y(_y){};
      bool operator <(const poi&A)const{return x==A.x?y<A.y:x<A.x;}
      poi operator -(const poi&A)const{return poi(x-A.x,y-A.y);}
      }p[N],q[N],Q[N<<];
      int crs(poi A,poi B){return A.x*B.y-A.y*B.x;}
      int dot(poi A,poi B){return A.x*B.x+A.y*B.y;}
      ld dis(poi A){return sqrt(A.x*A.x+A.y*A.y);}
      il void update(int x){sz[x]=sz[ch[x][]]+sz[ch[x][]]+;}
      il void rotate(int x,int&k){
      int y=fa[x],z=fa[y];
      if(y==k)k=x;else ch[z][ch[z][]==y]=x;
      int l=ch[y][]==x,r=l^;
      fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;
      ch[y][l]=ch[x][r],ch[x][r]=y;
      update(y);update(x);
      }
      il void splay(int x,int&k){
      for(int y,z;x!=k;rotate(x,k)){
      y=fa[x],z=fa[y];
      if(y!=k)rotate( (ch[y][]==x)^(ch[z][]==y) ? x : y ,k);
      }
      }
      il void ins(int&k,int x){
      if(!k)q[k=++cnt]=p[x];
      else {
      if(p[x]<q[k])ins(ch[k][],x),fa[ch[k][]]=k;
      else ins(ch[k][],x),fa[ch[k][]]=k;
      }
      update(k);
      }
      il int find_pre(int k,int x){
      int re=;
      while(k){
      if(q[k]<p[x])re=k,k=ch[k][];
      else k=ch[k][];
      }
      return re;
      }
      il int find_nxt(int k,int x){
      int re=;
      while(k){
      if(p[x]<q[k])re=k,k=ch[k][];
      else k=ch[k][];
      }
      return re;
      }
      il void insert(int x){
      int T1=find_pre(rt,x),T2=find_nxt(rt,x),t1,t2;
      if(crs(p[x]-q[T1],q[T2]-p[x])>=)return;
      now -= dis(q[T1]-q[T2]);
      for(splay(t1=T1,rt),t2=ch[t1][];sz[t2];){
      while(ch[t2][])t2=ch[t2][];
      splay(t2,ch[t1][]);
      if(crs(q[t1]-q[t2],p[x]-q[t1])>=){
      now -= dis(q[t1]-q[t2]);
      fa[ch[t2][]=ch[t1][]]=t2;
      update(rt=t2);
      t1=t2,t2=ch[t1][];
      }else break;
      }
      now += dis(p[x]-q[t1]);
      for(splay(t1=T2,rt),t2=ch[t1][];sz[t2];){
      while(ch[t2][])t2=ch[t2][];
      splay(t2,ch[t1][]);
      if(crs(q[t1]-q[t2],p[x]-q[t1])<=){
      now -= dis(q[t1]-q[t2]);
      fa[ch[t2][]=ch[t1][]]=t2;
      update(rt=t2);
      t1=t2,t2=ch[t1][];
      }else break;
      }
      now += dis(p[x]-q[t1]);
      ins(rt,x);
      }
      int main(){
      #ifndef ONLINE_JUDGE
      freopen("bzoj2300.in","r",stdin);
      freopen("bzoj2300.out","w",stdout);
      #endif
      mx=rd();tx=rd();ty=rd();n=rd();
      for(int i=;i<=n;++i)p[i].x=rd(),p[i].y=rd();
      p[]=poi(,);ins(rt,);
      p[n+]=poi(mx,);ins(rt,n+);
      p[n+]=poi(tx,ty);ins(rt,n+);
      now = dis(p[]-p[n+]) + dis(p[n+]-p[n+]);
      m=rd();for(int i=;i<=m;++i){Q[i].x=rd();if(Q[i].x&)vis[Q[i].y=rd()]=;}
      for(int i=;i<=n;++i)if(!vis[i])insert(i);
      for(int i=m;i;--i)if(Q[i].x&)insert(Q[i].y);else ans[i]=now;
      for(int i=;i<=m;++i)if(Q[i].x==)printf("%.2lf\n",ans[i]);
      return ;
      }//by tkys_Austin;

      bzoj2300

bzoj2300【HAOI2011】防线修建的更多相关文章

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

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

  2. BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)

    题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...

  3. BZOJ2300: [HAOI2011]防线修建

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2300 (我只是在发以前写过的题.. 因为题目没说强制在线,所以离线乱搞就可以了.先把点删掉然后 ...

  4. 2019.02.21 bzoj2300: [HAOI2011]防线修建(set+凸包)

    传送门 题意:动态维护凸包周长. 思路: 见这篇求面积的吧反正都是一个套路. 代码: #include<bits/stdc++.h> #define int long long #defi ...

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

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

  6. 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)

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

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

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

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

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

  9. P2521 [HAOI2011]防线修建

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

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

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

随机推荐

  1. [T-ARA][느낌 아니까][懂得那份感觉]

    歌词来源:http://music.163.com/#/song?id=27808771 作曲 : 박덕상/박현중 [作曲 : p/bag-ddeog-ssang-/p/ba-Kyeon-c/jung ...

  2. Win7-64位PowerDesigner下MySQLODBC驱动问题

    操作系统:win7-64位,PowerDesigner15.1(以下简称PD), MYSQL-ODBC-64驱动.安装完MYSQL-ODBC-64却找不到相关驱动,用PD反导数据库,却找不到Mysql ...

  3. python之爬虫_模块

    目录 一.requests模块二.Beautifulsoup模块 一.requests模块 1.介绍 Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但 ...

  4. Scrum立会报告+燃尽图(Final阶段第五次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2484 项目地址:https://coding.net/u/wuyy694 ...

  5. 如何将office卸载干净

    我试了控制面板卸载office软件等方法,发现一直卸载不干净. 后发现这个office的官方链接,根据这个链接的步骤就很轻松的卸载好了. https://support.office.com/zh-c ...

  6. (第十一周)约跑APP测试报告

    项目名称:约跑App 用户需求规格说明书URL:http://www.cnblogs.com/liquan/p/6071804.html 组长博客URL:http://www.cnblogs.com/ ...

  7. 第十章I/O

    系统级i/o 开始进程时的三个标准: 标准输入(描述符0):STDIN_FILENO 标准输出(描述符1):STDOUT_FILENO 标准错误(描述符2):STDERR_FILENO 文件位置: 从 ...

  8. JAVA第二次试验

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1352  姓名:潘俊洋  学号:20135230 成绩:             指导教师:娄嘉鹏 ...

  9. C++课程 second work _1025

    传送门 Problem 题目不是特别难,只是跪在了最后一个测试点(已解决). 最后一个测试点= = 无效节点...无力ing

  10. bug排查

    有时候让朋友,或者群友,或者同事帮忙看一样困扰你很久的bug会得到意向不到的结果. 因为他们往往不像你,已经在调试代码的过程中被一些东西给束缚了.他们会凭借自己的第一直觉来尝试解决问题,跳过你已经走的 ...