题目链接: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 冷冻波(最大流)的更多相关文章

  1. 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流

    1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 585  Solved: 175[Subm ...

  2. BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图

    这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...

  3. BZOJ1822 Frozen Nova 冷冻波

    1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MB Description WJJ喜欢“魔兽争霸”这个游戏. ...

  4. 【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波 几何+二分+网络流

    [BZOJ1822][JSOI2010]Frozen Nova 冷冻波 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀 ...

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

    题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...

  6. Bzoj1822 [JSOI2010]Frozen Nova 冷冻波

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1933  Solved: 608 Description WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖 ...

  7. BZOJ 1822[JSOI2010]Frozen Nova 冷冻波

    网络流+二分. n^3枚举判断每个巫妖可以攻击的精灵,向其连1的边,每个精灵向汇点连1的边. 二分答案,修改源点流向每个巫妖的cap,跑最大流看是否等于精灵数. 恩,看起来没什么毛病. 然后狂WA不止 ...

  8. BZOJ1822 [JSOI2010]Frozen Nova 冷冻波 二分+最大流

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1822 题解 好久没做网络流的,都没有想到网络流... 首先暴力判断一下一个巫妖和一个精灵之间能 ...

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

    用三角形面积什么的算算点到直线的距离之类……其实相切的情况是可行的……剩下的就跟某SDOI2015一样了. #include<cstdio> #include<cmath> # ...

随机推荐

  1. DMA-330(一)

    DMA Controller的interface: DMA Controller提供这些feature: 1)instruction set,对DMA transfer进行program 2)AXI ...

  2. For 循环嵌套 0309

                                                                                                     For ...

  3. php 下载保存文件保存到本地的两种方法

    第一种: 1 <? ?> 或 <?php //下载文件保存到本地//www.jbxue.comfunction downfile($fileurl){ob_start(); $fil ...

  4. cf-282e

    “字典树”的变形,任意两数异或最大值,处理字典树的时候可以用递归,也可以用循环,下面有两个版本. C - Sausage Maximization Time Limit:2000MS Memory L ...

  5. cvWaitKey();

    1.函数形式:int cvWaitKey(int delay=0 ): 函数功能:cvWaitKey()函数的功能是不断刷新图像,频率时间为delay,单位为ms. 参数:      delay——— ...

  6. java的servlet初步学习

    目录 1.servelet概念作用理解 ====来源于孤傲苍狼  http://www.cnblogs.com/xdp-gacl/p/3760336.html======= 2.servlet的运行过 ...

  7. JAVA NIO复习笔记

    1. JAVA NIO是什么? 从JDK1.4开始,java提供了一系列改进的输入/输出处理的新功能,这些功能被统称为新IO(New IO,简称NIO),新增了许多用于处理输入/输出的类,这些类都被放 ...

  8. linux下共享内存mmap和DMA(直接访问内存)的使用 【转】

    转自:http://blog.chinaunix.net/uid-7374279-id-4413316.html 介绍Linux内存管理和内存映射的奥秘.同时讲述设备驱动程序是如何使用“直接内存访问” ...

  9. Oracle 单行函数

    一.什么是函数 任何东西,只要它能接收输入,对输入进行加工并产生输出,它就可以被称为函数. 二.单行函数简介 单行函数只对表中的一行数据进行操作,并且对每一行数据只产生一个输出结果.单行函数可以接受一 ...

  10. 探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法

    前言相信这样一个问题,大家都不会陌生,“有什么的方法可以使Android的程序APK不用安装,而能够直接启动”.发现最后的结局都是不能实现这个美好的愿望,而腾讯Android手机游戏平台却又能实现这个 ...