Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 566 Accepted Submission(s): 135
#include
#include
#include
const int maxint=1<<30-1;
const double eps=1e-8;
int sign(double x)
{
return (x>eps)-(x<-eps);
}
struct point
{
double x,y;
point() {}
point(double xx,double yy):x(xx),y(yy) {}
point operator+ (const point& a) const { return point(x+a.x,y+a.y); }
point operator- (const point& a) const { return point(x-a.x,y-a.y); }
double operator* (const point& a) const { return x*a.y-y*a.x;}
double dot(const point& a) const { return x*a.x+y*a.y;}
double dist() const { return x*x+y*y;}
double length() const { return sqrt(dist()); }
void input() { scanf("%lf%lf",&x,&y); }
void output() const { printf("%lf %lf/n",x,y);}
}lich[201],wisp[201],tree[201];
int link[201][201];
int n,m,k,tmax;
bool flag,used[201];
int r[201],t[201],tr[201],tnow[201];
bool g[201][201];
bool can(int t)
{
for(int i=0;i
if(used[i]==0&&g[i][t])
{
used[i]=1;
if(link[i][0]
link[i][++link[i][0]]=t;
return true;
}
else
{
for(int j=1; j<=link[i][0]; j++)
if(can(link[i][j]))
{
link[i][j]=t;
return true;
}
}
}
}
return false;
}
bool MaxMatch(int x)
{
for(int i=0;i
memset(used,false,sizeof(used));
if(!can(i)) return false;
}
return true;
}
void solve()
{
int fir=0,sec=tmax*m;
int ans=0;
while(fir
int mid=(fir+sec)>>1;
if(MaxMatch(mid))
{
flag=true;
ans=mid;
sec=mid;
}
else
fir=mid+1;
}
if(flag) printf("%d/n",ans);
else printf("-1/n");
}
bool nova(point& a,point& b,int r)
{
if(sign((a-b).dist()-r*r)>0) return false;
for(int i=0;i
if(sign(fabs((tree[i]-a)*(b-a))/(a-b).length()-tr[i])>0) continue;
if(sign((tree[i]-a).dot(b-a))<0 || sign((tree[i]-b).dot(a-b)<0)) continue;
return false;
}
return true;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
tmax=0;
flag=false;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i
lich[i].input();
scanf("%d%d",&r[i],&t[i]);
if(t[i]>tmax) tmax=t[i];
}
for(int i=0;i
tree[i].input();
scanf("%d",&tr[i]);
}
for(int i=0;i
solve();
}
return 0;
}