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. 如何在Vegas中安装激活Continuum插件

    视频剪辑插件Boris FX Continuum安装程序包含了多达250种插件.而视频剪辑软件Vegas Pro 18 Suite中提供了Boris FX Continuum Film Style U ...

  2. FL Studio中的文件设置介绍

    在fl中,我们想要找到文件设置选项,可以在主菜单中选择选项-文件设置来打开,也可以通过按"F10"快捷键来一步打开." 文件设置"页面可以将其他文件夹链接到浏览 ...

  3. iOS7使用iOS8上的方法报错处理

    问题描述 我们经常会遇到在低版本上使用高版本方法导致的bug,例如: WebKit discarded an uncaught exception in the webView:decidePolic ...

  4. 写给程序员的机器学习入门 (九) - 对象识别 RCNN 与 Fast-RCNN

    因为这几个月饭店生意恢复,加上研究 Faster-RCNN 用掉了很多时间,就没有更新博客了.这篇开始会介绍对象识别的模型与实现方法,首先会介绍最简单的 RCNN 与 Fast-RCNN 模型,下一篇 ...

  5. 04-Python里字符串的常用操作方法三-判断

    1. startswith(): 判断字符串是否以某个子串开始,是则返回True,否则返回False 示例: my_str = 'hello world and my and test and pyt ...

  6. day1(初始化项目结构)

    1.初始化项目结构  └─shiyanlou_project    │  .gitignore    │  README.en.md           # 英文    │  README.md    ...

  7. 在html页中添加视频的几种方式

    1.avi格式代码片断如下: <object id="video" width="400" height="200" border=& ...

  8. Linux 硬盘挂载及开机挂载

    一.分区 主分区.扩展分区.逻辑分区的区别 主分区:包含操作系统启动所必需的文件和数据的硬盘分区,如需在硬盘上安装操作系统,该硬盘必须得有一个主分区 扩展分区:除主分区外的分区,不能直接使用,必须再划 ...

  9. 学JAVA的艰难之路

    周五回家了,这两天也没有更新代码系列,很抱歉,之后会补上.今天刚到宿舍,写了会代码,想用一个数组的从键盘输入,再也弄不好了,最终在我不断的翻之前写的代码,终于是找到了一个例子,真的不容易,编程这东西, ...

  10. javascript:void(0)用法和常见问题

    javascript:void(0)的用法 下面的代码创建了一个超级链接,当用户以后不会发生任何事.当用户链接时,void(0) 计算为 0,但 Javascript 上没有任何效果. <a H ...