BZOJ:4219: 跑得比谁都快 3007: 拯救小云公主

4219: 跑得比谁都快

3007: 拯救小云公主

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

如果考虑一下二分答案再判定,判定的过程无非就是把每个点变成一个以答案为半价的圆,然后如果左上和右下被切开了肯定就不合法,那就变成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=0;read_ca=getchar();
    while(read_ca<‘0‘||read_ca>‘9‘) read_ca=getchar();
    while(read_ca>=‘0‘&&read_ca<=‘9‘) read_p=read_p*10+read_ca-48,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<<5];
struct bi{int x,y;ld z;}B[MN<<5];
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=1,l[MN],st[MN],top,NUM=0,x,y,_l[MN],_num=0,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^1);}
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)<=0;}
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))*2.;
    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<=2){
        for (int i=L;i<R;i++)
        for (int j=i+1;j<=R;j++) add(i,j);
        return;
    }
    int mid=L+R>>1;
    work(L,mid);work(mid+1,R);
    top=0;
    for (int i=L;i<=R;st[++top]=i++)
    while (top>1&&cha(p[st[top-1]].p,p[st[top]].p,p[i].p)<0) top--;
    int Ld,Rd,id;
    for (int i=1;i<top;i++)
    if (st[i]<=mid&&st[i+1]>mid) Ld=st[i],Rd=st[i+1];
    add(Ld,Rd);
    for(;;){
        id=-1;
        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)>0&&(id==-1||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)>0&&(id==-1||incir(p[Ld].p,p[Rd].p,p[id].p,p[b[i].y].p))) id=b[i].y;
        if (id==-1) 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=0;i<n;i++) scanf("%Lf%Lf",&p[i].p.x,&p[i].p.y),p[i].n=i+1,fa[i]=i;
    sort(p,p+n);
    work(0,n-1);
    for (i=0;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))/2;
    for (i=0;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=0;i<n;i++) B[NUM].x=i,B[NUM].y=n+1,B[NUM++].z=min(_A-p[i].p.x,p[i].p.y);
    n+=2;fa[n-1]=n-1;fa[n-2]=n-2;
    sort(B,B+NUM);
    for (i=0;i<NUM;i++){
        int x=gf(B[i].x),y=gf(B[i].y);
        if (x==y) continue;
        fa[x]=y;
        if (gf(n-2)==gf(n-1)) return printf("%.6Lf\n",B[i].z),0;
    }
}

时间: 2024-12-06 11:35:18

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

[BZOJ 3007] 拯救小云公主 对偶图

题意 给定 $r, c$ , 以及矩形 $(1, 1), (r, c)$ 内的 $n$ 个点组成的点集 $S$ . 求一条从 $(1, 1)$ 到 $(r, c)$ 的矩形内的路径, 最大化路径到 $S$ 中的点的最小距离. $n \le 3000$ . 分析 考虑二分答案 $x$ , 判定: 当前有 $n$ 个半径为 $x$ 的圆, 是否能从 $(1, 1)$ 走到 $(r, c)$ . 原图存在路径, 当且仅当对偶图不存在将 $(1, 1)$ 与 $(r, c)$ 割开的边集, 即不存在从左

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

思路题 我的naive的做法是二分答案+判定是否有路径可走……但是没有正确理解[走的方向任意]这句话…… 其实就是说想咋走咋走= =360°无死角乱走…… 所以其实是个平面上的问题…… 我们可以换个方向来考虑……二分一个答案,判断英雄走到/走不到公主那里,是不是就等价于,boss控制的区域连起来了使得英雄走不到公主那里了?(狼抓兔子的即视感) 所以我们可以转化成从上边&左边,在boss之间走,使得走到下边&右边 路径上最大的一条边(边权代表着如果英雄从这两个boss之间经过,离两个boss

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

题目大意:给定一个矩形和矩形内的一些点.求一条左下角到右上角的路径.使全部点到这条路径的最小距离最大 最小距离最大.果断二分答案 如今问题转化成了给定矩形中的一些圆形障碍物求左下角和右上角是否连通 然后就是对偶图的问题了 左下角和右上角连通等价于对偶图中左上两条边和右下两条边不连通 因此将全部相交的圆之间连边,从左上两条边广搜就可以 时间复杂度O(n^2log(min(r,l)/EPS)) #include <cmath> #include <cstdio> #include &l

[51nod1789] 跑得比谁都快

题面 题解 设\(f[i]\)为根节点到\(i\)的最小耗时 设\(S\)为\(i\)的祖先集合, 可以得到 \[ f[i] = min(f[j] + (i - j)^p),j \in S \] 对于\((i - j)^p\), 我们有 \[ ((i + 1) - (j + 1))^p + (i - j)^p \geq ((i + 1) - j)^p + (i - (j + 1))^p \] 可以发现这是一个满足四边形不等式的式子 直接上决策单调性即可(我这个写法是看的别人的, 应该是对的吧)

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

MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte i

海外优秀资讯抢先看12:世界上最薄的硅材料将为您带来引爆眼球的更快,更小,更高效的计算机芯片

One-atom-thin 'silicene' silicon transistors invented 原子大小数量级的硅烯晶体管宣告诞生 World's thinnest silicon material promises dramatically faster, smaller, more efficient computer chips 世界上最薄的硅材料将有望带来引人注目的更快,更小,更高效的计算机芯片 February 5, 2015 2015年2月5号 The first tra

假设一对耗子每个月都可以生一对小耗子。小耗子生长3个月后,从第4个月开始也就能够生小耗子。问:假设所有的耗子都不死的话,那么20个月后一共有多少只耗子?

#include <stdio.h>void main(){ int i=0,old=2,first=0,second=0,third=0,sum=0; for(i=0;i<20;i++) { old=old+third; third=second; second=first; first=old; } sum=old+first+second+third; printf("20个月后一共有%d只耗子!\n",sum);} 分析图: 假设一对耗子每个月都可以生一对小耗

用聚合数据API快速写出小程序(苏州实时公交)

利用聚合数据API快速写出小程序,过程简单. 1.申请小程序账号 2.进入开发 3.调用API.比如"苏州实时公交"小程序,选择的是苏州实时公交API. 苏州实时公交API文档:https://www.juhe.cn/docs/api/id/31 如下,是"苏州实时公交"小程序调用代码:  var url = "https://apis.juhe.cn/szbusline/bus";    //为了您的密钥安全,建议使用服务端代码中转请求,事例代

首场微信小论坛上他们都聊了哪些小程序的议题

11月16日,微信团队在广州举办了"微信小论坛-小程序专场".4个小时,23个行业,60多家企业,近100名的微信生态从业者,展开了一场围绕小程序的探讨.他们都聊了哪些小程序的议题呢?1.你所在的行业和小程序有什么结合点?2.微信开放什么能力才是你心目中的“微信”小程序?3.你怎么看“用完即走”?4.如何构建健康有序的小程序生态? 首场小论坛上他们都聊了哪些小程序的议题 微信小论坛-小程序专场 小程序专场只是微信小论坛的第一场,后面还会围绕不同的垂直行业进行探讨,交流启发.你最关心什么