2692: 我得重新集结部队http://acm.zzuli.edu.cn/problem.php?id=2692
#include<bits/stdc++.h>
using namespace std;
struct node
{
int type;//虫=1,狂=2
long long x,y,h,atk,r;
int liu; ==2时狂离开
}p[3000];
int main()
{
int n;cin>>n;
int o=-1;
while(n--)
{
o++;
int t;cin>>t;
if(t==1)
{
p[o].type=1;
cin>>p[o].x>>p[o].y>>p[o].h;
}
else
{
p[o].type=2;
cin>>p[o].x>>p[o].y>>p[o].atk>>p[o].r;
long long a=-1,ans=1e18;
for(int i=0;i<=o;i++)
{
if(p[i].type==1&&p[i].h>0)
{
long long rr=abs((p[i].x-p[o].x)*(p[i].x-p[o].x)+(p[i].y-p[o].y)*(p[i].y-p[o].y));//计算与狂距离最近的虫子
if(rr<ans)
{
ans=rr;
a=i;记录虫的序号
}
}
}
if(a==-1) continue;
p[o].x=p[a].x,p[o].y=p[a].y;狂到最近虫的坐标
for(int i=0;i<=o;i++)
{
long long rr=abs((p[i].x-p[o].x)*(p[i].x-p[o].x)+(p[i].y-p[o].y)*(p[i].y-p[o].y));
if(p[i].type==1&&p[i].h>0&&rr<=p[o].r*p[o].r)
{
p[i].h-=3*p[o].atk;
if(p[i].h>0)
p[o].liu=2;//当虫子没有被杀死的时候,liu==2狂离开
else
p[i].h=0;//当虫子被杀的时候h==0;
}
}
}
}
for(int i=0;i<=o;i++)
{
if(p[i].type==1)
{
if(p[i].h>0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else
{
if(p[i].liu==2) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
return 0;
}