BZOJ 1822 Frozen Nova 冷冻波(最大流)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1822

题意:WJJ喜欢“魔兽争霸”这个游戏。在 游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵。我们认为,巫妖和小精灵都可以看成是平面上的点。 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以 瞬间杀灭一个小精灵。 在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放。不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以杀死一个小精灵。 现在巫妖的头目想知道,若从0时刻开始计算,至少需要花费多少时间,可以杀死所有的小精灵?

思路:预处理每个巫妖可以杀死的精灵。之后 二分答案最大流判可行性。但是我觉得这个数据有问题。下面这个预处理是用的别人的。我原来写的是WA。但是我觉得这个预处理是有bug的。他是直接相当于 求树到巫妖和精灵连线的距离小于树的半径。但是我觉得这个不对的。比如巫妖和精灵在树的同一侧。

struct node
{
    int v,cap,next;
};

node edges[N*N];
int head[N],e;

void add(int u,int v,int cap)
{
    edges[e].v=v;
    edges[e].cap=cap;
    edges[e].next=head[u];
    head[u]=e++;
}

void Add(int u,int v,int cap)
{
    add(u,v,cap);
    add(v,u,0);
}

int cur[N],h[N],num[N],pre[N];

int Maxflow(int s,int t,int n)
{
    int i;
    for(i=0;i<=n;i++) h[i]=num[i]=0,cur[i]=head[i];
    int u=s,ans=0,Min,k,x;
    while(h[u]<n)
    {
        if(u==t)
        {
            Min=INF+1;
            for(i=s;i!=t;i=edges[cur[i]].v)
            {
                x=cur[i];
                if(edges[x].cap<Min) Min=edges[x].cap,k=i;
            }
            ans+=Min; u=k;
            for(i=s;i!=t;i=edges[cur[i]].v)
            {
                x=cur[i];
                edges[x].cap-=Min;
                edges[x^1].cap+=Min;
            }
        }
        for(i=cur[u];i!=-1;i=edges[i].next)
        {
            if(edges[i].cap>0&&h[u]==1+h[edges[i].v])
            {
                break;
            }
        }
        if(i!=-1)
        {
            cur[u]=i;
            pre[edges[i].v]=u;
            u=edges[i].v;
        }
        else
        {
            if(--num[h[u]]==0) break;
            cur[u]=head[u];
            x=n;
            for(i=head[u];i!=-1;i=edges[i].next)
            {
                k=edges[i].v;
                if(edges[i].cap>0&&h[k]<x) x=h[k];
            }
            h[u]=x+1;
            num[x+1]++;
            if(u!=s) u=pre[u];
        }
    }
    return ans;
}

struct A
{
    int x,y,r,t;

    void get()
    {
        RD(x,y); RD(r,t);
    }
};

A a[N];

struct B
{
    int x,y;
    void get()
    {
        RD(x,y);
    }
};

B b[N];

struct C
{
    int x,y,r;

    void get()
    {
        RD(x,y,r);
    }
};

C c[N];

int n,m,K;
vector<int> V[N];

int dis(int x,int y)
{
    return x*x+y*y;
}

int check(A pa,B pb,C pc)
{
    double a=sqrt(dis(pa.x-pb.x,pa.y-pb.y)*1.0);
    double b=sqrt(dis(pc.x-pb.x,pc.y-pb.y)*1.0);
    double c=sqrt(dis(pa.x-pc.x,pa.y-pc.y)*1.0);
    double p=(a+b+c)/2;
    double s=sqrt(p*(p-a)*(p-b)*(p-c));
    double tmp=a*pc.r/2;
    if(tmp>=s) return 0;
    return 1;
}

void init()
{
    int i,j,k;
    FOR1(i,n) FOR1(j,m)
    {
        if(dis(a[i].x-b[j].x,a[i].y-b[j].y)>a[i].r*a[i].r) continue;
        FOR1(k,K) if(!check(a[i],b[j],c[k])) break;
        if(k>K) V[i].pb(j);
    }
}
int OK(int mid)
{
    clr(head,-1); e=0;
    int s=0,t=n+m+1,i,j,k;
    FOR1(i,n) Add(s,i,mid/a[i].t+1);
    FOR1(i,m) Add(n+i,t,1);
    FOR1(i,n) FOR0(j,SZ(V[i]))
    {
        k=V[i][j];
        Add(i,n+k,1);
    }
    return Maxflow(s,t,t+1)==m;
}

int main()
{
    RD(n,m,K);
    int i,j;
    FOR1(i,n) a[i].get();
    FOR1(i,m) b[i].get();
    FOR1(i,K) c[i].get();
    init();
    int low=0,high=INF,mid,ans=-1;
    while(low<=high)
    {
        mid=(low+high)>>1;
        if(OK(mid)) ans=mid,high=mid-1;
        else low=mid+1;
    }
    PR(ans);
}

BZOJ 1822 Frozen Nova 冷冻波(最大流),布布扣,bubuko.com

时间: 2024-08-09 14:37:31

BZOJ 1822 Frozen Nova 冷冻波(最大流)的相关文章

bzoj 1822: [JSOI2010]Frozen Nova 冷冻波 题解

[原题] 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 796  Solved: 218 [Submit][Status] Description WJJ喜欢"魔兽争霸"这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没

bzoj1822: [JSOI2010]Frozen Nova 冷冻波

1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1640  Solved: 516[Submit][Status][Discuss] Description WJJ喜欢"魔兽争霸"这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的

BZOJ1822 Frozen Nova 冷冻波

1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MB Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵.

[JSOI2010][BZOJ1822] Frozen Nova 冷冻波

1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1147  Solved: 344[Submit][Status][Discuss] Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被

【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流

题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵. 在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放.不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以

BZOJ 1822 JSOI 2010 Frozen Nova 冷冻波 二分+网络流

题目大意:在平面中有一些巫妖和一些小精灵,还有一些树会阻挡巫妖的视线.每一个巫妖都有一个攻击半径,如果一个小精灵在巫妖的攻击半径内,两点之间的连线没有树木阻挡,那么巫妖就可以秒杀小精灵.每个巫妖都有技能的CD.问最快多长时间可以使小精灵全灭. 思路:看出范围知算法系列.很明显的二分+最大流.二分最短时间,在这个时间内,每个巫妖可以发招time / CD + 1次.那么每次建图就从S到每个巫妖连能够输出的次数流量的边.每个巫妖向能攻击到的小精灵连边,之后每个小精灵向T连边.每次判断max_flow

BZOJ 1822[JSOI2010]Frozen Nova 冷冻波

网络流+二分. n^3枚举判断每个巫妖可以攻击的精灵,向其连1的边,每个精灵向汇点连1的边. 二分答案,修改源点流向每个巫妖的cap,跑最大流看是否等于精灵数. 恩,看起来没什么毛病. 然后狂WA不止.调了一晚上.拍了大半晚上,发现网上找的拿来拍的程序是个WA的...我还能说些什么呢.. 这时候才发现我应该算点到线段的距离而不是直线.保持微笑. 原来这题还有一个计算几何的tag? 算点到直线的距离d,点到线段两点的距离,短的为l,长的为r. 勾股定理算出tmp=sqrt(r*r-d*d);若是t

【计算几何】【二分答案】【最大流】bzoj1822 [JSOI2010]Frozen Nova 冷冻波

用三角形面积什么的算算点到直线的距离之类……其实相切的情况是可行的……剩下的就跟某SDOI2015一样了. #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<queue> using namespace std; #define N 201 #define EPS 0.000001 #define INF 2147483647 struc

【BZOJ1822】【JSOI2010】Frozen Nova 冷冻波

题解:二分答案,然后网络流check. 注意: 理论上来讲,因为如果有 ----------- /             \ /                \ 巫妖----小精灵----------------树桩------- \                  / \                / \----------- / 这种情况,直接用点到直线距离公式是会错误判断的. 但是读者们请用点到直线距离公式吧. 因为数据貌似是这样的. 不妨把巫妖的目光看成能穿透小精灵吧~(至于能