题目大意:给你m+3个点,有q个操作,每次要么询问当前点集构所构成的上凸壳总长度,要么在当前点集中删除一个点。

这题是吼题啊!!!

刚开始想着如何正常地做,考虑过用线段树维护一个区间内的凸包,发现并不行,要另请高明。

后来发现,这题并没有强制在线要求,我们不妨将所有的询问反过来处理。首先将从头到尾都没有被删除的点加入该凸包,然后将询问倒序处理,将原先的删点操作改为加点操作,随后动态维护该凸包并维护上凸壳总长度,需输出的答案压入一个栈中,最后逐个弹出输出即可。

至于如何动态维护凸包。本题有一个很特殊的条件:所有点坐标的x,y值均大于0,且必有一个点坐标为(0,0)。故我们可以用一个set维护当前在凸包上的点,当需要加入一个点k时,借助lower_bound找到与该点相邻夹角的两个点,直接进行维护即可。实现细节较为复杂,强烈建议先工整地将维护方法写在草稿纸上!!

PS:这次发现set容器的iterator有一些神奇的性质,假定有一个迭代器指针it,其后继为it1,在it未更新时,若有一个元素插入在it和it1之间,那么it1仍将认为其后继为it1而非新插入的元素,需要用某些方法更新下it(没有1a的元凶)

 #include<bits/stdc++.h>
#define M 210000
using namespace std;
struct node{
int x,y; node(){x=y=;}
node(int xx,int yy){x=xx; y=yy;}
friend node operator -(node a,node b){return node(a.x-b.x,a.y-b.y);}
friend int operator *(node a,node b){
return a.y*b.x-a.x*b.y;
}
friend bool operator <(node a,node b){
if(a.x==&&a.y==) return ;
if(b.x==&&b.y==) return ;
if(a.x*b.y==a.y*b.x) return a.x<b.x;
return a.y*b.x<a.x*b.y;
}
}a[M];
set<node> s; int n,x,y,m,op[M]={},id[M]={}; bool vis[M]={};
int cj(node a,node b,node c){return (b-a)*(c-a);}
double dis(node a,node b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
double ans=; void ins(node k){
set<node>::iterator now,nowm,nown,pre;
nown=nowm=now=s.upper_bound(k);
now--; nowm--; nowm--;
while(cj(*nowm,*now,k)>){
ans=ans-dis(*nown,*now)-dis(*now,*nowm)+dis(*nown,*nowm);
pre=now; *now--;
s.erase(pre);
if(nowm==s.begin()) break;
*nowm--;
}
if(cj(*now,k,*nown)>) return;
ans=ans-dis(*nown,*now)+dis(*nown,k)+dis(*now,k);
s.insert(k);
nowm=now=nown=s.find(k);
now++; nown++; nown++;
while(cj(*nowm,*now,*nown)>&&nown!=s.end()){
ans=ans-dis(*nown,*now)-dis(*now,*nowm)+dis(*nown,*nowm);
pre=now; *now++; *nown++;
s.erase(pre);
}
}
double ansp[M]={};int use=;
int main(){
scanf("%d%d%d",&n,&x,&y);
s.insert(node(,)); s.insert(node(n,)); s.insert(node(x,y));
ans=dis(node(,),node(x,y))+dis(node(x,y),node(n,));
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d",op+i);
if(op[i]==) continue;
scanf("%d",id+i);
vis[id[i]]=;
}
for(int i=;i<=n;i++) if(!vis[i]) ins(a[i]);
for(int i=m;i;i--){
if(op[i]==) {ansp[++use]=ans; continue;}
if(!vis[id[i]]) continue;
ins(a[id[i]]); vis[id[i]]=;
}
while(use) printf("%.2lf\n",ansp[use--]);
}

【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. R 语言安装问题集锦

    R安装问题R CMD INSTALL -l /data1/jhh/envirment/R/R_lib /data1/jhh/software/qvalue_2.10.0.tar.gz 问题1 :con ...

  2. 卡特尔16PF性格测试与答案

    大学生在职业生涯规划时,必须充分注意到自己的性格和职业的适宜性.性格是指一个人在生活中形成的对现实的稳定的态度和行为方式.研究表明,性格影响着一个人的职业取向,由于性格的不同,每个人对工作和职业的态度 ...

  3. 2018.07.24 bzoj3531: [Sdoi2014]旅行(树链剖分+动态开点)

    传送门 树链剖分. 如何维护? 如果颜色少直接每种颜色一颗线段树走人. 但这题颜色数量不大于1e5" role="presentation" style="po ...

  4. FIR IP

    (1)多通道系数处理 系数的格式 (1)       每组系数的长度必须一样长: (2)多组系数依次连接即可; 添加多组系数后会,FIR IP核在生成时会多出以下几个信号 .s_axis_config ...

  5. sqlite3数据库,增删改查

    搜索libsql //由于文件读写,归档,NSUserDefault,做持久存储的时候,是一个覆盖的过程,效率太低,更多的时候使用数据库来做持久化存储         //鉴于手机的硬件配置,使用轻量 ...

  6. (最小生成树 次小生成树)The Unique MST -- POJ -- 1679

    链接: http://poj.org/problem?id=1679 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82831#probl ...

  7. python网络编程应用(一)

     在之前的一篇博客<python网络编程基础>中介绍了socket.socket()函数及其应用,其实socket模块中还有很多属性可供网络应用程序使用.这里将详细讲解一下socket模块 ...

  8. Flash CC2015软件安装教程

    FLCC2015/64位下载地址: 链接:https://pan.baidu.com/s/1c1WoTTu 密码:k4hn 软件介绍: Flash是一种动画创作与应用程序开发于一身的创作软件.Flas ...

  9. 使用工厂方法配置bean的两种方式

    1.使用静态工厂方法: 对应的配置.xml文件: 2.通过实例工厂的方法来配置bean: 对应的xml文件:

  10. CentOS7 Docker 安装

    CentOS7 已经内置了docker ,可以直接安装 安装Docker 命令: sudo yum install -y docker  启动docker  命令: service docker st ...