测评记录
代码:
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define pii pair<int,int>
const int maxn=12,maxm=8e4+10;
int n,m;
int fz_tot;
int ed=0;
struct IDcard{
int id;
int nxt,pre;
string cst;
char card[maxm];
int card_tot;
bool zgln;
int hp;
bool die;
bool at;
bool ol;
bool sim;
}pig[maxn];
queue<char>card_heap;
void init(){
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>pig[i].cst;
if(pig[i].cst=="FP")fz_tot++;
pig[i].card_tot=0;
pig[i].id=i;
pig[i].hp=4;
pig[i].zgln=0;
pig[i].nxt=i+1;
pig[i].pre=i-1;
pig[i].sim=0;
pig[i].at=0;
pig[i].ol=0;
pig[i].die=0;
for(int j=1;j<=2000;++j)pig[i].card[j]='E';
for(int j=1;j<=4;++j){
cin>>pig[i].card[++pig[i].card_tot];
if(pig[i].card[pig[i].card_tot]=='Z') pig[i].zgln=1,pig[i].card[pig[i].card_tot]='E';
}
}
pig[1].pre=n;
pig[n].nxt=1;
for(int i=1;i<=m;++i){
char pai;
cin>>pai;
card_heap.push(pai);
}
pig[1].ol=1;
}
void get_card(int x){
if(card_heap.size()==1)card_heap.push(card_heap.front());
pig[x].card[++pig[x].card_tot]=card_heap.front();
if(pig[x].card[pig[x].card_tot]=='Z')pig[x].zgln=1,pig[x].card[pig[x].card_tot]='E';
card_heap.pop();
}
void js(int x,int s){
for(int i=1;i<=pig[x].card_tot;++i){
if(pig[x].card[i]=='P'){
pig[x].hp++;
pig[x].card[i]='E';
}
if(pig[x].hp>=1)return ;
}
pig[x].die=1;
int nxt=pig[x].nxt;
int pre=pig[x].pre;
pig[pre].nxt=nxt;
pig[nxt].pre=pre;
if(pig[x].cst=="FP")fz_tot--;
if(pig[x].cst=="MP"){ed=2;return ;}
if(!fz_tot){ed=1;return ;}
if(pig[x].cst=="FP")get_card(x),get_card(x),get_card(x);
if(pig[x].cst=="ZP"&&pig[s].cst=="MP"){
pig[s].zgln=0;
pig[s].card_tot=0;
}
}
void use_K(int u,int v){
if(pig[v].cst=="MP")pig[u].at=1,pig[u].sim=0;
if(pig[v].at)pig[u].ol=1,pig[u].sim=0;
if(pig[v].ol)pig[u].at=1,pig[u].sim=0;
for(int i=1;i<=pig[v].card_tot;++i){
if(pig[v].card[i]=='D'){
pig[v].card[i]='E';
return ;
}
}
pig[v].hp--;
if(!pig[v].hp)js(v,u);
}
bool wxkj(int x1,int x2){
int i=x2;
while(pig[x2].at||pig[x2].ol){
if((pig[i].cst=="FP"&&pig[x2].at)||(pig[i].cst=="ZP"&&pig[x2].ol)||(pig[i].cst=="MP"&&pig[x2].ol)){
for(int j=1;j<=pig[i].card_tot;++j){
if(pig[i].card[j]=='J'){
pig[i].card[j]='E';
if(pig[x1].at)pig[i].ol=1;
if(pig[x1].ol)pig[i].at=1;
if(pig[x2].ol)pig[i].ol=1;
if(pig[x2].at)pig[i].at=1;
return !wxkj(i,x1);
}
}
}
i=pig[i].nxt;
if(i==x1)break;
}
return 0;
}
void jd(int x1,int x2){
if(pig[x2].at)pig[x1].ol=1;
if(pig[x2].ol)pig[x1].at=1;
if(x2==1)pig[x1].at=1;
if(wxkj(x1,x2))return ;
if(pig[x2].cst=="ZP"&&x1==1){
pig[x2].hp--;
if(!pig[x2].hp)js(x2,1);
return ;
}
int i=1,j=1;
pig[x2].card[pig[x2].card_tot+1]='E';
pig[x1].card[pig[x1].card_tot+1]='E';
while(1){
while(pig[x2].card[j]!='K'&&j<=pig[x2].card_tot+2)j++;
if(j>pig[x2].card_tot){
pig[x2].hp--;
if(pig[x2].hp<=0)js(x2,x1);
return ;
}else {
pig[x2].card[j]='E';
}
while(pig[x1].card[i]!='K'&&i<=pig[x1].card_tot+2)i++;
if(i>pig[x1].card_tot){
pig[x1].hp--;
if(pig[x1].hp<=0)js(x1,x2);
return ;
}else {
pig[x1].card[i]='E';
}
}
}
void nzrq(int x1){
for(int x2=pig[x1].nxt;x2!=x1;x2=pig[x2].nxt){
bool flg=0;
if(wxkj(x1,x2))continue;
for(int i=1;i<=pig[x2].card_tot;++i){
if(pig[x2].card[i]=='K'){
pig[x2].card[i]='E';
flg=1;
break ;
}
}
if(flg)continue;
pig[x2].hp--;
if(x2==1)pig[x1].sim=1;
if(pig[x2].hp<=0)js(x2,x1);
}
}
void wjqf(int x1){
for(int x2=pig[x1].nxt;x2!=x1;x2=pig[x2].nxt){
bool flg=0;
if(wxkj(x1,x2))continue;
for(int i=1;i<=pig[x2].card_tot;++i){
if(pig[x2].card[i]=='D'){
pig[x2].card[i]='E';
flg=1;
break;
}
}
if(flg)continue;
pig[x2].hp--;
if(x2==1)pig[x1].sim=1;
if(pig[x2].hp<=0)js(x2,x1);
}
}
void Ett(){
int x=1;
while(!ed){
get_card(x);get_card(x);
int K_cnt=0;
for(int i=1;i<=pig[x].card_tot;++i){
if(ed)return ;
if(pig[x].card[i]=='P'){
if(pig[x].hp!=4){
pig[x].hp++;
pig[x].card[i]='E';
}
continue;
}
if(pig[x].card[i]=='K'){
if(K_cnt<1||pig[x].zgln){
int target=pig[x].nxt;
if(pig[x].cst=="MP"&&((pig[target].at&&pig[target].cst=="FP")||(pig[target].sim&&pig[target].at==0&&pig[target].ol==0))){
pig[x].card[i]='E';
pig[x].sim=0;
use_K(x,target);
K_cnt++;
}
if(pig[x].cst=="FP"&&((pig[target].ol&&pig[target].cst=="ZP")||pig[target].cst=="MP")){
pig[x].at=1;
pig[x].sim=0;
pig[x].card[i]='E';
use_K(x,target);
K_cnt++;
}
if(pig[x].cst=="ZP"&&pig[target].at&&pig[target].id!=1){
pig[x].ol=1;
pig[x].sim=0;
pig[x].card[i]='E';
use_K(x,target);
K_cnt++;
}
}
if(ed)return ;
continue;
}
if(pig[x].card[i]=='F'){
if(pig[x].cst=="FP"){
pig[x].at=1;
pig[x].sim=0;
pig[x].card[i]='E';
jd(x,1);
i=0;
if(ed)return ;
continue;
}
else{
int bdy=pig[x].nxt;
while(bdy!=x){
if((pig[x].cst=="MP"&&((pig[bdy].at&&pig[bdy].cst=="FP")||(pig[bdy].sim&&pig[bdy].at==0&&pig[bdy].ol==0)))
||(pig[x].cst=="ZP"&&pig[bdy].at&&pig[bdy].cst=="FP"))
{
pig[x].ol=1;
pig[x].sim=0;
pig[x].card[i]='E';
jd(x,bdy);
i=0;
if(ed)return ;
break;
}
bdy=pig[bdy].nxt;
}
}
continue;
}
if(pig[x].card[i]=='N'){
pig[x].card[i]='E';
nzrq(x);
i=0;
if(ed)return ;
continue;
}
if(pig[x].card[i]=='W'){
pig[x].card[i]='E';
wjqf(x);
i=0;
if(ed)return ;
continue;
}
}
x=pig[x].nxt;
}
}
void Sa(){
if(ed==1)cout<<"MP\n";
else cout<<"FP\n";
for(int i=1;i<=n;++i){
if(pig[i].die)cout<<"DEAD\n";
else{
for(int j=1;j<=pig[i].card_tot;++j)if(pig[i].card[j]!='E')cout<<pig[i].card[j]<<" ";
cout<<"\n";
}
}
}
int main(){
init();
Ett();
Sa();
return 0;
}