hack:
3 6 1 4 3
3 4
16
out:
The game is going on
5
9 2 4 3 6
7 2 4 1 6
4 2 4 0 4
2 2 4 0 2
1 2 4 0 1
code:
#include<bits/stdc++.h>
#define maxn 10
#define maxt 200005
#define maxs 23
#define maxd 10005
#define maxr 17
#define int long long
using namespace std;
int n,m,s,d,r,T,alive_antcnt,all_antcnt,level=0;
inline int ksm(double d,int z){
double res=1.00;
while(z){
if(z&1)res=res*d;
d=d*d;z>>=1;
}
return res;
}
inline int level_hp(int lv){
int hp=4*ksm(1.1,lv);
return hp;
}
int informatics[maxn][maxn];
bool havetower[maxn][maxn];
bool haveant[maxn][maxn];
bool havecake[maxn][maxn];
struct node{int x,y;};
int bossAnt;
struct Ant{int age,hp,maxHP,id,level;bool havecake;node lastplace,nowplace;}ant[10],AnsAnt[maxt];
struct SuperTower{node place;}tower[maxs];
inline void KillAnt(int aliveid){
AnsAnt[ant[aliveid].id]=ant[aliveid];
if(ant[aliveid].havecake){
havecake[n][m]=true;
ant[aliveid].havecake=false;
bossAnt=0;
}
haveant[ant[aliveid].nowplace.x][ant[aliveid].nowplace.y]=false;
for(int i=aliveid;i<alive_antcnt;++i)ant[i]=ant[i+1];
--alive_antcnt;return;
}
inline void newant(){
++all_antcnt;
++alive_antcnt;
if(all_antcnt%6==1)++level;
ant[alive_antcnt].level=level;
ant[alive_antcnt].age=0;
ant[alive_antcnt].havecake=false;
ant[alive_antcnt].hp=level_hp(level);
ant[alive_antcnt].id=all_antcnt;
ant[alive_antcnt].lastplace={-10,-10};
ant[alive_antcnt].maxHP=level_hp(level);
ant[alive_antcnt].nowplace={0,0};
haveant[0][0]=true;
return;
}
int addtime;
int target[maxs];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int atk[maxn][maxn];
bool cmp(Ant a,Ant b){return a.id<b.id;}
inline int pf(int x){return x*x;}
inline double Pf(double x){return x*x;}
int GameOver=0;
inline double dis(double x1,double y1,double x2,double y2){return sqrt(Pf(x1-x2)+Pf(y1-y2));}
inline void debug(int ttf){
cerr<<"It is the "<<ttf<<" second of the game\n";
cerr<<"The alive ant count is "<<alive_antcnt<<"\n";
for(int i=1;i<=alive_antcnt;++i){
cerr<<"The "<<i<<"th ant's age is "<<ant[i].age<<"\n";
cerr<<"The "<<i<<"th ant's level is "<<ant[i].level<<"\n";
cerr<<"The "<<i<<"th ant's hp is "<<ant[i].hp<<"\n";
cerr<<"The "<<i<<"th ant's place is ("<<ant[i].nowplace.x<<","<<ant[i].nowplace.y<<")\n";
}
for(int i=1;i<=s;++i){
cerr<<"The "<<i<<"th tower's place is ("<<tower[i].place.x<<","<<tower[i].place.y<<")\n";
cerr<<"The "<<i<<"th tower's target is "<<target[i]<<"\n";
// cerr<<"dis is "<<Pf(dis(tower[i].place.x,tower[i].place.y,ant[target[i]].nowplace.x,ant[target[i]].nowplace.y))<<"\n";
}
cerr<<"The BossAnt is "<<bossAnt<<"\n";
cerr<<"attacking condition:\n";
for(int i=0;i<=n;++i){
for(int j=0;j<=m;++j){
cerr<<atk[i][j]<<" ";
}
cerr<<"\n";
}
cerr<<"\n\n\n";
return;
}
signed main(){
// freopen("designant.in","r",stdin);
// freopen("designant.out","w",stdout);
cin>>n>>m>>s>>d>>r;
for(int i=1;i<=s;++i){cin>>tower[i].place.x>>tower[i].place.y;havetower[tower[i].place.x][tower[i].place.y]=true;}
cin>>T;havecake[n][m]=true;
for(int i=0;i<=m+1;++i)haveant[n+1][i]=true;
for(int i=0;i<=n+1;++i)haveant[i][m+1]=true;
for(int nowtime=1;nowtime<=T;++nowtime){
sort(ant+1,ant+alive_antcnt+1,cmp);
if(alive_antcnt<6&&!haveant[0][0])newant();
for(int i=1;i<=alive_antcnt;++i){
if(ant[i].havecake)informatics[ant[i].nowplace.x][ant[i].nowplace.y]+=5;
else informatics[ant[i].nowplace.x][ant[i].nowplace.y]+=2;
}
for(int i=1;i<=alive_antcnt;++i){
int x=ant[i].nowplace.x,y=ant[i].nowplace.y;bool chosen=false;
int choise[10]={0},cnt=0;
for(int dir=0;dir<4;++dir){
if(x+dx[dir]<0||x+dx[dir]>n||y+dy[dir]<0||y+dy[dir]>m)continue;
if(haveant[x+dx[dir]][y+dy[dir]])continue;
if(havetower[x+dx[dir]][y+dy[dir]])continue;
if(x+dx[dir]==ant[i].lastplace.x&&y+dy[dir]==ant[i].lastplace.y)continue;
chosen=true;choise[++cnt]=dir;
}
if(!chosen){
ant[i].lastplace=ant[i].nowplace;
continue;
}
int finaldir=0,informaticsmax=-1;
for(int j=1;j<=cnt;++j){
int dir=choise[j];
if(informatics[x+dx[dir]][y+dy[dir]]>informaticsmax){
informaticsmax=informatics[x+dx[dir]][y+dy[dir]];
finaldir=dir;
}
}
if(ant[i].age%5==4){
finaldir--;
if(finaldir==-1)finaldir=3;//informatics[x+dx[finaldir]][y+dy[finaldir]]!=informaticsmax||
while((x+dx[finaldir]==ant[i].lastplace.x&&y+dy[finaldir]==ant[i].lastplace.y)||x+dx[finaldir]<0||x+dx[finaldir]>n||y+dy[finaldir]<0||y+dy[finaldir]>m||haveant[x+dx[finaldir]][y+dy[finaldir]]||havetower[x+dx[finaldir]][y+dy[finaldir]]){
finaldir--;
if(finaldir==-1)finaldir=3;
}
}
ant[i].lastplace={x,y};
ant[i].nowplace={x+dx[finaldir],y+dy[finaldir]};
haveant[ant[i].lastplace.x][ant[i].lastplace.y]=false;
haveant[ant[i].nowplace.x][ant[i].nowplace.y]=true;
if(havecake[ant[i].nowplace.x][ant[i].nowplace.y]){
ant[i].havecake=true;
havecake[ant[i].nowplace.x][ant[i].nowplace.y]=false;
bossAnt=i;
ant[i].hp+=ant[i].maxHP/2;
if(ant[i].hp>ant[i].maxHP)ant[i].hp=ant[i].maxHP;
}
}
// for(int j=1;j<=alive_antcnt;++j){
// cerr<<ant[j].nowplace.x<<" "<<ant[j].nowplace.y<<"\n";
// }
for(int i=1;i<=s;++i)target[i]=0;
for(int i=1;i<=s;++i){
int x=tower[i].place.x,y=tower[i].place.y;
int mindis=1e9;
for(int j=1;j<=alive_antcnt;++j){
int dis=pf(ant[j].nowplace.x-x)+pf(ant[j].nowplace.y-y);
if(dis>r*r)continue;
if(dis<mindis){
mindis=dis;
target[i]=j;
}
else if(dis==mindis&&ant[target[i]].age<ant[j].age)target[i]=j;
}
if(bossAnt)
if(pf(ant[bossAnt].nowplace.x-x)+pf(ant[bossAnt].nowplace.y-y)<=r*r)target[i]=bossAnt;
}
for(int i=0;i<=n;++i)
for(int j=0;j<=m;++j)
atk[i][j]=0;
for(int i=1;i<=s;++i){
if(target[i]==0)continue;
int x=tower[i].place.x,y=tower[i].place.y;
if(ant[target[i]].nowplace.y==y){
// cerr<<"ChenZiShu\n";
if(ant[target[i]].nowplace.x<x)
for(int j=ant[target[i]].nowplace.x;j<x;++j)atk[j][y]+=d;
else
for(int j=x+1;j<=ant[target[i]].nowplace.x;++j)atk[j][y]+=d;
continue;
}
if(ant[target[i]].nowplace.x==x){
if(ant[target[i]].nowplace.y<y)
for(int j=ant[target[i]].nowplace.y;j<y;++j)atk[x][j]+=d;
else
for(int j=y+1;j<=ant[target[i]].nowplace.y;++j)atk[x][j]+=d;
continue;
}
double k=0,b=0;
k=(double)(ant[target[i]].nowplace.y-y)*1.00/(ant[target[i]].nowplace.x-x);
b=(double)y-k*x;
for(int j=1;j<=alive_antcnt;++j){
double A=ant[j].nowplace.x;
double B=ant[j].nowplace.y;
double R=0.5;
double delta=Pf(2*k*b-2*A-2*k*B)-4*(1+k*k)*(A*A-2*B*b+B*B+b*b-R*R);
if(delta<0)continue;
double pt2=sqrt(delta);
double pt1=(-2*k*b+2*A+2*B*k);
double pt3=2*(1+k*k);
double x1=(pt1+pt2)/pt3;
double x2=(pt1-pt2)/pt3;
double L=min(ant[target[i]].nowplace.x*1.00,x*1.00),Rr=max(ant[target[i]].nowplace.x*1.00,x*1.00);
if((L<=x1&&x1<=Rr)||(L<=x2&&x2<=Rr))
atk[ant[j].nowplace.x][ant[j].nowplace.y]+=d;
}
}
for(int i=1;i<=alive_antcnt;++i)
ant[i].hp-=atk[ant[i].nowplace.x][ant[i].nowplace.y];
for(int i=1;i<=alive_antcnt;++i)if(ant[i].hp<0)KillAnt(i);
for(int i=1;i<=alive_antcnt;++i){
if(ant[i].havecake&&ant[i].nowplace.x==0&&ant[i].nowplace.y==0){
GameOver=nowtime;
break;
}
}
if(GameOver)break;
for(int i=1;i<=alive_antcnt;++i)ant[i].age++;
// addtime++;
// for(int i=0;i<=n;++i){
// for(int j=0;j<=m;++j){
// informatics[i][j]--;
// if(informatics[i][j]<0)informatics[i][j]=0;
// }
// }
// debug(nowtime);
}
if(GameOver)cout<<"Game over after "<<GameOver<<" seconds\n";
else cout<<"The game is going on\n";
for(int i=1;i<=alive_antcnt;++i)if(ant[i].hp<0)KillAnt(i);
cout<<alive_antcnt<<"\n";
sort(ant+1,ant+alive_antcnt+1,cmp);
for(int i=1;i<=alive_antcnt;++i)
cout<<ant[i].age<<" "<<ant[i].level<<" "<<ant[i].hp<<" "<<ant[i].nowplace.x<<" "<<ant[i].nowplace.y<<" \n";
return 0;
}