2015
04-14

# Cross the Fire

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 84    Accepted Submission(s): 43

Problem Description
Our hero is planned to cross an important street, the other side of the street is the headquarters of the enemy. The whole street is a rectangle with length L and width W. Because the streets are sealed of the building block on both up and down side, we assumed
people can only walk down on the street but not get out the up and down board.
In order to prevent our hero, the evil enemy layout N mines in the street. Due to internal staff informed in advance, the hero has known the distribution of all mines, and their explosion radius and explosion power. The mine enemy used is an amazing sense-mine,
as long as the person come into its sensing radius, it will explode, due to unknown reasons, the explosion radius of each mine is same to its sensing radius. Heroes have a certain strength value at first, but once he touching a mine, he will lose some strength
value same to the explosion power of this mine. Once the hero’s strength value is not greater than zero, he will die.
Now hero want you to help him calculate whether there is a path so that he can live to reach the enemy headquarters. If he can live to cross the street, he wants to know the maximum remaining strength value after crossing the street. We assume the hero’s path
trajectory is arbitrary.

Input
The input consists of several test cases.
The first line contains four integers L, W, N and P– the length and the width of the street, the number of mines, and the initial strength value of hero, respectively(1 ≤ L ≤ 10000 ,1 ≤ W ≤ 10000, 1 ≤ N ≤ 250, 1 ≤ P ≤ 1000000). Each of the following N lines
contains four integers Xi, Yi, Ri and Pi – the coordinates, the sensing radius(explosion radius) and the explosion power of i-th mine in the street (0 ≤ Xi ≤ L, 0 ≤ Yi ≤ W, 1 ≤ Ri ≤ 100, 1 ≤ Pi ≤ 10000). The coordinates and radius are given in meters, relative
to the street: the southwestern corner of the street has coordinates (0, 0), and the northeastern corner of the street has coordinates (L, W).
Note that crossing the street may start at coordinate (0, ys ) for any 0 ≤ ys ≤ W and end at coordinate (L, ye ) for any 0 ≤ ye ≤ W . Neither ys nor ye need to be integer.

Output
For each input cases, if our hero cannot live to cross the street, please output “Our hero has been killed”; otherwise output the maximum remaining strength value after crossing the street.

Sample Input
130 340 5 2
10 50 100 1
130 130 100 1
70 170 100 1
0 180 100 1
60 260 100 1

Sample Output
1

#include <iostream>
#include <set>
#include <cmath>
using namespace std;
const int N=1005;
const int inf=0x3f3f3f3f;
struct circle
{
int x,y,r;
}a[N];
struct rec
{
}edge[50500];
int n,m,st,ed,num,P,L,W;
double Dis(circle a,circle b)
{
double x=a.x-b.x;
double y=a.y-b.y;
return sqrt(x*x+y*y);
}
{
edge[num].v=v;
edge[num].w=w;
edge[num].v=u;
edge[num].w=0;
}
int SAP()
{
int i,u,v,mindis,aug=inf,ans=0;
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
for(i=1;i<=ed;i++)
gap[0]=ed;
u=pre[st]=st;
while(dis[st]<ed)
{
{
v=edge[i].v;
if(edge[i].w && dis[u]==dis[v]+1)
{
pre[v]=u;
u=v;
if(aug>edge[i].w)
aug=edge[i].w;
if(u==ed)
{
for(u=pre[u];v!=st;v=u,u=pre[u])
{
edge[cur[u]].w-=aug;
edge[cur[u]^1].w+=aug;
}
ans+=aug;
aug=inf;
}
goto loop;
}
}
mindis=ed;
{
v=edge[i].v;
if(edge[i].w && mindis>dis[v])
{
mindis=dis[v];
cur[u]=i;
}
}
if(--gap[dis[u]]==0)
break;
gap[dis[u]=mindis+1]++;
u=pre[u];
}
return ans;
}
int main()
{
int i,j,k,w;
while(~scanf("%d%d%d%d",&L,&W,&n,&P))
{
st=2*n+1;
ed=2*n+2;
num=2;
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].r,&w);
if(W-a[i].y<=a[i].r)
if(a[i].y<=a[i].r)
}
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(Dis(a[i],a[j])<=a[i].r+a[j].r)
{
}
k=SAP();
if(k>=P)
puts("Our hero has been killed");
else
printf("%d\n",P-k);
}
return 0;
}