0分求调
查看原帖
0分求调
935289
liuyinglp楼主2025/7/3 18:43
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
struct character{
	int maxhp,hp;
	int maxmp,mp;
	int atk,upatk;
	int def,updef;
	int tf,x,y;
	int sk,a,b,c;
	int dead;
	int p[15];
}alice[15],bob[15];
struct upper{
	int mp,atk,def;
}alice_upper[24005],bob_upper[24005];
struct last_skill{
	int st,en;
}al,bo;
bool stal,stbo;
int n,lial,libo,now;
string winner;
bool fin;
int A(int k,int ty){
	if(ty==1)return max(alice[k].atk+alice[k].upatk+alice_upper[now].atk,1);
	return max(bob[k].atk+bob[k].upatk+bob_upper[now].atk,1);
}
int D(int k,int ty){
	if(ty==1)return max(alice[k].def+alice[k].updef+alice_upper[now].def,0);
	return max(bob[k].def+bob[k].updef+bob_upper[now].def,0);
}
void hurt(int kind,int per,int x,int y){
	if(kind==1){
		if(alice[per].dead)return;
		alice[per].mp=min(alice[per].maxmp,alice[per].mp+1);
		if(alice[per].tf!=1)alice[per].hp-=max(x-D(per,1),0)+y;
		else alice[per].hp-=max(x-D(per,1),0)+y-ceil(y/2);
		if(alice[per].hp<=0)alice[per].hp=0,alice[per].dead=1,lial--;
		if(!lial)fin=1;
		return;
	}
	if(bob[per].dead)return;
	bob[per].mp=min(bob[per].maxmp,bob[per].mp+1);
	if(bob[per].tf!=1)bob[per].hp-=max(x-D(per,2),0)+y;
	else bob[per].hp-=max(x-D(per,2),0)+y-ceil(y/2);
	if(bob[per].hp<=0)bob[per].hp=0,bob[per].dead=1,libo--;
	if(!libo)fin=1;
	return;
}
int jshurt_pa(int kind,int x,int y){
	if(kind==1){
		int com=A(x,kind),rea=0;
		if(alice[x].tf==2)com=A(x,kind),rea=alice[x].x;
		if(alice[x].tf==4)com=0,rea=A(x,kind);
		if(bob[y].tf!=1)return max(com-D(y,2),0)+rea;
		else return max(com-D(y,2),0)+rea-ceil(rea/2);
	}
	int com=A(x,kind),rea=0;
	if(bob[x].tf==2)com=A(x,kind),rea=bob[x].x;
	if(bob[x].tf==4)com=0,rea=A(x,kind);
	if(alice[y].tf!=1)return max(com-D(y,1),0)+rea;
	else return max(com-D(y,1),0)+rea-ceil(rea/2);
}
int is(int kind,int x,int y,int to1,int to2){
	int a=jshurt_pa(kind,x,to1),b=jshurt_pa(kind,y,to2);
	if(a<b)return 1;
	if(a>b)return 2;
	return 3; 
}
void sk(int kind,int x){
	if(kind==1){
		int p=alice[x].sk,a=alice[x].a,b=alice[x].b,c=alice[x].c;
		if(p==0)return;
		if(p==1){
			for(int i=1;i<=n;i++){
				hurt(kind%2+1,i,a,0);
				bob[i].mp-=ceil(bob[i].mp/10);
			}
			return;
		}
		if(p==2){
			for(int i=1;i<=n;i++)
				hurt(kind%2+1,i,0,A(x,kind));
			return;
		}
		if(p==3){
			for(int i=1;i<=n;i++)
				hurt(kind%2+1,i,min(bob[i].maxhp/10,a*A(x,kind)),0);
			return;
		}
		if(p==4){
			for(int i=now;i<=now+a-1;i++)
				alice_upper[i].mp+=b;
			return;
		}
		if(p==5){
			for(int i=1;i<=n;i++)
				if(!bob[alice[x].p[i]].dead){
					bob[alice[x].p[i]].updef-=a;
					hurt(kind%2+1,alice[x].p[i],0,A(x,kind));
					return;
				}
			return;
		}
		if(p==6){
			for(int i=1;i<=n;i++)
				hurt(kind%2+1,i,0,A(x,kind));
			for(int i=now;i<=now+a-1;i++)
				bob_upper[i].atk-=b;
			return;
		}
		if(p==7){
			int minn=1e9,who=0;
			for(int i=1;i<=n;i++)
				if(!alice[i].dead&&(minn>alice[i].hp||(minn==alice[i].hp&&who>i))){
					minn=alice[i].hp;
					who=i;
				}
			alice[who].hp+=c;
			for(int i=now;i<=now+a-1;i++)
				alice_upper[i].atk+=b;
			return;
		}
		if(p==8){
			for(int i=1;i<=n;i++)
				hurt(kind%2+1,i,A(x,kind),0);
			for(int i=now;i<=now+a-1;i++)
				bob_upper[i].def-=b;
			return;
		}
		if(p==9){
			for(int i=1;i<=n;i++)
				if(!alice[i].dead)alice[i].hp+=c;
			for(int i=now;i<=now+a-1;i++)
				alice_upper[i].def+=b;
			return;
		}
		if(p==10){
			for(int i=1;i<=n;i++){
				if(alice[i].dead)continue;
				if(alice[i].sk==10)alice[i].sk=0;
				alice[i].atk*=2;
				alice[i].def*=2;
				alice[i].hp=max(alice[i].hp,alice[i].maxhp/2);
				alice[i].mp=max(alice[i].mp,alice[i].maxmp/2);
			}
			for(int i=1;i<=n;i++)
				if(!bob[i].dead&&bob[i].sk==10)bob[i].sk=0;
			for(int i=now;i<=now+a-1;i++)
				alice_upper[i].mp++;
			stal=1;
			al.st=now;
			al.en=now+a-1;
			return;
		}
	}
	if(kind==2){
		int p=bob[x].sk,a=bob[x].a,b=bob[x].b,c=bob[x].c;
		if(p==0)return;
		if(p==1){
			for(int i=1;i<=n;i++){
				hurt(kind%2+1,i,a,0);
				alice[i].mp-=ceil(alice[i].mp/10);
			}
			return;
		}
		if(p==2){
			for(int i=1;i<=n;i++)
				hurt(kind%2+1,i,0,A(x,kind));
			return;
		}
		if(p==3){
			for(int i=1;i<=n;i++)
				hurt(kind%2+1,i,min(alice[i].maxhp/10,a*A(x,kind)),0);
			return;
		}
		if(p==4){
			for(int i=now;i<=now+a-1;i++)
				bob_upper[i].mp+=b;
			return;
		}
		if(p==5){
			for(int i=1;i<=n;i++)
				if(!alice[bob[x].p[i]].dead){
					alice[bob[x].p[i]].updef-=a;
					hurt(kind%2+1,bob[x].p[i],0,A(x,kind));
					return;
				}
			return;
		}
		if(p==6){
			for(int i=1;i<=n;i++)
				hurt(kind%2+1,i,0,A(x,kind));
			for(int i=now;i<=now+a-1;i++)
				alice_upper[i].atk-=b;
			return;
		}
		if(p==7){
			int minn=1e9,who=0;
			for(int i=1;i<=n;i++)
				if(!bob[i].dead&&(minn>bob[i].hp||(minn==bob[i].hp&&who>i))){
					minn=bob[i].hp;
					who=i;
				}
			bob[who].hp+=c;
			for(int i=now;i<=now+a-1;i++)
				bob_upper[i].atk+=b;
			return;
		}
		if(p==8){
			for(int i=1;i<=n;i++)
				hurt(kind%2+1,i,A(x,kind),0);
			for(int i=now;i<=now+a-1;i++)
				alice_upper[i].def-=b;
			return;
		}
		if(p==9){
			for(int i=1;i<=n;i++)
				if(!bob[i].dead)bob[i].hp+=c;
			for(int i=now;i<=now+a-1;i++)
				bob_upper[i].def+=b;
			return;
		}
		if(p==10){
			for(int i=1;i<=n;i++){
				if(bob[i].dead)continue;
				if(bob[i].sk==10)bob[i].sk=0;
				bob[i].atk*=2;
				bob[i].def*=2;
				bob[i].hp=max(bob[i].hp,bob[i].maxhp/2);
				bob[i].mp=max(bob[i].mp,bob[i].maxmp/2);
			}
			for(int i=now;i<=now+a-1;i++)
				bob_upper[i].mp++;
			for(int i=1;i<=n;i++)
				if(!alice[i].dead&&alice[i].sk==10)alice[i].sk=0;
			stbo=1;
			bo.st=now;
			bo.en=now+a-1;
			return;
		}
	}
}
int op=0;
void game(){
	while(!fin){
		now++;
//		cout<<now<<endl;
		int maxn=-1,who=0,maxlife=0,shei=0,to=0;
		for(int i=1;i<=n;i++)
			if(!alice[i].dead){
				if(alice[i].mp==alice[i].maxmp){
					if(maxn<alice[i].sk||(maxn==alice[i].sk&&who<i)){
						maxn=alice[i].sk;
						who=i;
					}
				}
				int maxx=0,wh=0;
				for(int j=1;j<=n&&!maxx;j++)
					if(!bob[alice[i].p[j]].dead)
						if(maxx<bob[alice[i].p[j]].hp)wh=alice[i].p[j],maxx=bob[alice[i].p[j]].hp;
				if(maxx>maxlife){
					maxlife=maxx;
					shei=i;
					to=wh;
				}else if(maxx==maxlife){
					int flag=is(1,shei,i,to,wh);
					if(flag==1)shei=i,to=wh;
					else if(flag==3){
						if(shei<i)to=wh,shei=i;
					}
				}
			}
		if(maxn!=-1){
			alice[who].mp=0;
			sk(1,who);
			alice[who].mp++;
			if(alice[who].tf==5&&!fin)alice[who].mp+=alice[who].y;
		}
		else{
			int com=A(shei,1),rea=0;
			if(alice[shei].tf==2)com=A(shei,1),rea=alice[shei].x;
			if(alice[shei].tf==4)com=0,rea=A(shei,1);
			hurt(2,to,com,rea);
			alice[shei].mp++;
			if(alice[shei].tf==5&&!fin)alice[shei].hp+=alice[shei].x;
		}
		for(int i=1;i<=n;i++){
			if(alice[i].dead)continue;
			alice[i].mp++;
			alice[i].mp+=alice_upper[now].mp;
			if(alice[i].tf==3){
				alice[i].hp+=alice[i].x;
				alice[i].mp+=alice[i].y;
			}
			alice[i].hp=min(alice[i].hp,alice[i].maxhp);
			alice[i].mp=min(alice[i].mp,alice[i].maxmp);
		}
//		cout<<who<<' '<<shei<<' '<<to<<endl;
		if(fin){
			winner="Alice";
			return;
		}
  		maxn=-1,who=0,maxlife=0,shei=0,to=0;
		for(int i=1;i<=n;i++)
			if(!bob[i].dead){
				if(bob[i].mp==bob[i].maxmp){
					if(maxn<bob[i].sk||(maxn==bob[i].sk&&who<i)){
						maxn=bob[i].sk;
						who=i;
					}
				}
				int maxx=0,wh=0;
				for(int j=1;j<=n;j++)
					if(!alice[bob[i].p[j]].dead&&!maxx){
						if(maxx<alice[bob[i].p[j]].hp)wh=bob[i].p[j],maxx=alice[bob[i].p[j]].hp;
					}
				if(maxx>maxlife){
					maxlife=maxx;
					shei=i;
					to=wh;
				}else if(maxx==maxlife){
					int flag=is(2,shei,i,to,wh);
					if(flag==1)shei=i,to=wh;
					else if(flag==3){
						if(shei<i)to=wh,shei=i;
					}
				}
			}
		if(maxn!=-1){
			bob[who].mp=0;
			sk(2,who);
			bob[who].mp++;
			if(bob[who].tf==5&&!fin)bob[who].mp+=bob[who].y;
		}
		else{
			int com=A(shei,2),rea=0;
			if(bob[shei].tf==2)com=A(shei,2),rea=bob[shei].x;
			if(bob[shei].tf==4)com=0,rea=A(shei,2);
			hurt(1,to,com,rea);
			bob[shei].mp++;
			if(bob[shei].tf==5&&!fin)bob[shei].hp+=bob[shei].x;
		}
//		cout<<who<<' '<<shei<<' '<<to<<endl;
		for(int i=1;i<=n;i++){
			if(bob[i].dead)continue;
			bob[i].mp++;
			bob[i].mp+=bob_upper[now].mp;
			if(bob[i].tf==3){
				bob[i].hp+=bob[i].x;
				bob[i].mp+=bob[i].y;
			}
			bob[i].hp=min(bob[i].hp,bob[i].maxhp);
			bob[i].mp=min(bob[i].mp,bob[i].maxmp);
		}
		if(fin){
			winner="Bob";
			return;
		}
//		cout<<stal<<' '<<stbo<<' '<<al.en<<' '<<bo.en<<' '<<jshurt_pa(2,3,1)<<endl;
//		cout<<"Alice:\n";
//		for(int i=1;i<=n;i++){
//			cout<<alice[i].hp<<' '<<alice[i].mp<<' '<<alice[i].atk<<' '<<alice[i].def<<' '<<alice[i].upatk<<' '<<alice[i].updef<<endl;
//		}
//		cout<<"Bob:\n";
//		for(int i=1;i<=n;i++){
//			cout<<bob[i].hp<<' '<<bob[i].mp<<' '<<bob[i].atk<<' '<<bob[i].def<<' '<<bob[i].upatk<<' '<<bob[i].updef<<endl;
//		}
		if(stal&&now==al.en){
			winner="Bob";
			return;
		}
		if(stbo&&now==bo.en){
			winner="Alice";
			return;
		}
		if(now>=23333){
			cout<<">_<";
			op=1;
			return;
		} 
	}
}
signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	cin>>n;
	lial=libo=n;
	for(int i=1;i<=n;i++){
		cin>>alice[i].maxhp>>alice[i].maxmp>>alice[i].atk>>alice[i].def;
		alice[i].hp=alice[i].maxhp;
		for(int j=1;j<=n;j++)
			cin>>alice[i].p[j];
		cin>>alice[i].tf>>alice[i].x>>alice[i].y;
		cin>>alice[i].sk>>alice[i].a>>alice[i].b>>alice[i].c;
	}
	for(int i=1;i<=n;i++){
		cin>>bob[i].maxhp>>bob[i].maxmp>>bob[i].atk>>bob[i].def;
		bob[i].hp=bob[i].maxhp;
		for(int j=1;j<=n;j++)
			cin>>bob[i].p[j];
		cin>>bob[i].tf>>bob[i].x>>bob[i].y;
		cin>>bob[i].sk>>bob[i].a>>bob[i].b>>bob[i].c;
	}
	game();
	if(op)return 0;
	cout<<now<<endl;
	cout<<winner<<endl;
	if(winner=="Alice"){
		for(int i=1;i<=n;i++)
			cout<<alice[i].hp<<' ';
		return 0;
	}
	for(int i=1;i<=n;i++)
		cout<<bob[i].hp<<' ';
	return 0;
}
2025/7/3 18:43
加载中...