https://www.luogu.org/problemnew/show/2521

题意:维护一个上凸包:删点,查询周长


很容易想到把问题转换为离线:先读入全部操作,记录下最后剩下的点,倒着加点来维护凸包,同时也倒着做询问。

然后问题就变成了怎么维护加点的操作,这题其实只要维护上半个凸包(其实也有一点启发性了吧),用set存凸包的点集,对于要加的点往左右两边一直把不行的点删掉就好了,因为一个点最多被删一次所以加上set的$log$实际复杂度是$O(nlog n)$的而不是$O(n^2)$。

如果要维护整个凸包就根据y来记录一下两边的位置根据上下凸包分类讨论一下来维护。

#include<cstdio>
#include<cmath>
#include<set>
#include<algorithm>
using namespace std;
const int N=100005;
struct q
{
double ans;
int op,idx;
}ask[N<<1];
struct Point
{
double x,y;
Point(double x=0,double y=0):x(x),y(y){}
}p[N];
inline bool operator <(Point a,Point b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
inline Point operator - (Point a,Point b)
{
return Point(a.x-b.x,a.y-b.y);
}
inline double cross(Point a,Point b)
{
return a.x*b.y-a.y*b.x;
}
inline double dot(Point a,Point b)
{
return a.x*b.x+a.y*b.y;
}
inline double lenght(Point a)
{
return sqrt(dot(a,a));
}
double ans;
set<Point>s;
bool mark[N];
inline void ins(Point x)
{
set<Point>::iterator r=s.lower_bound(x);
set<Point>::iterator l=r;l--;
if(cross(*r-*l,x-*l)<0)return;
ans-=lenght(*r-*l);
s.insert(x);
while(1)
{
set<Point>::iterator it=r++;
if(r==s.end())break;
if(cross(*r-x,*it-x)>0)break;
ans-=lenght(*it-*r);
s.erase(*it);
}
while(1)
{
if(l==s.begin())break;
set<Point>::iterator it=l--;
if(cross(*l-x,*it-x)<0)break;
ans-=lenght(*it-*l);
s.erase(*it);
}
l=r=s.find(x);l--;r++;
ans+=lenght(x-*l)+lenght(x-*r);
}
int main()
{
int m,q;double x,y,n;
scanf("%lf%lf%lf",&n,&x,&y);
s.insert(Point(0,0));s.insert(Point(n,0));s.insert(Point(x,y));
ans+=lenght(Point(x,y))+lenght(Point(x-n,y));
scanf("%d",&m);
for(register int i=1;i<=m;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
scanf("%d",&q);
for(register int i=1;i<=q;i++)
{
scanf("%d",&ask[i].op);
if(ask[i].op==1)
scanf("%d",&ask[i].idx),mark[ask[i].idx]=1;
}
for(register int i=1;i<=m;i++)if(!mark[i])ins(p[i]);
for(register int i=q;i>=1;i--)
{
if(ask[i].op==2)ask[i].ans=ans;
else ins(p[ask[i].idx]);
}
for(register int i=1;i<=q;i++)if(ask[i].op==2)printf("%.2lf\n",ask[i].ans);
return 0;
}

[日常摸鱼]Luogu2521[HAOI2011]防线修建-set维护凸包的更多相关文章

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

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

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

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

  3. Luogu-2521 [HAOI2011]防线修建

    倒过来处理所有询问,就变成了一道动态凸包的裸题 吐槽一下这道题只要维护上凸壳就好了,我zz了没好好看题打了两个2333 // luogu-judger-enable-o2 #include<se ...

  4. BZOJ [HAOI2011]防线修建(动态凸包)

    听说有一种很高端的东西叫动态凸包维护dp就像学一下,不过介于本人还不会动态凸包就去学了下,还是挺神奇的说,维护上下凸包的写法虽然打得有点多不过也只是维护复制黏贴的事情而已罢了. 先说下动态凸包怎么写吧 ...

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

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

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

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

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

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

  8. P2521 [HAOI2011]防线修建

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

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

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

随机推荐

  1. 纯干货分享!2020阿里java岗笔试面试题总结(附答案)

    前言 2020金九银十马上结束,现为大家整理了这次金九银十面试阿里的面试题总结,都是我从朋友那拿到的面试真题,话不多说,满满的干货分享给大家! int a=10是原子操作吗? 是的.  注意点: i+ ...

  2. Guitar Pro 功能介绍之RSE引擎

    众所周知,Guitar Pro是一个集多音轨丰富音色库的一款软件,并且拥有MIDI 音序器,但是光拥有MIDI是无法让我们制作的音乐可以如此逼真,而Guitar Pro能创造制作这么逼真的音乐,多亏了 ...

  3. FL Studio中echo的延迟作用

    今天来一起研究FL Studio的Echo Delay的作用,Echo Delay可以从MIDI输入创建回声,并允许我们通过音量,声像,切除和共振,音高和时间来操纵延迟. 图1:Echo Dealy ...

  4. 利用css3实现照片列表展开小demo

    效果如下: 其实实现起来很简单,就是控制 宽 高的变化,然后给他加上transition 过度而已.觉得代码没什么难的地方,就不打注释了,如果哪里有不懂的话,可以直接评论呢. 直接上源码 html代码 ...

  5. Codeforces Round #677 (Div. 3) E、G题解

    E. Two Round Dances #圆排列 题目链接 题意 \(n\)(保证偶数)个人,要表演一个节目,这个节目包含两种圆形舞蹈,而每种圆形舞蹈恰好需要\(n/2\)个人,每个人只能跳一种圆形舞 ...

  6. CentOS下搭建文件共享服务

    nfs部署以及优化 Server端配置 安装rpm服务包 yum install -y nfs-utils 创建数据挂载点 mkdir -p /data 编辑exports文件 vi /etc/exp ...

  7. 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换

    [NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...

  8. springboot:读取application.yml文件

    现在开发主要使用微服务框架springboot,在springboot中经常遇到读取application.yml文件的情形. 一.概述 开发过程中经常遇到要读取application.yml文件中的 ...

  9. 极简python教程02:基础变量,删繁就简

    python极简教程已经开赛,如果错过说明可以回翻: 极简python教程:赛前说明 借这个机会,我再讲讲我的教程和其他网上的教程的区别: 1 我分享的内容,是我在工作中会高频使用的语法,是精华内容 ...

  10. Python中sorted(iterable, *, key=None, reverse=False)函数参数定义中的独立星号(*)的含义

    老猿在 <Python中函数的参数带星号是什么意思?>中介绍了Python函数中参数带星号的含义,而在实际使用和Python的标准文档中,会看到某写函数(如sorted(iterable, ...