样例过了,0pts求调
查看原帖
样例过了,0pts求调
1125685
Frielen楼主2025/1/22 16:14
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define y1 Y1
const int N=23333;
int spmp[N+1][3];//特殊能量值每回合增益 
int spatk[N+1][3];//特殊攻击力每回合增益
int spdef[N+1][3];//特殊防御力每回合增益
int respmp[N+1][3];
int respatk[N+1][3];
int respdef[N+1][3];
int n,Round,endtime[2];
struct chara{
	int hp,mp,atk,def,nowhp,nowmp;//见题意 
	int delatk,deldef;//攻击增益,防御增益  
	int prio[19];//优先级 
	int tf,x1,y1;//天赋,参数 
	int jn,x2,y2,z2;//技能,参数 
	bool from,isdied;//阵营,0=Alice,1=Bob,是否死亡 
	int nowfight;//现在打第几个人 
}name[19][2];//name[i][0]=Alice,else=Bob
int numA(chara id){//题中的A 
	return max(1ll,id.atk+id.delatk);
}
int numD(chara id){//题中的D 
	return max(0ll,id.def+id.deldef);
}
bool theend(int p){
	for(int i=1;i<=n;i++) if(!name[i][p].isdied) return 0;
	return 1;
}
int checkend(){//有没有结束 
	if(theend(0)) return 0;
	if(theend(1)) return 1;
	return -1;
}
void print(){
	cout<<Round<<'\n';
	int loser=checkend();
	if(loser==1) cout<<"Alice\n";
	else cout<<"Bob\n";
	loser=1-loser;
	for(int j=1;j<=n;j++) cout<<(name[j][loser].isdied?0:name[j][loser].nowhp)<<' ';
}
void newprio(chara &id){//更新攻击目标 
	for(int i=1;i<=n;i++){
		if(!name[id.prio[i]][1-id.from].isdied){
			id.nowfight=i;
			return;
		}
	}
	print();
}
void checkdie(chara &id){//吃伤害后死不死 
	if(id.nowhp<=0) id.isdied=1,id.nowhp=0;
}
int realhurt(chara &id,int x,int y){//算伤害 
	if(id.tf==1) y-=y/2;
	return max(x-numD(id),0ll)+y;
}
void gethurt(chara &id,int x,int y){//吃伤害 
	id.nowmp=min(id.nowmp+1,id.mp);
	id.nowhp-=realhurt(id,x,y);
	checkdie(id);
	if(checkend()!=-1){
			print();
			exit(0);
		}
}
void usejn(chara &id){//用技能 
	for(int i=1;i<=n;i++) if(!name[i][id.from].isdied) newprio(name[i][id.from]);
	int fro=id.from,to=1-id.from;
	int jn=id.jn,x1=id.x1,y1=id.y1;
	if(jn==0) return;//技能:心态崩了! 
	else if(jn==1){//技能:格林炸裂!
		for(int i=1;i<=n;i++) if(!name[i][to].isdied) gethurt(name[i][to],id.x2,0),name[i][to].nowmp=max(name[i][to].nowmp-name[i][to].nowmp/10,0ll);
	}
	else if(jn==2){//技能:日昇之雨!
		for(int i=1;i<=n;i++) if(!name[i][to].isdied) gethurt(name[i][to],0,numA(id));
	}
	else if(jn==3){//技能:天楼霸断剑!
		for(int i=1;i<=n;i++) if(!name[i][to].isdied) gethurt(name[i][to],min(name[i][to].hp/10,id.x2*numA(id)),0);
	}
	else if(jn==4){//技能:演出开始!
		for(int i=Round;i<=min(Round+id.x2-1,N);i++) spmp[i][fro]+=id.y2;
	}
	else if(jn==5){//技能:天狼噬斩!
		name[id.prio[id.nowfight]][to].deldef-=id.x2;
		gethurt(name[id.prio[id.nowfight]][to],0,numA(id));
	}
	else if(jn==6){//技能:地球蓝色闪电!
		gethurt(name[id.prio[id.nowfight]][to],0,numA(id));
		for(int i=Round;i<=min(Round+id.x2-1,N);i++) spatk[i][to]-=id.y2;
	}
	else if(jn==7){//技能:极光绽放!
		int mx=1e15,mxid=0;
		for(int i=1;i<=n;i++) if(mx>name[i][fro].nowhp&&!name[i][fro].isdied) mx=name[i][fro].nowhp,mxid=i;
		name[mxid][fro].nowhp=min(name[mxid][fro].hp,name[mxid][fro].nowhp+id.z2);
		for(int i=Round;i<=min(Round+id.x2-1,N);i++) spatk[i][fro]+=id.y2;
	}
	else if(jn==8){//技能:流星!
		for(int i=1;i<=n;i++) gethurt(name[i][to],numA(id),0);
		for(int i=Round;i<=min(Round+id.x2-1,N);i++) spdef[i][to]-=id.y2;
	}
	else if(jn==9){//技能:精灵庇护!
		for(int i=1;i<=n;i++) if(!name[i][fro].isdied) name[i][fro].nowhp=min(name[i][fro].hp,name[i][fro].nowhp+id.z2);
		for(int i=Round;i<=min(Round+id.x2-1,N);i++) spdef[i][fro]+=id.y2;
	}
	else{//技能:全力超全开!轮回之终末! 
		for(int i=1;i<=n;i++) for(int k=0;k<=1;k++) if(name[i][k].jn==10) name[i][k].jn=0;
		endtime[id.from]=Round+id.x2-1;
		for(int i=1;i<=n;i++){
			if(name[i][fro].isdied) continue;
			name[i][fro].atk*=2,name[i][fro].def*=2;
			name[i][fro].nowhp=max(name[i][fro].hp/2,name[i][fro].nowhp);
			name[i][fro].nowmp=max(name[i][fro].mp/2,name[i][fro].nowmp);
		}
		for(int i=Round;i<=min(Round+id.x2-1,N);i++) spmp[i][fro]++;
	}
	for(int i=1;i<=n;i++) if(!name[i][id.from].isdied) newprio(name[i][id.from]);
	return;
}
void init(int p){
	for(int i=1;i<=n;i++){
		name[i][p].from=p,name[i][p].nowfight=1;
		cin>>name[i][p].hp>>name[i][p].mp>>name[i][p].atk>>name[i][p].def;
		name[i][p].nowhp=name[i][p].hp;
		for(int j=1;j<=n;j++) cin>>name[i][p].prio[j];
		cin>>name[i][p].tf>>name[i][p].x1>>name[i][p].y1;
		cin>>name[i][p].jn>>name[i][p].x2>>name[i][p].y2>>name[i][p].z2;
	}
}
int normalhurt(chara &id){//平A伤害 
	if(id.tf==4) return realhurt(name[id.prio[id.nowfight]][1-id.from],0,numA(id));
	if(id.tf==2) return realhurt(name[id.prio[id.nowfight]][1-id.from],numA(id),id.x1);
	return realhurt(name[id.prio[id.nowfight]][1-id.from],numA(id),0);
}
void gethurt3(chara &id,int num){
	id.nowmp=min(id.nowmp+1,id.mp);
	id.nowhp-=num;
	checkdie(id);
}
void gethurt2(chara &id){//吃伤害 
	if(id.tf==4) gethurt3(name[id.prio[id.nowfight]][1-id.from],realhurt(name[id.prio[id.nowfight]][1-id.from],0,numA(id)));
	else if(id.tf==2) gethurt3(name[id.prio[id.nowfight]][1-id.from],realhurt(name[id.prio[id.nowfight]][1-id.from],id.x1,numA(id)));
	else gethurt3(name[id.prio[id.nowfight]][1-id.from],realhurt(name[id.prio[id.nowfight]][1-id.from],numA(id),0));
	if(checkend()!=-1){
		print();
		exit(0);
	}
}
void work(int p){
	for(int i=1;i<=n;i++)
		if(!name[i][p].isdied)
			newprio(name[i][p]);
	int attack=0;
	name[0][p].jn=-1;
	for(int i=n;i>=1;i--){
		if(name[i][p].nowmp==name[i][p].mp&&!name[i][p].isdied){
			if(name[i][p].jn>name[attack][p].jn) attack=i;
		}
	}
	if(attack){
		name[attack][p].nowmp=0;
		usejn(name[attack][p]);
		name[attack][p].nowmp=min(name[attack][p].nowmp+1,name[attack][p].mp);
		if(name[attack][p].tf==5) name[attack][p].nowmp=min(name[attack][p].nowmp+name[attack][p].y1,name[attack][p].mp);
		for(int i=1;i<=n;i++){
			for(int k=0;k<=1;k++){
				if(!name[i][k].isdied){
					name[i][k].delatk-=respatk[Round][k];
					name[i][k].deldef-=respdef[Round][k];
				}
			}
		}
		for(int k=0;k<=1;k++) respatk[Round][k]=spatk[Round][k],respdef[Round][k]=spdef[Round][k];
		for(int i=1;i<=n;i++){
			for(int k=0;k<=1;k++){
				if(!name[i][k].isdied){
					name[i][k].delatk+=spatk[Round][k];
					name[i][k].deldef+=spdef[Round][k];
				}
			}
		}
	}
	if(!attack){
		int att=n;
		for(int i=n-1;i>=1;i--){
			if(name[i][p].isdied) continue;
			if(name[name[i][p].prio[name[i][p].nowfight]][1-p].nowhp>name[name[att][p].prio[name[att][p].nowfight]][1-p].nowhp) att=i;
			if(name[name[i][p].prio[name[i][p].nowfight]][1-p].nowhp==name[name[att][p].prio[name[att][p].nowfight]][1-p].nowhp){
				int num1=normalhurt(name[i][p]),num2=normalhurt(name[att][p]);
				if(num1>num2) att=i;
			}
		}
		gethurt2(name[att][p]);
		name[att][p].nowmp=min(name[att][p].nowmp+1,name[att][p].mp);
		if(name[att][p].tf==5) name[att][p].nowhp=min(name[att][p].nowhp+name[att][p].x1,name[att][p].hp);
	}
	for(int i=1;i<=n;i++){
		if(!name[i][p].isdied){
			name[i][p].nowmp=min(name[i][p].mp,name[i][p].nowmp+1);
			if(name[i][p].tf==3){
				name[i][p].nowhp=min(name[i][p].nowhp+name[i][p].x1,name[i][p].hp);
				name[i][p].nowmp=min(name[i][p].nowmp+name[i][p].y1,name[i][p].mp);
			}
			name[i][p].nowmp=min(name[i][p].nowmp+spmp[Round][p],name[i][p].mp);
		}
	}
}
void solve(){
	for(int k=0;k<=1;k++) respatk[Round][k]=spatk[Round][k],respdef[Round][k]=spdef[Round][k];
	for(int i=1;i<=n;i++)
		for(int k=0;k<=1;k++)
			if(!name[i][k].isdied)
				name[i][k].delatk+=respatk[Round][k],name[i][k].deldef+=respdef[Round][k];
	work(0);
	work(1);
	for(int i=1;i<=n;i++){
		for(int k=0;k<=1;k++){
			if(!name[i][k].isdied){
				name[i][k].delatk-=respatk[Round][k];
				name[i][k].deldef-=respdef[Round][k];
			}
		}
	}
	if(Round==endtime[0]){
		for(int i=1;i<=n;i++) name[i][0].isdied=1;
		return;
	}
	if(Round==endtime[1]){
		for(int i=1;i<=n;i++) name[i][1].isdied=1;
		return;
	}
}
signed main(){
//	freopen("P7610_1.in","r",stdin);
	cin>>n;
	init(0);
	init(1);
	while(Round<=N){
		Round++;
		solve();
		if(checkend()!=-1){
			print();
			return 0;
		}
	}
	cout<<"^w^";
	return 0;
}
2025/1/22 16:14
加载中...