bzoj-2300 防线修建
题意:
给出一个点集,每次可能删去一个点或查询上凸包的面积;
保证无重点,保证最左面 最右面的点一定在凸包上;
n<=100000,m<=200000;
题解:
动态凸包问题,然而这道题的保证简直极为良心;
所以呢,我们就可以用set来水这道题啦;
我还是涨了不少姿势的,比如迭代器居然可以自减;
离线所有的操作之后处理,就是凸包加点了;
每次来一个点,判断一下加不加入,之后左面干点右面干点,插进去就好了;
不过这题细节还是用很多,主要是边界问题吧;
时间复杂度O(set(n))O(nlogn);
代码:
#include<set>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 110000
#define iter set<Point>::iterator
using namespace std;
const double INF=1e100;
struct Point
{int x,y;Point(){}Point(int _,int __):x(_),y(__){}friend bool operator <(Point a,Point b){if(a.x==b.x)return a.y<b.y;return a.x<b.x;}friend bool operator ==(Point a,Point b){return a.x==b.x&&a.y==b.y;}friend bool slope (Point a,Point b,Point c){double s1=a.x==b.x?(a.y<b.y?INF:-INF):(a.y-b.y)*1.0/(a.x-b.x);double s2=b.x==c.x?(b.y<c.y?INF:-INF):(b.y-c.y)*1.0/(b.x-c.x);return s1<s2;}friend double dis(Point a,Point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+0.0);}
}a[N],p;
int Qx[N<<1],top;
bool Q[N<<1],ban[N];
double st[N<<1];
set<Point>s;
int main()
{int n,m,q,i,j,k;double ans;scanf("%d%d%d",&n,&p.x,&p.y);s.insert(p),s.insert(Point(0,0)),s.insert(Point(n,0));scanf("%d",&m);for(i=1;i<=m;i++){scanf("%d%d",&a[i].x,&a[i].y);}scanf("%d",&q);for(i=1;i<=q;i++){scanf("%d",&k);if(k==1){Q[i]=1;scanf("%d",Qx+i);ban[Qx[i]]=1;}}ans=dis(p,Point(0,0))+dis(p,Point(n,0));for(i=1;i<=m;i++){if(!ban[i]){iter it1=s.insert(a[i]).first;iter it2=it1,temp=it1;it1++,it2--;if(slope(*it2,a[i],*it1)){s.erase(temp);continue;}if(*it1==Point(n,0)&&*it2==Point(0,0))ans=0;elseans-=dis(*it1,*it2);temp=it1;while(++temp!=s.end()&&slope(a[i],*it1,*temp))ans-=dis(*it1,*temp),s.erase(it1++);temp=it2;while(temp--!=s.begin()&&slope(*temp,*it2,a[i]))ans-=dis(*it2,*temp),s.erase(it2--);ans+=dis(a[i],*it1)+dis(a[i],*it2);}}for(i=q;i>=1;i--){if(Q[i]){iter it1=s.insert(a[Qx[i]]).first;iter it2=it1,temp=it1;it1++,it2--;if(slope(*it2,a[Qx[i]],*it1)){s.erase(temp);continue;}if(*it1==Point(n,0)&&*it2==Point(0,0))ans=0;elseans-=dis(*it1,*it2);temp=it1;while(++temp!=s.end()&&slope(a[Qx[i]],*it1,*temp))ans-=dis(*it1,*temp),s.erase(it1++);temp=it2;while(temp--!=s.begin()&&slope(*temp,*it2,a[Qx[i]]))ans-=dis(*it2,*temp),s.erase(it2--);ans+=dis(a[Qx[i]],*it1)+dis(a[Qx[i]],*it2);}elsest[++top]=ans;}while(top){printf("%.2lf\n",st[top--]);}
}
bzoj-2300 防线修建相关推荐
- BZOJ 2300 防线修建(set维护凸包)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2300 题意:给出一些点,两种操作:(1)删掉某个点:(2)求剩下点构成的凸包的周长.(保 ...
- bzoj2300【HAOI2011】防线修建
2300: [HAOI2011]防线修建 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 696 Solved: 384 [ Submit][ St ...
- 【BZOJ2300】[HAOI2011]防线修建 set维护凸包
[BZOJ2300][HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可 ...
- [luogu P2521] [HAOI2011]防线修建
[luogu P2521] [HAOI2011]防线修建 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国 ...
- BZOJ 2300: [HAOI2011]防线修建|set维护凸壳
因为只支持插入操作,所以需要倒过来做.. 第一次写维护凸壳的东西-不抄题解..自己YY斜率乱搞(都忘了写叉乘)代码又长常数又大 1A一刻赛艇~ 还是找一个靠谱的的模板吧... #include< ...
- [bzoj2300] [HAOI2011]防线修建
Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护 ...
- cogs 547:[HAOI2011] 防线修建
★★★☆ 输入文件:defense.in 输出文件:defense.out 简单对比 时间限制:1 s 内存限制:128 MB 题目描述: 近来A国和B国的矛盾激化,为了预防不测,A国 ...
- Bzoj2300 / 洛谷P2521 [HAOI2011]防线修建
题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...
- 【bzoj2300】【Luogu P2521】 [HAOI2011]防线修建 动态凸包,平衡树,Set
一句话题意:给你一个凸包,每次可以插入一个点或者询问周长. 动态凸包裸题嘛,用\(Set\)实现.最初每个点坐标做乘三处理,便于取初始三角形的重心作为凸包判定原点. #include <bits ...
- P2521 [HAOI2011]防线修建
传送门 一眼看出可以倒着做转为加点维护凸包,然后--然后我就不会了-- 看了一眼题解,大概是这样的,我们先把所有点都读进来,然后按极角排序,也就是说定义点的大小为他们极角的大小(本题里实际上直接按x坐 ...
最新文章
- python与excel表格-超简单:用Python让Excel飞起来
- IT从业者都应关注的软件行业的变化
- 转:求多边形的面积 算法几何
- // 、| || 的区别
- 吴杭民:上海的生活成本高过纽约(贪污腐败横行)
- greenPlum资源隔离
- 网站渗透测试,看这篇就够了
- jvm(13)-线程安全与锁优化
- Spring 3.1缓存和配置
- 协议簇:TCP 解析: 建立连接
- .net 移除html标签,.net去除html标签代码
- Linux下限制用户通过SFTP访问指定目录
- 跟想这台计算机usb无法识别,无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...
- Bailian4107 19岁生日礼物-Birthday Gift【进制】
- JavaScript动态生成HTML元素
- [视频教程]MAME画质优化hq3x
- 浏览器-点击预览视频文件(自动播放、循环播放)
- 显示行数 设置ssh终端_SSH终端命令工具:zoc7 for Mac
- python发送邮箱_利用Python自动发送电子邮件
- HDMI协议介绍(六)--EDID