40分求调
查看原帖
40分求调
920938
XingChen_MoNian楼主2025/8/29 20:06
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
inline ll read(){
    ll f=1,sum=0;char c=getchar();
    while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}
    while(isdigit(c)) {sum=sum*10+c-'0';c=getchar();}
    return sum*f;
}//快读
inline void print(ll x){
    if(x<0){putchar('-');x=-x;}
    if(x>9) print(x/10);
    putchar(x%10+'0');
}//快写
struct node{
    int cs,hp,nxt,lst;
    char id,card[2005];
    bool zgln;
}a[25];
char kn[15],kpd[2005],c[15];
int n,m,fz;
bool ed;
void mp(int x){
    if(!m) m++;
    a[x].card[++a[x].cs]=kpd[m];
    m--;
}
void js(int x1,int x2){
    for(int i=1;i<=a[x2].cs;i++){
        if(a[x2].card[i]=='P'){
            a[x2].card[i]='U';
            a[x2].hp++;
            return ;
        }
    }
    a[a[x2].nxt].lst=a[x2].lst;
    a[a[x2].lst].nxt=a[x2].nxt;
    if(x2==1){
        ed=1;
        return ;
    }
    if(a[x2].id=='F') fz--;
    if(!fz){
        ed=1;
        return ;
    }
    if(a[x2].id=='F'){
        mp(x1);
        mp(x1);
        mp(x1);
    }
    if(a[x2].id=='Z' && a[x1].id=='M'){
        a[x1].cs=0;
        a[x1].zgln=0;
    }
}
void Kil(int x1,int x2){
    for(int i=1;i<=a[x2].cs;i++){
        if(a[x2].card[i]=='D'){
            a[x2].card[i]='U';
            return ;
        }
    }
    a[x2].hp--;
    if(!a[x2].hp) js(x1,x2);
}
bool wxkj(int x1,int x2,int x3){
    int i=x1,pd=x3?x2:x1;
    while(1){
        if(x3==1){
            if(kn[x2]==a[i].id || (kn[x2]=='M' && a[i].id=='Z') || (kn[x2]=='Z' && a[i].id=='M')){
                for(int j=1;j<=a[i].cs;j++){
                    if(a[i].card[j]=='J'){
                        a[i].card[j]='U';
                        kn[i]=a[i].id;
                        return !wxkj(i,x1,0);
                    }
                }
            }
        }
        else{
            if(((a[i].id=='M' || a[i].id=='Z') && kn[x1]=='F') || (a[i].id=='F' && (kn[x1]=='M' || kn[x1]=='Z'))){
                for(int j=1;j<=a[i].cs;j++){
                    if(a[i].card[j]=='J'){
                        a[i].card[j]='U';
                        kn[i]=a[i].id;
                        return !wxkj(i,x1,0);
                    }
                }
            }
        }
        i=a[i].nxt;
        if(i==x1) break;
    }
    return false;
}
void jd(int x1,int x2){
    int i,j,k;
    if(wxkj(x1,x2,1)) return ;
    if(x1==1 && a[x2].id=='Z'){
        a[x2].hp--;
        if(!a[x2].hp) js(x1,x2);
        return ;
    }
    j=k=1;
    while(1){
        while(a[x2].card[j]!='K' && j<=a[x2].cs) j++;
        if(j>a[x2].cs){
            a[x2].hp--;
            if(!a[x2].hp) js(x1,x2);
            return ;
        }
        else a[x2].card[j]='U';
        while(a[x1].card[k]!='K' && k<=a[x1].cs) k++;
        if(k>a[x1].cs){
            a[x1].hp++;
            if(!a[x1].hp) js(x2,x1);
            return ;
        }
        else a[x1].card[k]='U';
    }
}
void nmrq(int x1){
    for(int x2=a[x1].nxt;x2!=x1;x2=a[x2].nxt){
        if(!wxkj(x1,x2,1)){
            int i;
            for(i=1;i<=a[x2].cs;i++){
                if(a[x2].card[i]=='K'){
                    a[x2].card[i]='U';
                    break;
                }
            }
            if(i>a[x2].cs){
                a[x2].hp--;
                if(x2==1 && kn[x1]=='U') kn[x1]='L';
                if(!a[x2].hp) js(x1,x2);
                if(ed) return ;
            }
        }
    }
}
void wjqf(int x1){
    for(int x2=a[x1].nxt;x2!=x1;x2=a[x2].nxt){
        if(!wxkj(x1,x2,1)){
            int i;
            for(i=1;i<=a[x2].cs;i++){
                if(a[x2].card[i]=='D'){
                    a[x2].card[i]='U';
                    break;
                }
            }
            if(i>a[x2].cs){
                a[x2].hp--;
                if(x2==1 && kn[x1]=='U') kn[x1]='L';
                if(!a[x2].hp) js(x1,x2);
                if(ed) return ;
            }
        }
    }
}
void hh(){
    char nc;
    ed=1;
    if(fz) ed=0;
    if(ed) return ;
    for(int i=1;i;i=a[i].nxt){
        mp(i);
        mp(i);
        bool kill=1;
        for(int j=1;j<=a[i].cs;j++){
            if(a[i].card[j]!='U'){
                if(!a[i].hp) break;
                nc=a[i].card[j];
                if(nc=='P'){
                    if(a[i].hp!=4){
                        a[i].hp++;
                        a[i].card[j]='U';
                    }
                    continue;
                }
                if(nc=='K'){
                    if(!kill && !a[i].zgln) continue;
                    if(a[i].id=='M' && kn[a[i].nxt]!='L' && kn[a[i].nxt]!='F') continue;
                    if(a[i].id=='Z' && kn[a[i].nxt]!='F') continue;
                    if(a[i].id=='F' && kn[a[i].nxt]!='Z' && kn[a[i].nxt]!='M') continue;
                    a[i].card[j]='U';
                    Kil(i,a[i].nxt);
                    kn[i]=a[i].id;
                    kill=0;
                    if(ed) return ;
                    continue;
                }
                if(nc=='F'){
                    if(a[i].id=='F'){
                        a[i].card[j]='U';
                        kn[i]=a[i].id;
                        if(ed) return ;
                        j=0;
                        continue;
                    }
                    for(int k=a[i].nxt;k!=i;k=a[k].nxt){
                        if((a[i].id=='M' && (kn[k]=='L' || kn[k]=='F')) || (a[i].id=='Z' && kn[k]=='F')){
                            a[i].card[j]='U';
                            jd(i,k);
                            kn[i]=a[i].id;
                            if(ed) return ;
                            j=0;
                            break;
                        }
                    }
                    continue;
                }
                if(nc=='N'){
                    a[i].card[j]='U';
                    nmrq(i);
                    if(ed) return ;
                    j=0;
                    continue;
                }
                if(nc=='W'){
                    a[i].card[j]='U';
                    wjqf(i);
                    if(ed) return ;
                    j=0;
                    continue;
                }
                if(nc=='Z'){
                    a[i].zgln=1;
                    a[i].card[j]='U';
                    j=0;
                    continue;
                }
            }
        }
    } 
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        a[i].nxt=i+1;
        a[i].lst=i-1;
    }
    a[n].nxt=1;
    a[1].lst=n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=2000;j++) a[i].card[j]='U';
        cin>>c;
        a[i].id=c[0];
        for(int j=1;j<=4;j++){
            cin>>c;
            a[i].card[j]=c[0];
        }
        a[i].cs=4;
        a[i].hp=4;
        if(a[i].id=='F') fz++;
        a[i].zgln=0;
    }
    for(int i=2;i<=n;i++) kn[i]='U';
    kn[1]='M';
    for(int i=1;i<=m;i++){
        cin>>c;
        kpd[m-i+1]=c[0];
    }
    hh();
    if(a[1].hp<=0) cout<<"FP\n";
    else cout<<"MP\n";
    for(int i=1;i<=n;i++){
        if(a[i].hp<=0) cout<<"DEAD\n";
        else{
            for(int j=1;j<=a[i].cs;j++){
                if(a[i].card[j]!='U') cout<<a[i].card[j]<<" ";
            }
            cout<<"\n";
        }
    }
    return 0;
}

提交记录:https://www.luogu.com.cn/record/233756781

2025/8/29 20:06
加载中...