1pts求助,悬棺
查看原帖
1pts求助,悬棺
813724
Cute__yhb楼主2024/7/23 22:02

样例AC

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define re register
#define ri register int
#define rll register long long
#define ld long double
#define endl '\n'
#define fi first
#define se second
#define pii pair<int,int>
#define p_q priority_queue
#define iter iterator
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define nep(i,a,b) for(int i=(a);i>=(b);i--)
#define popcount __builtin_popcount
#define pb push_back
#define mem(a,x) memset((a),x,sizeof(a))
#define eps 1e-8
#define oper operator
#define mk make_pair
struct tianfu{
	int f,x,y;
};
struct jineng{
	int f,x,y,z;
};
struct player{
	int HP,hp,MP,mp,atk,ATK,def,DEF,A,D,f;
	tianfu x;
	jineng y;
}a[15][3];
struct order{
	int p[15];
}p[15][3];
int n;
bool f[50005][3];
int f4[50005][3];
int atk[50005][3],def[50005][3];
void bug(){
	for(int i=1;i<=n;i++) cout<<a[i][1].hp<<' '<<a[i][2].hp<<endl;
	for(int i=1;i<=n;i++) cout<<a[i][1].mp<<' '<<a[i][2].mp<<endl;
}
void print1(int x){
	cout<<x<<endl;
	cout<<"Alice\n";
	for(int i=1;i<=n;i++){
		if(a[i][1].f){
			cout<<a[i][1].hp<<" ";
		}else cout<<"0 ";
	}
	exit(0);
}
void print2(int x){
	cout<<x<<endl;
	cout<<"Bob\n";
	for(int i=1;i<=n;i++){
		if(a[i][2].f){
			cout<<a[i][2].hp<<" ";
		}else cout<<"0 ";
	}
	exit(0);
}
void check(int x){
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(a[i][1].f){
			cnt=1;
			break;
		}
	}
	if(!cnt) print2(x);
	cnt=0;
	for(int i=1;i<=n;i++){
		if(a[i][2].f){
			cnt=1;
			break;
		}
	}
	if(!cnt) print1(x);
}
int at1(int x,int y,int z){// x is player,z is really
	if(a[x][2].x.f==1){
		return max(y-a[x][2].D,0)+z-z/2;
	}else{
		return max(y-a[x][2].D,0)+z;
	}
}
int at2(int x,int y,int z){// x is player,z is really
	if(a[x][1].x.f==1){
		return max(y-a[x][1].D,0)+z-z/2;
	}else{
		return max(y-a[x][1].D,0)+z;
	}
}
void att1(int x,int y,int z){// x is player,z is really
	if(a[x][2].f==0) return ;
	a[x][2].mp++;
	if(a[x][2].mp>a[x][2].MP) a[x][2].mp=a[x][2].MP;
	if(a[x][2].x.f==1){
		a[x][2].hp-=max(y-a[x][2].D,0)+z-z/2;
	}else{
		a[x][2].hp-=max(y-a[x][2].D,0)+z;
	}
	if(a[x][2].hp<=0){
		a[x][2].f=0;
		a[x][2].hp=0;
	}
}
void att2(int x,int y,int z){// x is player,z is really
	if(a[x][1].f==0) return ;
	a[x][1].mp++;
	if(a[x][1].mp>a[x][1].MP) a[x][1].mp=a[x][1].MP;
	if(a[x][1].x.f==1){
		a[x][1].hp-=max(y-a[x][1].D,0)+z-z/2;
	}else{
		a[x][1].hp-=max(y-a[x][1].D,0)+z;
	}
	if(a[x][1].hp<=0){
		a[x][1].f=0;
		a[x][1].hp=0;
	}
}
void update(int x){
	for(int i=1;i<=n;i++){
		a[i][1].A=max(a[i][1].ATK+a[i][1].atk+atk[x][1],1);
		a[i][1].D=max(a[i][1].DEF+a[i][1].def+def[x][1],0);
		a[i][2].A=max(a[i][2].ATK+a[i][2].atk+atk[x][2],1);
		a[i][2].D=max(a[i][2].DEF+a[i][2].def+def[x][2],0);
	}
} 
void Alice(int xx){
	int x=0;
	for(int i=1;i<=n;i++){
		if(a[i][1].f==0) continue;
		if(a[i][1].mp==a[i][1].MP){
			if(a[i][1].y.f>a[x][1].y.f){
				x=i;
			}else if(a[i][1].y.f==a[x][1].y.f){
				if(i>x) x=i;
			}
		}
	}
	update(xx);
	if(!x){
		int y=0,at=0;
		for(int i=1;i<=n;i++){
			if(a[i][1].f==0) continue;
			for(int j=1;j<=n;j++){
				if(a[p[i][1].p[j]][2].f){
					int Y=p[i][1].p[j];
					if(a[Y][2].hp>a[y][2].hp){
						x=i;
						y=Y;
						if(a[i][1].x.f==2){
							at=at1(Y,a[i][1].A,a[i][1].x.x);
						}else if(a[i][1].x.f==4){
							at=at1(Y,0,a[i][1].A);
						}else{
							at=at1(Y,a[i][1].A,0);
						}
					}else if(a[Y][2].hp==a[y][2].hp){
						int att;
						if(a[i][1].x.f==2){
							att=at1(Y,a[i][1].A,a[i][1].x.x);
						}else if(a[i][1].x.f==4){
							att=at1(Y,0,a[i][1].A);
						}else{
							att=at1(Y,a[i][1].A,0);
						}
						if(att>at){
							x=i;
							y=Y;
							at=att;
						}else if(att==at){
							if(i>x){
								x=i;
								y=Y;
							}
						}
					}
					break;
				}
			}
		}
		if(a[x][1].x.f==2){
			att1(y,a[x][1].A,a[x][1].x.x);
		}else if(a[x][1].x.f==4){
			att1(y,0,a[x][1].A);
		}else{
			att1(y,a[x][1].A,0);
		}
		check(xx);
		if(a[x][1].x.f==5){
			a[x][1].hp+=a[x][1].x.x;
			if(a[x][1].hp>a[x][1].HP){
				a[x][1].hp=a[x][1].HP;
			}
		}
		a[x][1].mp+=1;
		if(a[x][1].mp>a[x][1].MP){
			a[x][1].mp=a[x][1].MP;
		}
	}else{
		a[x][1].mp=0;
		int ty=a[x][1].y.f;
		if(ty==1){
			for(int i=1;i<=n;i++){
				if(a[i][2].f){
					att1(i,a[x][1].y.x,0);
				}
			}
			check(xx);
			for(int i=1;i<=n;i++){
				if(a[i][2].f){
					a[x][2].mp-=a[x][2].mp/10;
				}
			}
			check(xx);
		}else if(ty==2){
			for(int i=1;i<=n;i++){
				if(a[i][2].f){
					att1(i,0,a[x][1].A);
				}
			}
			check(xx);
		}else if(ty==3){
			for(int i=1;i<=n;i++){
				if(a[i][2].f){
					att1(i,min(a[x][1].y.x*a[x][1].A,a[x][2].HP/10),0);
				}
			}
			check(xx);
		}else if(ty==4){
			for(int i=xx;i<=xx+a[x][1].y.x-1;i++) f4[i][1]+=a[x][1].y.y;
		}else if(ty==5){
			for(int i=1;i<=n;i++){
				if(a[p[x][1].p[i]][2].f){
					a[p[x][1].p[i]][2].DEF-=a[x][1].y.x;
					update(xx);
					att1(p[x][1].p[i],0,a[x][1].A);
					break;
				}
			}
			check(xx);
		}else if(ty==6){
			for(int i=1;i<=n;i++){
				if(a[p[x][1].p[i]][2].f){
					att1(p[x][1].p[i],0,a[x][1].A);
					break;
				}
			}
			check(xx);
			for(int i=xx;i<=a[x][1].y.x+xx-1;i++) def[i][2]-=a[x][1].y.y;
		}else if(ty==7){
			int X=0,minn=INF;
			for(int i=1;i<=n;i++){
				if(a[i][1].f&&a[i][1].hp<minn){
					minn=a[i][1].hp;
					X=i;
				}
			}
			a[X][1].hp+=a[x][1].y.z;
			if(a[X][1].hp>a[X][1].HP){
				a[X][1].hp=a[X][1].HP;
			}
			for(int i=xx;i<=a[x][1].y.x+xx-1;i++) atk[i][1]+=a[x][1].y.y;
		}else if(ty==8){
			for(int i=1;i<=n;i++){
				if(a[i][2].f){
					att1(i,a[x][1].A,0);
				}
			}
			check(xx);
			for(int i=xx;i<=a[x][1].y.x+xx-1;i++) def[i][2]-=a[x][1].y.y;
		}else if(ty==9){
			for(int i=1;i<=n;i++){
				if(a[i][1].f){
					a[i][1].hp+=a[x][1].y.z;
					if(a[i][1].hp>a[i][1].HP){
						a[i][1].hp=a[i][1].HP;
					}
				}
			}
			for(int i=xx;i<=a[x][1].y.x+xx-1;i++) def[i][1]+=a[x][1].y.y;
		}else if(ty==10){
			for(int i=1;i<=n;i++){
				if(a[i][1].f){
					a[i][1].def*=2;
					a[i][1].atk*=2;
					a[i][1].hp=max(a[i][1].hp,a[i][1].HP/2);
					a[i][1].mp=max(a[i][1].mp,a[i][1].MP/2);
				}
			}
			for(int i=xx;i<=a[x][1].y.x+xx-1;i++) f4[i][1]+=1;
			f[a[x][1].y.x+xx-1][1]=0;
			for(int i=1;i<=n;i++){
				if(a[i][1].y.f==10) a[i][1].y.f=0;
				if(a[i][2].y.f==10) a[i][2].y.f=0;
			}
		}
		a[x][1].mp+=1;
		if(a[x][1].mp>a[x][1].MP){
			a[x][1].mp=a[x][1].MP;
		}
		if(a[x][1].x.f==5){
			a[x][1].mp+=a[x][1].x.y;
			if(a[x][1].mp>a[x][1].MP){
				a[x][1].mp=a[x][1].MP;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(a[i][1].f==0) continue; 
		a[i][1].mp+=1+f4[xx][1];
		if(a[i][1].mp>a[i][1].MP){
			a[i][1].mp=a[i][1].MP;
		}
		if(a[i][1].x.f==3){
			a[i][1].mp+=a[i][1].x.y;
			if(a[i][1].mp>a[i][1].MP){
				a[i][1].mp=a[i][1].MP;
			}
			a[i][1].hp+=a[i][1].x.x;
			if(a[i][1].hp>a[i][1].HP){
				a[i][1].hp=a[i][1].HP;
			}
		}
	}
	update(xx);
}
void Bob(int xx){
	int x=0;
	for(int i=1;i<=n;i++){
		if(a[i][2].f==0) continue;
		if(a[i][2].mp==a[i][2].MP){
			if(a[i][2].y.f>a[x][2].y.f){
				x=i;
			}else if(a[i][2].y.f==a[x][2].y.f){
				if(i>x) x=i;
			}
		}
	}
	update(xx);
	if(!x){
		int y=0,at=0;
		for(int i=1;i<=n;i++){
			if(a[i][2].f==0) continue;
			for(int j=1;j<=n;j++){
				if(a[p[i][2].p[j]][1].f){
					int Y=p[i][2].p[j];
					if(a[Y][1].hp>a[y][1].hp){
						x=i;
						y=Y;
						if(a[i][2].x.f==2){
							at=at2(Y,a[i][2].A,a[i][2].x.x);
						}else if(a[i][2].x.f==4){
							at=at2(Y,0,a[i][2].A);
						}else{
							at=at2(Y,a[i][2].A,0);
						}
					}else if(a[Y][1].hp==a[y][1].hp){
						int att;
						if(a[i][2].x.f==2){
							att=at2(Y,a[i][2].A,a[i][2].x.x);
						}else if(a[i][2].x.f==4){
							att=at2(Y,0,a[i][2].A);
						}else{
							att=at2(Y,a[i][2].A,0);
						}
						if(att>at){
							x=i;
							y=Y;
							at=att;
						}else if(att==at){
							if(i>x){
								x=i;
								y=Y;
							}
						}
					}
					break;
				}
			}
		}
		if(a[x][2].x.f==2){
			att2(y,a[x][2].A,a[x][2].x.x);
		}else if(a[x][2].x.f==4){
			att2(y,0,a[x][2].A);
		}else{
			att2(y,a[x][2].A,0);
		}
		check(xx);
		if(a[x][2].x.f==5){
			a[x][2].hp+=a[x][2].x.x;
			if(a[x][2].hp>a[x][2].HP){
				a[x][2].hp=a[x][2].HP;
			}
		}
		a[x][2].mp+=1;
		if(a[x][2].mp>a[x][2].MP){
			a[x][2].mp=a[x][2].MP;
		}
	}else{
		a[x][2].mp=0;
		int ty=a[x][2].y.f;
		if(ty==1){
			for(int i=1;i<=n;i++){
				if(a[i][1].f){
					att2(i,a[x][2].y.x,0);
				}
			}
			check(xx);
			for(int i=1;i<=n;i++){
				if(a[i][1].f){
					a[x][1].mp-=a[x][1].mp/10;
				}
			}
			check(xx);
		}else if(ty==2){
			for(int i=1;i<=n;i++){
				if(a[i][1].f){
					att2(i,0,a[x][2].A);
				}
			}
			check(xx);
		}else if(ty==3){
			for(int i=1;i<=n;i++){
				if(a[i][1].f){
					att2(i,min(a[x][2].y.x*a[x][2].A,a[x][1].HP/10),0);
				}
			}
			check(xx);
		}else if(ty==4){
			for(int i=xx;i<=xx+a[x][2].y.x-1;i++) f4[i][2]+=a[x][2].y.y;
		}else if(ty==5){
			for(int i=1;i<=n;i++){
				if(a[p[x][2].p[i]][1].f){
					a[p[x][2].p[i]][1].DEF-=a[x][2].y.x;
					update(xx);
					att2(p[x][2].p[i],0,a[x][2].A);
					break;
				}
			}
			check(xx);
		}else if(ty==6){
			for(int i=1;i<=n;i++){
				if(a[p[x][2].p[i]][1].f){
					att2(p[x][2].p[i],0,a[x][2].A);
					break;
				}
			}
			check(xx);
			for(int i=xx;i<=a[x][2].y.x+xx-1;i++) def[i][1]-=a[x][2].y.y;
		}else if(ty==7){
			int X=0,minn=INF;
			for(int i=1;i<=n;i++){
				if(a[i][2].f&&a[i][2].hp<minn){
					minn=a[i][2].hp;
					X=i;
				}
			}
			a[X][2].hp+=a[x][2].y.z;
			if(a[X][2].hp>a[X][2].HP){
				a[X][2].hp=a[X][2].HP;
			}
			for(int i=xx;i<=a[x][2].y.x+xx-1;i++) atk[i][2]+=a[x][2].y.y;
		}else if(ty==8){
			for(int i=1;i<=n;i++){
				if(a[i][1].f){
					att2(i,a[x][2].A,0);
				}
			}
			check(xx);
			for(int i=xx;i<=a[x][2].y.x+xx-1;i++) def[i][1]-=a[x][2].y.y;
		}else if(ty==9){
			for(int i=1;i<=n;i++){
				if(a[i][2].f){
					a[i][2].hp+=a[x][2].y.z;
					if(a[i][2].hp>a[i][2].HP){
						a[i][2].hp=a[i][2].HP;
					}
				}
			}
			for(int i=xx;i<=a[x][2].y.x+xx-1;i++) def[i][2]+=a[x][2].y.y;
		}else if(ty==10){
			for(int i=1;i<=n;i++){
				if(a[i][2].f){
					a[i][2].def*=2;
					a[i][2].atk*=2;
					a[i][2].hp=max(a[i][2].hp,a[i][2].HP/2);
					a[i][2].mp=max(a[i][2].mp,a[i][2].MP/2);
				}
			}
			for(int i=xx;i<=a[x][2].y.x+xx-1;i++) f4[i][2]+=1;
			f[a[x][2].y.x+xx-1][2]=0;
			for(int i=1;i<=n;i++){
				if(a[i][1].y.f==10) a[i][1].y.f=0;
				if(a[i][2].y.f==10) a[i][2].y.f=0;
			}
		}
		a[x][2].mp+=1;
		if(a[x][2].mp>a[x][2].MP){
			a[x][2].mp=a[x][2].MP;
		}
		if(a[x][2].x.f==5){
			a[x][2].mp+=a[x][2].x.y;
			if(a[x][2].mp>a[x][2].MP){
				a[x][2].mp=a[x][2].MP;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(a[i][2].f==0) continue; 
		a[i][2].mp+=1+f4[xx][2];
		if(a[i][2].mp>a[i][2].MP){
			a[i][2].mp=a[i][2].MP;
		}
		if(a[i][2].x.f==3){
			a[i][2].mp+=a[i][2].x.y;
			if(a[i][2].mp>a[i][2].MP){
				a[i][2].mp=a[i][2].MP;
			}
			a[i][2].hp+=a[i][2].x.x;
			if(a[i][2].hp>a[i][2].HP){
				a[i][2].hp=a[i][2].HP;
			}
		}
	}
	update(xx);
}
void END(int x){
	update(x);
	if(f[x][1]==0) print2(x);
	if(f[x][2]==0) print1(x);
	check(x);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i][1].HP>>a[i][1].MP>>a[i][1].atk>>a[i][1].def;
		a[i][1].hp=a[i][1].HP;
		a[i][1].mp=0;
		a[i][1].ATK=0;
		a[i][1].DEF=0;
		a[i][1].f=1;
		for(int j=1;j<=n;j++){
			cin>>p[i][1].p[j];
		}
		cin>>a[i][1].x.f>>a[i][1].x.x>>a[i][1].x.y;
		cin>>a[i][1].y.f>>a[i][1].y.x>>a[i][1].y.y>>a[i][1].y.z;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i][2].HP>>a[i][2].MP>>a[i][2].atk>>a[i][2].def;
		a[i][2].hp=a[i][2].HP;
		a[i][2].mp=0;
		a[i][2].f=1;
		a[i][2].ATK=0;
		a[i][2].DEF=0;
		for(int j=1;j<=n;j++){
			cin>>p[i][2].p[j];
		}
		cin>>a[i][2].x.f>>a[i][2].x.x>>a[i][2].x.y;
		cin>>a[i][2].y.f>>a[i][2].y.x>>a[i][2].y.y>>a[i][2].y.z;
	}
	memset(f,1,sizeof f);
	update(1);
	for(int i=1;i<=23333;i++){
		Alice(i);
		Bob(i);
		END(i);
	}
    return 0;
}
2024/7/23 22:02
加载中...