4219: 跑得比谁都快

3007: 拯救小云公主

三角剖分的解释可以看这里:http://www.cnblogs.com/Enceladus/p/6706444.html

后一道是前一道的弱化版。

如果考虑一下二分答案再判定,判定的过程无非就是把每个点变成一个以答案为半价的圆,然后如果左上和右下被切开了肯定就不合法,那就变成1001里面那种对偶图,跑一下spfa就好。

再看其实就不需要二分答案了,把各个boss连接起来,二分的答案达到边权一半时这两个圆就相交。整条路径会在达到最大边权的时候完全连通,那么最大边权最小的路径就是答案。

看了题解才意识到这一点,我的破题能力是不是吃枣药丸啊?

所以就三角剖分+最小生成树,至于三角剖分我选择拉模版。

貌似得用long double

#include<cmath>
#include<cstdio>
#include<algorithm>
#define eps 1e-12
#define MN 110001
#define ld long double
using namespace std; int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
struct po{ld x,y;};
struct na{po p;int n;}p[MN];
struct e{int x,y,ne,pre;}b[MN<<];
struct bi{int x,y;ld z;}B[MN<<];
bool operator < (bi a,bi b){return a.z<b.z;}
bool operator < (na a,na b){return a.p.x==b.p.x?a.p.y<b.p.y:a.p.x<b.p.x;}
int n,m,num=,l[MN],st[MN],top,NUM=,x,y,_l[MN],_num=,fa[MN];ld _A,_B;
inline void _add(int x,int y){b[++num].x=x;b[num].y=y;b[num].ne=l[x];b[l[x]].pre=num;l[x]=num;}
inline void add(int x,int y){_add(x,y);_add(y,x);}
inline void _del(int i){if(l[b[i].x]==i)l[b[i].x]=b[i].ne;else{b[b[i].pre].ne=b[i].ne;if(b[i].ne)b[b[i].ne].pre=b[i].pre;}}
inline void del(int i){_del(i);_del(i^);}
ld cha(po a,po b,po c){return (b.x-a.x)*(c.y-b.y)-(c.x-b.x)*(b.y-a.y);}
bool _cha(po a,po b,po c){return cha(a,b,c)<=;}
inline bool ju(po a,po b,po c,po d){return (_cha(a,b,c)^_cha(a,b,d))&&(_cha(c,d,a)^_cha(c,d,b));}
ld sqr(ld x){return x*x;}
inline ld min(ld a,ld b){return a<b?a:b;}
bool incir(po a,po b,po c,po d){
ld m=(a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y))*.;
ld x=(sqr(a.x)*(b.y-c.y)+sqr(b.x)*(c.y-a.y)+sqr(c.x)*(a.y-b.y)-(a.y-b.y)*(b.y-c.y)*(c.y-a.y))/m;
ld y=((a.x-b.x)*(b.x-c.x)*(c.x-a.x)-sqr(a.y)*(b.x-c.x)-sqr(b.y)*(c.x-a.x)-sqr(c.y)*(a.x-b.x))/m;
return sqrt(sqr(x-a.x)+sqr(y-a.y))+eps>sqrt(sqr(x-d.x)+sqr(y-d.y));
}
void work(int L,int R){
if (R-L<=){
for (int i=L;i<R;i++)
for (int j=i+;j<=R;j++) add(i,j);
return;
}
int mid=L+R>>;
work(L,mid);work(mid+,R);
top=;
for (int i=L;i<=R;st[++top]=i++)
while (top>&&cha(p[st[top-]].p,p[st[top]].p,p[i].p)<) top--;
int Ld,Rd,id;
for (int i=;i<top;i++)
if (st[i]<=mid&&st[i+]>mid) Ld=st[i],Rd=st[i+];
add(Ld,Rd);
for(;;){
id=-;
for (int i=l[Ld];i;i=b[i].ne)
if (b[i].y!=Rd)
if (cha(p[b[i].y].p,p[Ld].p,p[Rd].p)>&&(id==-||incir(p[Ld].p,p[Rd].p,p[id].p,p[b[i].y].p))) id=b[i].y;
for (int i=l[Rd];i;i=b[i].ne)
if (b[i].y!=Ld)
if (cha(p[Ld].p,p[Rd].p,p[b[i].y].p)>&&(id==-||incir(p[Ld].p,p[Rd].p,p[id].p,p[b[i].y].p))) id=b[i].y;
if (id==-) break; if (id<=mid){
for (int i=l[Ld];i;i=b[i].ne)
if (b[i].y!=Rd)
if (ju(p[id].p,p[Rd].p,p[b[i].y].p,p[Ld].p)) del(i);
Ld=id;
}else{
for (int i=l[Rd];i;i=b[i].ne)
if (b[i].y!=Ld)
if (ju(p[id].p,p[Ld].p,p[b[i].y].p,p[Rd].p)) del(i);
Rd=id;
}
add(Ld,Rd);
}
}
int gf(int x){return fa[x]==x?x:fa[x]=gf(fa[x]);}
int main(){
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
register int i,j;
n=read();scanf("%Lf%Lf",&_A,&_B);
for (i=;i<n;i++) scanf("%Lf%Lf",&p[i].p.x,&p[i].p.y),p[i].n=i+,fa[i]=i;
sort(p,p+n);
work(,n-);
for (i=;i<n;i++)
for (j=l[i];j;j=b[j].ne) if (b[j].y>i) B[NUM].x=i,B[NUM].y=b[j].y,B[NUM++].z=sqrt(sqr(p[i].p.x-p[b[j].y].p.x)+sqr(p[i].p.y-p[b[j].y].p.y))/;
for (i=;i<n;i++) B[NUM].x=i,B[NUM].y=n,B[NUM++].z=min(p[i].p.x,_B-p[i].p.y);
for (i=;i<n;i++) B[NUM].x=i,B[NUM].y=n+,B[NUM++].z=min(_A-p[i].p.x,p[i].p.y);
n+=;fa[n-]=n-;fa[n-]=n-;
sort(B,B+NUM);
for (i=;i<NUM;i++){
int x=gf(B[i].x),y=gf(B[i].y);
if (x==y) continue;
fa[x]=y;
if (gf(n-)==gf(n-)) return printf("%.6Lf\n",B[i].z),;
}
}

upd 2017/12/26

  代码被hack了T_T,详见http://www.cnblogs.com/Enceladus/p/6706444.html

BZOJ:4219: 跑得比谁都快 3007: 拯救小云公主的更多相关文章

  1. 【BZOJ】【3007】拯救小云公主

    思路题 我的naive的做法是二分答案+判定是否有路径可走……但是没有正确理解[走的方向任意]这句话…… 其实就是说想咋走咋走= =360°无死角乱走…… 所以其实是个平面上的问题…… 我们可以换个方 ...

  2. BZOJ 3007 [SDOI2012]拯救小云公主 - 对偶图 + 并查集

    Solution 答案具有单调性, 显然可以二分答案. 有两个注意点 : 英雄是可以随便走的, 也就是不是网格图... 还有坐标不能小于$1$ QAQ 开始时英雄在左下角, 公主在右上角, 我们反过来 ...

  3. BZOJ 3007 解救小云公主 二分答案+对偶图

    题目大意:给定一个矩形和矩形内的一些点.求一条左下角到右上角的路径.使全部点到这条路径的最小距离最大 最小距离最大.果断二分答案 如今问题转化成了给定矩形中的一些圆形障碍物求左下角和右上角是否连通 然 ...

  4. 51Nod 1781 跑的比谁都快

    香港记者跑的比谁都快是众所周知的常识. 现在,香港记者站在一颗有 n 个点的树的根结点上(即1号点),编号为 i 的点拥有权值 a[i] ,数据保证每个点的编号都小于它任意孩子结点的别号. 我们假定这 ...

  5. 跑的比谁都快 51Nod - 1789

    香港记者跑的比谁都快是众所周知的常识.   现在,香港记者站在一颗有  nn 个点的树的根结点上(即1号点),编号为  ii 的点拥有权值  a[i]a[i] ,数据保证每个点的编号都小于它任意孩子结 ...

  6. [51nod1789] 跑得比谁都快

    题面 题解 设\(f[i]\)为根节点到\(i\)的最小耗时 设\(S\)为\(i\)的祖先集合, 可以得到 \[ f[i] = min(f[j] + (i - j)^p),j \in S \] 对于 ...

  7. 新型序列化类库MessagePack,比JSON更快、更小的格式

    MessagePack is an efficient binary serialization format. It lets you exchange data among multiple la ...

  8. 不想业务被中断?快来解锁华为云RDS for MySQL新特性

    摘要:新特性上线!华为云RDS for MySQL又添新技能,实力保障业务连续性. 本文分享自华为云社区<不想业务被中断?快来解锁华为云RDS for MySQL新特性>,作者:Gauss ...

  9. 有趣 GIF 动图集 - 仿佛每张小动图都诉说了一个小笑话或者小故事

    点这里 来自法国南特(Nantes)的 Guillaume Kurkdjian 目前还是个学生.Kurkdjian 擅长创作一些平面动态图像,这些有趣的小动图仿佛每张都诉说了一个小笑话或者小故事,像个 ...

随机推荐

  1. 使用canvas实现绚丽的时钟特效

    源码 https://github.com/2016Messi/Gorgeous-clock 效果展示 https://2016messi.github.io/Gorgeous-clock/ 如果各位 ...

  2. getchar() 、 scanf() 、流与缓冲区

    C中的缓冲区一直是debug的重灾区,今天在写一个命令行界面的时候又遇到了这个问题,所以来总结一波. 两函数的不同之处 scanf() 会把 stdinBuff 中的特定格式数据取出,非特定格式数据则 ...

  3. vue.js之过滤器,自定义指令,自定义键盘信息以及监听数据变化

    一.监听数据变化 1.监听数据变化有两种,深度和浅度,形式如下: vm.$watch(name,fnCb); //浅度 vm.$watch(name,fnCb,{deep:true}); //深度监视 ...

  4. ActiveMQ (二) 常用配置简介

    ActiveMQ的主要配置文件 ActiveMQ的一些常用的属性很多可以在对应的配置文件中进行配置的.比如访问web console的管理端的端口,用户名密码,连接MQ时的用户名和密码,持久化设置,是 ...

  5. JS中事件绑定的三种方式

    以下是搜集的在JS中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="upl ...

  6. Web API系列之二WebApi基础框架搭建

    本文主要介绍如何搭建一个WebApi的项目.关于如何搭建WebApi的方式一共有两种: 一.通过vs直接新建一个WebApi的项目,步骤如下: 第一步: 新建一个空的Web应用程序,可以理解为作为We ...

  7. Linux(CentOS6.5_X86.64)编译libjpeg出现“checking host system type... Invalid configuration `x86_64-unknown-linux-gnu': machine `x86_64-unknown' not recognized”的解决

    本文地址http://comexchan.cnblogs.com/,作者Comex Chan,尊重知识产权,转载请注明出处,谢谢!   今天在编译libjpeg 的时候,遇到下面的报错: checki ...

  8. python logging一个通用的使用模板

    import os import logbook from logbook.more import ColorizedStderrHandler from functools import wraps ...

  9. flask入门篇

    flask,Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . Flask简单易学,属于轻量级的,学起来 ...

  10. 全国交通咨询系统 by C++ on Linux

    信息存储 利用邻接表存储城市信息与线路信息,比邻接矩阵更加高效. 主要数据结构 I)Time,规范时间的输入输出格式 II)VNode,头结点,用于建立顶点表,存储城市信息 III)ArcNode,表 ...