TLE了,求dalao
查看原帖
TLE了,求dalao
1072152
CPU860431楼主2024/9/14 13:02
#include<bits/stdc++.h>
using namespace std;
struct pig{
	int identity;
	int health;
	int first_kill;
	int first_fight;
	int num_of_kill;
	int num_of_flash;
	int num_of_peach;
	int num_of_cards;
	int num_of_J;
	int alive_pig_before;
	int alive_pig_next;
	int situation;
	bool is_it_alive;
	bool is_it_zhugeliannu;
	char hand_cards[2010]; 
}pigs[11];
int tot_cards,tot_pigs,tot_anti_pigs;
int now_top_of_cards,n=1;
char cards[2010];
int winner;
char pd_getcard(){
	char c=cards[now_top_of_cards];
	if(now_top_of_cards!=1){
		now_top_of_cards--;
	}
	return c;
}
char getcard(){
	char c=getchar();
	for(;c<'A'||c>'Z';c=getchar());
	return c;
}
void first_in(int rank){
	char t[2];
	cin>>t;
	if(t[0]=='M'){
		pigs[rank].identity=1;
		pigs[rank].situation=1;
	}else if(t[0]=='Z'){
		pigs[rank].identity=2;
	}else if(t[0]=='F'){
		pigs[rank].identity=3;
		pigs[rank].first_fight=1;
		tot_anti_pigs++;
	}
	for(int i=1;i<=4;i++){
		pigs[rank].hand_cards[i]=getcard();
		if(pigs[rank].hand_cards[i]=='K'){
			pigs[rank].num_of_kill++;
		}else if(pigs[rank].hand_cards[i]=='D'){
			pigs[rank].num_of_flash++;
		}else if(pigs[rank].hand_cards[i]=='P'){
			pigs[rank].num_of_peach++;
		}else if(pigs[rank].hand_cards[i]=='J'){
			pigs[rank].num_of_J++;
		}
	}
	pigs[rank].num_of_cards=4;
	pigs[rank].health=4;
	pigs[rank].alive_pig_before=(rank=1?tot_pigs:rank-1);
	pigs[rank].alive_pig_next=(rank==tot_pigs?1:rank+1);
	pigs[rank].is_it_alive=1;
}
bool gameover(){
	if(tot_anti_pigs==0){
		winner=1;
		return true;
	}
	if(!pigs[1].is_it_alive){
		winner=2;
		return true;
	}
	return false;
}
void print_ans(){
	cout<<(winner==1?"MP":"FP")<<endl;
	for(int i=1;i<=tot_pigs;i++){
		if(!pigs[i].is_it_alive){
			cout<<"DEAD"<<endl;
			continue;
		}else if(pigs[i].num_of_cards>0){
			for(int j=1;j<pigs[i].num_of_cards;j++){
				cout<<pigs[i].hand_cards[j]<<" ";
				cout<<pigs[i].hand_cards[pigs[i].num_of_cards]<<endl;
			}
		}else{
			cout<<endl;
		}
	}
}
void die(int rank){
	pigs[rank].is_it_alive=0;
	if(rank){
		winner=2;
		print_ans();
		exit(0);
	}
	if(pigs[rank].identity==3){
		if(tot_anti_pigs==0){
			winner=1;
			print_ans();
			exit(0);
			pigs[pigs[rank].alive_pig_before].alive_pig_next=pigs[rank].alive_pig_next;
			pigs[pigs[rank].alive_pig_next].alive_pig_before=pigs[rank].alive_pig_before;
		}
	}
}
void find_target_to_kill(int rank){
	if(pigs[rank].identity==2){
		pigs[rank].first_kill=(pigs[pigs[rank].alive_pig_next].situation==2?pigs[rank].alive_pig_next:0);
	}else if(pigs[rank].identity==1){
		pigs[rank].first_kill=(pigs[pigs[rank].alive_pig_next].situation==2||pigs[pigs[rank].alive_pig_next].situation==3?pigs[rank].alive_pig_next:0);
	}else if(pigs[rank].identity==3){
		pigs[rank].first_kill=(pigs[pigs[rank].alive_pig_next].situation==1?pigs[rank].alive_pig_next:0);
	}
}
void find_target_to_fight(int rank){
	for(int i=pigs[rank].alive_pig_next;i!=rank;i=pigs[i].alive_pig_next){
		if((rank==1&&(pigs[i].situation==2||pigs[i].situation==3))||(pigs[i].situation==2&&pigs[rank].identity==2)){
			pigs[rank].first_fight=i;
			return ;
		}
	}
	pigs[rank].first_fight=0;
}
void near_die(int killer,int sufferer){
	bool num_of_have_peach=0;
	if(pigs[sufferer].num_of_peach>0){
		int i;
		num_of_have_peach=1;
		for(i=1;pigs[sufferer].hand_cards[i]!='P';i++);
		for(i=i+1;i<=pigs[sufferer].num_of_cards;i++){
			pigs[sufferer].hand_cards[i-1]=pigs[sufferer].hand_cards[i];
			pigs[sufferer].num_of_peach--;
			pigs[sufferer].num_of_cards--;
			pigs[sufferer].health++;
		}
	}
	if(!num_of_have_peach){
		die(sufferer);
		if(killer==1&&pigs[sufferer].identity==2){
			pigs[1].is_it_zhugeliannu=pigs[1].num_of_cards=pigs[1].num_of_kill=pigs[1].num_of_peach=pigs[1].num_of_flash=pigs[1].num_of_J=0;
			memset(pigs[1].hand_cards,0,sizeof(pigs[1].hand_cards));
		}
		if(pigs[sufferer].identity==3){
			for(int j=1;j<=3;j++){
				pigs[killer].hand_cards[(pigs[killer++]).num_of_cards]=pd_getcard();
				if(pigs[killer].hand_cards[pigs[killer].num_of_cards]=='K'){
					pigs[killer].num_of_kill++;
				}else if(pigs[killer].hand_cards[pigs[killer].num_of_cards]=='D'){
					pigs[killer].num_of_flash++;
				}else if(pigs[killer].hand_cards[pigs[killer].num_of_cards]=='P'){
					pigs[killer].num_of_peach++;
				}else if(pigs[killer].hand_cards[pigs[killer].num_of_cards]=='J'){
					pigs[killer].num_of_J++;
				}
			}
		}
	}
}
bool ask_for_J(int rank,int situation){
	if((situation==0)||situation==3){
		return 0;
	}
	for(int i=rank;;i=pigs[i].alive_pig_next){
		if(pigs[i].num_of_J>0){
			if(situation==1&&(pigs[i].identity==1||pigs[i].identity==2)){
				int j;
				for(j=1;j<=pigs[i].num_of_cards&&pigs[i].hand_cards[j]!='J';i++);
				for(j=j+1;j<=pigs[i].hand_cards[i];j++){
					pigs[i].hand_cards[j-1]=pigs[i].hand_cards[j];
				}
				pigs[i].num_of_cards--;
				pigs[i].num_of_J--;
				if(pigs[i].situation==0||pigs[i].situation==3){
					pigs[i].situation=1;
					return !ask_for_J(i,2);
				}
			}else if(situation==2&&pigs[i].identity==3){
				int j;
				for(j=1;j<=pigs[i].num_of_cards&&pigs[i].hand_cards[j]!='J';j++);
				for(j=j+1;j<=pigs[i].num_of_cards;j++){
					pigs[i].hand_cards[j-1]=pigs[i].hand_cards[j];
				}
				pigs[i].num_of_cards--;
				pigs[i].num_of_J--;
				if(pigs[i].situation==0||pigs[i].situation==3){
					pigs[i].situation=2;
				}
				return !ask_for_J(i,1);
			}
		}
		if(i==pigs[rank].alive_pig_before){
			return 0;
		}
	}
}
void go_fight(int from,int target){
	int i,f,g;
	if(pigs[from].situation==0||pigs[from].situation==3){
		pigs[from].situation=(pigs[target].situation==1?2:1);
	}
	bool cmiss=ask_for_J(from,pigs[target].situation);
	if(cmiss){
		return ;
	}
	if(pigs[target].identity==2&&from==1){
		if((pigs[target].health--)<=0){
			near_die(from,target);
		}
		return ;
	}
	i=target;
	while(pigs[i].num_of_kill>0){
		for(f=1;f<=pigs[i].num_of_cards&&pigs[i].hand_cards[f]!='K';f++);
		for(int k=f+1;k<=pigs[i].num_of_cards;k++){
			pigs[i].hand_cards[k-1]=pigs[i].hand_cards[k];
			pigs[i].num_of_cards--;
			pigs[i].num_of_kill--;
			i=(i==target?from:target);
		}
	}
	int failer=i;
	winner=(from==failer?target:from);
	if((pigs[failer].health--)<=0){
		near_die(winner,failer);
	}
}
void go_nanban_invasion(int from){
	for(int i=pigs[from].alive_pig_next;i!=from;i=pigs[i].alive_pig_next){
		bool cmiss=ask_for_J(from,pigs[i].situation);
		if(cmiss){
			continue;
		}
		if(pigs[i].num_of_kill>0){
			int j;
			for(j=1;pigs[i].hand_cards[j]!='K';j++);
			for(j=j+1;j<=pigs[i].num_of_cards;j++){
				pigs[i].hand_cards[j-1]=pigs[i].hand_cards[j];
			}
			pigs[i].num_of_cards--;
			pigs[i].num_of_kill--;
			cmiss=1;
		}
		if(cmiss){
			continue;
		}
		if(i==1&&pigs[from].situation==0){
			pigs[from].situation==3;
		}
		if((pigs[i].health--)<=0){
			near_die(from,i);
		}
	}
}
void go_ten_thousand_arrows_are_fired(int from){
	for(int i=pigs[from].alive_pig_next;i!=from;i=pigs[i].alive_pig_next){
		bool cmiss=ask_for_J(from,pigs[i].situation);
		if(cmiss){
			continue;
		}
		if(pigs[i].num_of_flash>0){
			int j;
			for(j=1;pigs[i].hand_cards[j]!='D';j++);
			for(j=j+1;j<=pigs[i].num_of_cards;j++){
				pigs[i].hand_cards[j-1]=pigs[i].hand_cards[j];
			}
			pigs[i].num_of_cards--;
			pigs[i].num_of_flash--;
			cmiss=1;
		}
		if(cmiss){
			continue;
		}
		if(i==1&&pigs[from].situation==0){
			pigs[from].situation=3;
			if((pigs[i].health--)<=0){
				near_die(from,i);
			}
		}
	}
}
void go_kill(int from,int target){
	int i;
	if(pigs[from].situation==0||pigs[from].situation==3){
		pigs[from].situation=(pigs[target].situation==1?2:1);
	}
	if(pigs[target].num_of_flash>0){
		for(i=1;pigs[target].hand_cards[i]!='D';i++);
		for(i=i+1;i<=pigs[target].num_of_cards;i++){
			pigs[target].hand_cards[i-1]=pigs[target].hand_cards[i];
			pigs[target].num_of_flash--;
			pigs[target].num_of_cards--;
		}
	}else if((pigs[target].health--)<=0){
		near_die(from,target);
	}
}
void round(int rank){
	for(int i=1;i<=2;i++){
		pigs[rank].hand_cards[(pigs[rank].num_of_cards)++]=pd_getcard();
		if(pigs[rank].hand_cards[pigs[rank].num_of_cards]=='K'){
			pigs[rank].num_of_kill++;
		}else if(pigs[rank].hand_cards[pigs[rank].num_of_cards]=='D'){
			pigs[rank].num_of_flash++;
		}else if(pigs[rank].hand_cards[pigs[rank].num_of_cards]=='P'){
			pigs[rank].num_of_peach++;
		}else if(pigs[rank].hand_cards[pigs[rank].num_of_cards]=='J'){
			pigs[rank].num_of_J++;
		}
	}
	int sum_of_kill=0;
	for(int i=1;i<=pigs[rank].num_of_cards&&pigs[rank].num_of_cards>0;i++){
		if(pigs[rank].hand_cards[i]=='Z'){
			for(int j=i+1;j<=pigs[rank].num_of_cards;j++){
				pigs[rank].hand_cards[j-1]=pigs[rank].hand_cards[j];
			}
			pigs[rank].num_of_cards--;
			pigs[rank].is_it_zhugeliannu=1;
			i=0;
		}
		if(pigs[rank].hand_cards[i]=='F'){
			if(pigs[rank].identity!=3){
				find_target_to_fight(rank);
			}
			if(pigs[rank].first_fight!=0){
				for(int j=i+1;j<=pigs[rank].num_of_cards;j++){
					pigs[rank].hand_cards[j-1]=pigs[rank].hand_cards[j];
				}
				pigs[rank].num_of_cards--;
				go_fight(rank,pigs[rank].first_fight);
				i=0;
				if(!pigs[rank].is_it_alive){
					return ;
				}
			}
		}
		if(pigs[rank].hand_cards[i]=='K'&&(sum_of_kill==0||pigs[rank].is_it_zhugeliannu==1)){
			find_target_to_kill(rank);
			if(pigs[rank].first_kill!=0){
				for(int j=i+1;j<=pigs[rank].num_of_cards;j++){
					pigs[rank].hand_cards[j-1]=pigs[rank].hand_cards[j];
				}
				pigs[rank].num_of_cards--;
				pigs[rank].num_of_kill--;
				go_kill(rank,pigs[rank].first_kill);
				sum_of_kill++;
				i=0;
			}
		}
		if(pigs[rank].hand_cards[i]=='P'&&pigs[rank].health<4){
			for(int j=i+1;j<=pigs[rank].num_of_cards;j++){
				pigs[rank].hand_cards[j-1]=pigs[rank].hand_cards[j];
			}
			pigs[rank].num_of_cards--;
			pigs[rank].num_of_peach--;
			pigs[rank].health++;
			i--;
		}
		if(pigs[rank].hand_cards[i]=='N'){
			for(int j=i+1;j<=pigs[rank].num_of_cards;j++){
				pigs[rank].hand_cards[j-1]=pigs[rank].hand_cards[j];
			}
			pigs[rank].num_of_cards--;
			go_nanban_invasion(rank);
			i=0;
		}
		if(pigs[rank].hand_cards[i]=='W'){
			for(int j=i+1;j<=pigs[rank].num_of_cards;j++){
				pigs[rank].hand_cards[j-1]=pigs[rank].hand_cards[j];
			}
			pigs[rank].num_of_cards--;
			go_ten_thousand_arrows_are_fired(rank);
			i=0;
		}
	}
}

void launch_kill(int from,int target){
	int i;
	if(pigs[from].situation==0||pigs[from].situation==3){
		pigs[from].situation=(pigs[target].situation==1?2:1);
	}
	if(pigs[target].num_of_flash>0){
		for(i=1;pigs[target].hand_cards[i]!='D';i++);
		for(i=i+1;i<=pigs[target].num_of_cards;i++){
			pigs[target].hand_cards[i-1]=pigs[target].hand_cards[i];
		}
		pigs[target].num_of_flash--;
		pigs[target].num_of_cards--;
	}else if((pigs[target].health--)<=0){
		near_die(from,target);
	}
}
int main(){
	cin>>tot_pigs>>tot_cards;
	now_top_of_cards=tot_cards;
	for(int i=1;i<=tot_pigs;i++){
		pigs[i].num_of_kill=pigs[i].num_of_peach=pigs[i].num_of_flash=pigs[i].num_of_J=0;
	}
	for(int i=1;i<=tot_pigs;i++){
		first_in(i);
	}
	for(int i=tot_cards;i>=1;i--){
		cards[i]=getcard();
		while(gameover()==0){
			round(n);
			n=pigs[n].alive_pig_next;
		}
		print_ans();
	}
	return 0;
} 
2024/9/14 13:02
加载中...