1 条题解

  • 0
    @ 2021-10-26 19:04:38
    #include<bits/stdc++.h>
    using namespace std;typedef long long LL;struct node{vector<char>card;LL blood,nxt,prev;char identity;bool AK47;}a[20];char know[11],card[2010];LL n,m,green;bool gameEnd;void getcard(LL x){if(!m)m++;a[x].card.push_back(card[m]);m--;}void killed(LL x1,LL x2){for(LL i=0;i<(LL)a[x2].card.size();i++)if(a[x2].card[i]=='P'){a[x2].card.erase(a[x2].card.begin()+i);i--;a[x2].blood++;return;}a[a[x2].nxt].prev=a[x2].prev;a[a[x2].prev].nxt=a[x2].nxt;if(x2==1){gameEnd=1;return;}if(a[x2].identity=='F')green--;if(!green){gameEnd=1;return;}if(a[x2].identity=='F'){getcard(x1);getcard(x1);getcard(x1);}if(a[x2].identity=='Z'&&a[x1].identity=='M'){a[x1].card.clear();a[x1].AK47=0;}}namespace cardlist{void kill(LL x1,LL x2){for(LL i=0;i<(LL)a[x2].card.size();i++){if(a[x2].card[i]=='D'){a[x2].card.erase(a[x2].card.begin()+i);i--;return;}}a[x2].blood--;if(!a[x2].blood)killed(x1,x2);}void peach(LL x){a[x].blood++;}void AK47(LL x){a[x].AK47=1;}bool unable(LL x1,LL x2,LL pd){LL i=x1;while(1){if(pd){if(know[x2]==a[i].identity||(know[x2]=='M'&&a[i].identity=='Z')||(know[x2]=='Z'&&a[i].identity=='M')){for(LL j=0;j<(LL)a[i].card.size();j++){if(a[i].card[j]=='J'){a[i].card.erase(a[i].card.begin()+j);j--;know[i]=a[i].identity;return!unable(i,x1,0);}}}}else{if((a[i].identity=='M'||a[i].identity=='Z')&&know[x1]=='F'||(a[i].identity=='F'&&(know[x1]=='M'||know[x1]=='Z'))){for(LL j=0;j<(LL)a[i].card.size();j++){if(a[i].card[j]=='J'){a[i].card.erase(a[i].card.begin()+j);j--;know[i]=a[i].identity;return!unable(i,x1,0);}}}}i=a[i].nxt;if(i==x1)break;}return 0;}void A(LL x1){for(LL x2=a[x1].nxt;x1!=x2;x2=a[x2].nxt){if(unable(x1,x2,1))continue;bool flag=0;for(LL i=0;i<(LL)a[x2].card.size();i++){if(a[x2].card[i]=='K'){a[x2].card.erase(a[x2].card.begin()+i);i--;flag=1;break;}}if(flag)continue;a[x2].blood--;if(x2==1&&know[x1]=='U')know[x1]='L';if(!a[x2].blood)killed(x1,x2);if(gameEnd)return;}}void W(LL x1){for(LL x2=a[x1].nxt;x1!=x2;x2=a[x2].nxt){if(unable(x1,x2,1))continue;bool flag=0;for(LL i=0;i<(LL)a[x2].card.size();i++){if(a[x2].card[i]=='D'){a[x2].card.erase(a[x2].card.begin()+i);i--;flag=1;break;}}if(flag)continue;a[x2].blood--;if(x2==1&&know[x1]=='U')know[x1]='L';if(!a[x2].blood)killed(x1,x2);if(gameEnd)return;}}void fire(LL x1,LL x2){if(unable(x1,x2,1))return;if(x1==1&&a[x2].identity=='Z'){a[x2].blood--;if(!a[x2].blood)killed(x1,x2);return;}LL j=0,k=0;while(1){while(j<(LL)a[x2].card.size()&&a[x2].card[j]!='K')j++;if(j==a[x2].card.size()){a[x2].blood--;if(!a[x2].blood)killed(x1,x2);return;}else{a[x2].card.erase(a[x2].card.begin()+j);j--;}while(k<(LL)a[x1].card.size()&&a[x1].card[k]!='K')k++;if(k==(LL)a[x1].card.size()){a[x1].blood--;if(!a[x1].blood)killed(x2,x1);return;}else{a[x1].card.erase(a[x1].card.begin()+k);k--;}}}}void solve(){if(!green)return;gameEnd=0;for(LL i=1;i;i=a[i].nxt){getcard(i);getcard(i);bool usekill=1;for(LL j=0;j<(LL)a[i].card.size();j++){if(!a[i].blood)break;switch(a[i].card[j]){case'P':{if(a[i].blood!=4){cardlist::peach(i);a[i].card.erase(a[i].card.begin()+j);j--;}break;}case'K':{if(!usekill&&!a[i].AK47)continue;if(a[i].identity=='M'&&know[a[i].nxt]!='L'&&know[a[i].nxt]!='F')continue;if(a[i].identity=='Z'&&know[a[i].nxt]!='F')continue;if(a[i].identity=='F'&&know[a[i].nxt]!='Z'&&know[a[i].nxt]!='M')continue;a[i].card.erase(a[i].card.begin()+j);j--;cardlist::kill(i,a[i].nxt);know[i]=a[i].identity;usekill=0;if(gameEnd)return;break;}case'Z':{a[i].card.erase(a[i].card.begin()+j);j=-1;cardlist::AK47(i);continue;}case'N':{a[i].card.erase(a[i].card.begin()+j);j--;cardlist::A(i);if(gameEnd)return;j=-1;break;}case'W':{a[i].card.erase(a[i].card.begin()+j);j--;cardlist::W(i);if(gameEnd)return;j=-1;break;}case'F':{if(a[i].identity=='F'){a[i].card.erase(a[i].card.begin()+j);j--;cardlist::fire(i,1);know[i]=a[i].identity;if(gameEnd)return;j=-1;break;}for(LL k=a[i].nxt;i!=k;k=a[k].nxt){if(a[i].identity=='M'&&(know[k]=='L'||know[k]=='F')||(a[i].identity=='Z'&&know[k]=='F')){a[i].card.erase(a[i].card.begin()+j);j--;cardlist::fire(i,k);know[i]=a[i].identity;if(gameEnd)return;j=-1;break;}}break;}}}}}int main(){cin>>n>>m;for(LL i=1;i<=n;i++){a[i].nxt=i+1;a[i].prev=i-1;}a[n].nxt=1;a[1].prev=n;for(LL i=1;i<=n;i++){string s;cin>>s;a[i].identity=s[0];for(LL j=1;j<=4;j++){char ch;cin>>ch;a[i].card.push_back(ch);}a[i].blood=4;if(a[i].identity=='F')green++;a[i].AK47=0;}for(LL i=2;i<=n;i++)know[i]='U';know[1]='M';for(LL i=1;i<=m;i++){char ch;cin>>ch;card[m-i+1]=ch;}solve();if(a[1].blood<=0)cout<<"FP\n";else cout<<"MP\n";for(LL i=1;i<=n;i++){if(a[i].blood<=0)cout<<"DEAD\n";else{for(LL j=0;j<(LL)a[i].card.size();j++)cout<<a[i].card[j]<<' ';cout<<endl;}}}
    
    • 1

    信息

    ID
    1430
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    16
    已通过
    9
    上传者