BZOJ 2300 [HAOI2011]防线修建 ——计算几何
只需要倒着插入,然后维护一个凸包就可以了。
可以用来学习set的用法
- #include <map>
- #include <set>
- #include <cmath>
- #include <queue>
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- #define F(i,j,k) for (int i=j;i<=k;++i)
- #define D(i,j,k) for (int i=j;i>=k;--i)
- #define inf 100000
- #define ll long long
- #define mp make_pair
- #define sqr(x) x*x
- int n,x,y,m,k;
- struct Vector{
- double x,y;
- void print(){printf("Vector (%.3f,%.3f)\n",x,y);}
- };
- struct Point{
- int x,y;
- void print(){printf("Point (%d,%d)\n",x,y);}
- bool operator < (const Point b) const{
- return x==b.x?y<b.y:x<b.x;
- }
- }a[200005];
- set <Point> s;
- struct Options{int opt,id;}q[200005];
- double dist (Point a,Point b)
- {
- // printf("dist\n");
- // a.print();b.print();
- // printf("The ans is %.6f\n",sqr((double)a.x-b.x)+sqr((double)a.y-b.y));
- return sqrt(((double)a.x-b.x)*((double)a.x-b.x)+((double)a.y-b.y)*((double)a.y-b.y));
- }
- Vector operator - (Point a,Point b)
- {Vector ret;ret.x=a.x-b.x;ret.y=a.y-b.y;return ret;}
- double operator * (Vector a,Vector b)
- {
- // a.print(); printf("* * *\n");
- // b.print();
- // printf("= %.6f\n",a.x*b.y-a.y*b.x);
- return a.x*b.y-a.y*b.x;
- }
- int tot,del[200005];
- double ans[200005],now;
- Point newnode;
- void init()
- {
- now=n*1.0;
- newnode.x=0;newnode.y=0;
- s.insert(newnode);
- // newnode.x=0;newnode.y=-inf;
- // s.insert(newnode);
- newnode.x=n;newnode.y=0;
- s.insert(newnode);
- // newnode.x=n;newnode.y=-inf;
- // s.insert(newnode);
- // printf("now is %.6f\n",now);
- }
- void add(Point x)
- {
- // printf("Add "); x.print();
- set<Point>::iterator it,iL,iR;
- it=s.lower_bound(x);
- iL=it;iL--;iR=it;
- if ((x-*iL)*(*iR-x)>0) return;
- // printf("New node\n");
- now-=dist(*iL,*iR);
- for (;;)
- {
- iR=it;it++;
- if (it==s.end()) break;
- if ((*iR-x)*(*it-x)>0)
- {
- now-=dist(*iR,*it);
- s.erase(*iR);
- // printf("del R\n"); while (1);
- }
- else break;
- }
- for (;;)
- {
- if (iL==s.begin()) break;
- Point L=*iL; iL--;
- // (*iL-*it).print();
- // (*it-x).print();
- if ((L-*iL)*(x-*iL)>0)
- {
- now-=dist(*iL,L);
- s.erase(L);
- // printf("del L\n"); //while(1);
- }
- else break;
- }
- s.insert(x);
- it=s.find(x);
- iL=it;iL--;iR=it;iR++;
- now+=dist(*iL,x)+dist(x,*iR);
- // printf("now is %.6f\n",now);
- return ;
- }
- void Finout()
- {
- freopen("defense.in","r",stdin);
- freopen("defense.out","w",stdout);
- }
- int main()
- {
- // freopen("in.txt","r",stdin);
- scanf("%d%d%d",&n,&x,&y);
- scanf("%d",&m);
- F(i,1,m) scanf("%d%d",&a[i].x,&a[i].y);
- scanf("%d",&k);
- // printf("k is %d\n",k);
- F(i,1,k)
- {
- scanf("%d",&q[i].opt);
- switch(q[i].opt)
- {
- case 1:scanf("%d",&q[i].id); del[q[i].id]=1;break;
- case 2:q[i].id=++tot; break;
- }
- }
- // F(i,1,k) printf("Opt %d id %d\n",q[i].opt,q[i].id);
- init(); newnode.x=x;newnode.y=y;add(newnode);
- F(i,1,m) if (!del[i]) add(a[i]);
- D(i,k,1)
- {
- switch(q[i].opt)
- {
- case 1:add(a[q[i].id]);break;
- case 2:ans[q[i].id]=now;break;
- }
- }
- F(i,1,tot) printf("%.2f\n",ans[i]);
- }
BZOJ 2300 [HAOI2011]防线修建 ——计算几何的更多相关文章
- BZOJ 2300: [HAOI2011]防线修建( 动态凸包 )
离线然后倒着做就变成了支持加点的动态凸包...用平衡树维护上凸壳...时间复杂度O(NlogN) --------------------------------------------------- ...
- bzoj 2300: [HAOI2011]防线修建 凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题解 这道题让我们维护一个支持动态删除点的上凸壳 并且告诉了我们三个一定不会被删除 ...
- bzoj 2300 : [HAOI2011]防线修建
set动态维护凸包 #include<iostream> #include<cstdio> #include<cstring> #include<algori ...
- bzoj 2300 [HAOI2011]防线修建 set动态维护凸包
题目大意 动态删点,求凸包周长 分析 反过来变成动态加点 用set维护平衡树 具体是找到凸包上左右两点 拆开 就可以把左边当作顺时针求的一个凸包,右边当作逆时针求的一个凸包,像栈那样出set就好了 注 ...
- 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)
2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...
- bzoj2300#2300. [HAOI2011]防线修建
题解:带删点的维护凸包,1.删点2.查询凸包周长 题解:倒着做就成了带加点的维护凸包,加点时维护一下周长就没了 //#pragma GCC optimize(2) //#pragma GCC opti ...
- bzoj千题计划236:bzoj2300: [HAOI2011]防线修建
http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...
- 【题解】P2521 [HAOI2011]防线修建(动态凸包)
[题解]P2521 [HAOI2011]防线修建(动态凸包) 凸包是易插入不好删除的东西,按照剧情所以我们时光倒流 然后问题就是维护凸包的周长,支持加入 本来很简单,但是计算几何就是一些小地方经验不足 ...
- [luogu P2521] [HAOI2011]防线修建
[luogu P2521] [HAOI2011]防线修建 题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国 ...
随机推荐
- angulajs中引用chart.js做报表,修改线条样式
目前还有个问题,在手机上看,当折线y轴值超过1000,会有点问题 1.下载chart js,可以用bower 命令下载 http://www.chartjs.org/docs/#line-chart- ...
- mysqlsla安装和使用介绍
安装mysqlsla源码路径:https://github.com/daniel-nichter/hackmysql.com源码存放路径:/usr/local/src1.获取源码如果没有git命令,请 ...
- 清理ThreadLocal
在我很多的课程里(master.concurrency.xj-conc-j8),我经常提起ThreadLocal.它经常受到我严厉的指责要尽可能的避免使用.ThreadLocal是为了那些使用完就销毁 ...
- iphone图片简单处理
使用sips批量缩放图片大小 >>sips -s format jpeg -Z 250 someImage.PNG --out myImage.JPEG 把someImage.PNG转换为 ...
- 关于highchts X时间轴比设置时间相差好几个小时的解决
经过一番查询和研究发现,在曲线图里,x轴的UNIX时间戳是要乘以1000的(通过在线的UNIX转换,结果与原来没有乘以1000的时间戳相差甚远),不然显示的时间会有很大的误差,真是百思不得其解. 另外 ...
- SSH中的jar包讲解
我们在搭建SSH框架的时候,需要引入各自的一些jar包 首先,先来看一下我们使用的SSH的各自版本及引入的jar包. struts2.3.1.2: struts2-core-2.3.1.jar j ...
- 使用Microsoft Hadoop(一)
To run this program, stage some data in HDFS: 1. create a text file called input.txt that has one in ...
- H3C交换机系统时间设置漏洞
H3C交换机系统时间设置存在漏洞 1. 背景说明 由于在编写<主机房网络延伸实施方案>,调试H3C S5120S-28P-EI交换机时,发现交换机设置成现在的时间后,导致本地用户通过ssh ...
- Java第十二次作业:什么是一维数组?什么是对象数组?吃金币游戏2.0版 新增炸弹功能 新增游戏倒计时功能 新增胜利失败检测功能 使用如鹏游戏引擎制作窗体 一维数组设置金币
什么是数组? 数组的定义:是用统一的名字代表这批数据,用序号来区分各个数据.数组是无序的数据元素按有序的下标组成的集合,分配固定空间大小的一种容器. 如何理解:其实就是一个同时放很多数据的变量. a= ...
- js的命令模式
命令模式: 什么叫命令模式: 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式主要有四个部分: 命令对象(comma ...