P2482 [SDOI2010] 猪国杀——红温圣手

原题

很好的一道模拟题,也就6小时红温三屎次


#include <bits/stdc++.h> 
#define i8  __int128
// #define int long long 
#define fuck inline
#define lb long double 
using namespace std; 
// typedef longlong ll; 
const int N=2e3+20,M=5e5+520,mod=1114514;
const int inf=INT_MAX,INF=1e9+7; 
// const int mod1=469762049,mod2=998244353,mod3=1004535809;
// const int G=3,Gi=332748118; 
// const int M=mod1*mod2;
fuck int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c-'0');c=getchar();}
    return x*f;
}
fuck void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
struct node
{
    int hp;//血量
    int cs;//卡牌数量
    char id;//身份
    char cd[N];//手牌
    int next;//下家
    int last;//上家
    int zgln;
}a[20];
int n,m,fz,ed;//玩家数,牌堆数,反贼数,游戏状态
char kn[11];//主公视角的玩家状态(M主公/L类反贼/F反贼/Z忠诚/U未知)
char card[2010],s[22];//牌堆
fuck void ts(int x)
{
    cout<<a[x].id<<" "<<a[x].hp<<" "<<a[x].cs<<" "<<a[x].zgln<<endl;
    for(int i=1;i<=a[x].cs;i++)cout<<a[x].cd[i]<<" ";
    cout<<endl;
}
fuck void mp(int x)//摸牌
{
    // cout<<x<<" "<<m<<"\n";
    if(!m)m++;
    a[x].cd[++a[x].cs]=card[m];
    m--;
}
fuck void js(int x1,int x2)//判断x1是否能对x2造成击杀
{
    
    for(int i=1;i<=a[x2].cs;i++)//找桃自救
    {
        if(a[x2].cd[i]=='P')
        {
            a[x2].cd[i]='U';//置为空牌
            a[x2].hp++;
            return;
        }
    }
    a[a[x2].next].last=a[x2].last;
    a[a[x2].last].next=a[x2].next;
    
    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[x1].id=='M'&&a[x2].id=='Z')
    {
        a[x1].cs=0;
        a[x1].zgln=0;
    }
}
fuck void sha(int x1,int x2)
{
    for(int i=1;i<=a[x2].cs;i++)
    {
        if(a[x2].cd[i]=='D')
        {
            a[x2].cd[i]='U';
            return;
        }
    }
    a[x2].hp--;
    if(!a[x2].hp)js(x1,x2);
}
fuck bool wxkj(int x1,int x2,int op)
{
    int i=x1;
    do
    {
        if(op==0)//x1尝试保护x2
        {
            if((a[i].id==kn[x2])||(a[i].id=='Z'&&kn[x2]=='M')||(a[i].id=='M'&&kn[x2]=='Z'))
            {
                for(int j=1;j<=a[i].cs;j++)
                {
                    if(a[i].cd[j]=='J')
                    {
                        a[i].cd[j]='U';
                        kn[i]=a[i].id;
                        return !wxkj(i,x1,1);//无法有其他无懈可击生效,此时的无懈可击成功使用
                    }
                }
            }
        }
        else//无懈可击对无懈可击
        {
            if(((a[i].id=='Z'||a[i].id=='M')&&kn[x1]=='F')||(a[i].id=='F'&&(kn[x1]=='Z'||kn[x1]=='M')))
            {
                for(int j=1;j<=a[i].cs;j++)
                {
                    if(a[i].cd[j]=='J')
                    {
                        a[i].cd[j]='U';
                        kn[i]=a[i].id;
                        return !wxkj(i,x1,1);//无法有其他无懈可击生效,此时的无懈可击成功使用
                    }
                }
            }
        }
        i=a[i].next;
    }while(i!=x1);
    return 0;
}

fuck void nmrq(int x1)
{
    for(int x2=a[x1].next;x2!=x1;x2=a[x2].next)
    {
        // cout<<x1<<" "<<x2<<" "<<!wxkj(x1,x2,0)<<endl;
        // cout<<endl;
        // cout<<a[x2].hp<<endl;
        if(!wxkj(x1,x2,0))
        {
            int j=0;
            for(j=1;j<=a[x2].cs;j++)
            {
                // cout<<a[x2].cd[j]<<" ";
                if(a[x2].cd[j]=='K')
                {
                    a[x2].cd[j]='U';
                    break;
                }
            }
            // cout<<endl;
            // cout<<j<<" "<<a[x2].cs<<endl;
            if(j>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;
            }
        }
    }
}
fuck void wjqf(int x1)
{
    for(int i=a[x1].next;i!=x1;i=a[i].next)
    {
        if(!wxkj(x1,i,0))
        {
            int j;
            for(j=1;j<=a[i].cs;j++)
            {
                if(a[i].cd[j]=='D')
                {
                    a[i].cd[j]='U';
                    break;
                }
            }
            if(j>a[i].cs)//无闪
            {
                a[i].hp--;
                if(i==1&&kn[x1]=='U')kn[x1]='L';
                if(!a[i].hp)js(x1,i);
                if(ed)return;
            }
        }
    }
}
fuck void jd(int x1,int x2)
{
    if(wxkj(x1,x2,0))return;//有无懈可击直接用
    if(x1==1&&a[x2].id=='Z')
    {
        a[x2].hp--;
        if(!a[x2].hp)js(x1,x2);
        return;
    }
    int i=1,j=1;
    while(1)//轮流出杀
    {
        while(a[x2].cd[i]!='K'&&i<=a[x2].cs)i++;
        if(i>a[x2].cs)
        {
            a[x2].hp--;
            if(!a[x2].hp)js(x1,x2);
            return;
        }
        else a[x2].cd[i++]='U';
        while(a[x1].cd[j]!='K'&&j<=a[x1].cs)j++;
        if(j>a[x1].cs)
        {
            a[x1].hp--;
            if(!a[x1].hp)js(x2,x1);
            return;
        }
        else a[x1].cd[j++]='U';
    }
}
fuck void zt()
{
    char nc;//当前牌
    ed=1;
    if(fz) ed=0;
    if(ed)return;
    // cout<<"aaaaaaaaaaaaaaa"<<"\n";
    for(int i=1;;i=a[i].next)//轮流出牌
    {
        // cout<<"\n";
        // cout<<i<<"  bbbbbbbbbbbbb"<<"\n";
        // cout<<i<<endl;
        // ts(i);
        
        mp(i),mp(i);
        int kill=1;
        // cout<<"ccccccccccccc"<<"\n";
        // cout<<a[i].hp<<" ";
        // for(int j=1;j<=a[i].cs;j++)cout<<a[i].cd[j];
        // cout<<"\n";
        for(int j=1;j<=a[i].cs;j++)//遍历手牌
        {
            if(a[i].cd[j]=='U')continue;
            if(!a[i].hp)break;
            nc=a[i].cd[j];
            // cout<<nc<<endl;
            if(nc=='P')//有桃
            {
                // cout<<"PPPPPPPPPPPPPPPPPP"<<"\n";
                if(a[i].hp<4)
                {
                    a[i].hp++;
                    a[i].cd[j]='U';
                }
                continue;
            }
            if(nc=='K')//有杀
            {
                // cout<<"KKKKKKKKKKKKK"<<"\n";
                if(!kill && !a[i].zgln)continue;
                int mb=a[i].next;//目标为下家
                if (a[i].id=='M'&&kn[mb]!='L'&&kn[mb]!='F')continue;// 主公只能杀类反或反贼
                if (a[i].id=='Z'&&kn[mb]!='F')continue;// 忠臣只能杀反贼
                if (a[i].id=='F'&&kn[mb]!='Z'&&kn[mb]!='M')continue;// 反贼只能杀忠臣或主公
                a[i].cd[j]='U';
                sha(i,mb);
                kn[i]=a[i].id;kill=0;
                if(ed)return;
                continue;
            }
            if(nc=='F')
            {
                // cout<<"FFFFFFFFFFFFFFF"<<"\n";
                if(a[i].id=='F')
                {
                    // cout<<"1111111111111"<<"\n";
                    a[i].cd[j]='U';
                    jd(i,1);//只杀主公
                    kn[i]=a[i].id;
                    if(ed)return;
                    j=0;
                    continue;
                }
                else
                {
                    // cout<<"2222222222222222"<<"\n";
                    for(int k=a[i].next;k!=i;k=a[k].next)
                    {
                        // cout<<k<<" "<<kn[k]<<"\n";
                        if((a[i].id=='M'&&(kn[k]=='L'||kn[k]=='F'))||(a[i].id=='Z'&&kn[k]=='F'))
                        {
                            a[i].cd[j]='U';
                            // cout<<i<<" "<<k<<"\n";
                            jd(i,k);
                            kn[i]=a[i].id;
                            if(ed)return;
                            j=0;
                            break;
                        }
                    }
                }
                continue;
            }
            if(nc=='N')
            {
                // cout<<"NNNNNNNNNNNN"<<"\n";
                a[i].cd[j]='U';
                // cout<<i<<endl;
                nmrq(i);
                if(ed)return;
                j=0;
                continue;
            }
            if(nc=='W')
            {
                // cout<<"wwwwwwwwwwwwwwwwwwww"<<"\n";
                a[i].cd[j]='U';
                wjqf(i);
                if(ed)return;
                j=0;
                continue;
            }
            if(nc=='Z')
            {
                // cout<<"zzzzzzzzzzzzzzzzzzzzzz"<<"\n";
                a[i].zgln=1;
                a[i].cd[j]='U';
                j=0;
                continue;
            }
        }
        // cout<<endl<<endl;
    }
}
fuck void solve()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)//构建玩家链
    {
        a[i].next=i+1;
        a[i].last=i-1;
    }
    a[n].next=1;
    a[1].last=n;
    // for(int i=1;i<=n;i++)cout<<a[i].last<<" "<<a[i].next<<"\n";
    // cout<<"aaaaaaaaaaaaaaaaaa"<<"\n";
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<2010;j++)a[i].cd[j]='U';
        cin>>s;
        a[i].id=s[0];
        for(int j=1;j<=4;j++)
        {
            cin>>s;
            a[i].cd[j]=s[0];
        }
        a[i].cs=4;a[i].hp=4;a[i].zgln=0;
        if(a[i].id=='F')fz++;
    }
    // for(int i=1;i<=n;i++)
    // {
    //     cout<<a[i].id<<" "<<a[i].hp<<" "<<a[i].cs<<" "<<a[i].zgln<<"\n";
    //     for(int j=1;j<=a[i].cs;j++)cout<<a[i].cd[j];
    //     cout<<"\n";
    // }
    // cout<<"bbbbbbbbbbbbbbbb"<<"\n";
    for(int i=2;i<=n;i++)kn[i]='U';
    kn[1]='M';
    // for(int i=1;i<=n;i++)cout<<kn[i];
    // cout<<"\n";
    for(int i=1;i<=m;i++)//初始化牌堆
    {
        // cout<<i<<"\n";
        string ss;cin>>ss;
        // cout<<s[0]<<"\n";
        // cout<<m-i+1<<"\n";
        card[m-i+1]=ss[0];
        // cout<<card[m-i+1]<<endl;
    }
    // for(int i=1;i<=m;i++)cout<<card[i]<<" ";
    // cout<<endl;
    // cout<<"ccccccccccccccccccccc"<<"\n";
    zt();
    // cout<<"ddddddddddddddddddddddd"<<"\n";
    if(a[1].hp<=0)cout<<"FP"<<endl;
    else cout<<"MP"<<endl;
    for(int i=1;i<=n;i++)
    {
        if(a[i].hp<=0){cout<<"DEAD"<<endl;}
        else
        {
            for(int j=1;j<=a[i].cs;j++)
            {
                if(a[i].cd[j]!='U')cout<<a[i].cd[j]<<" ";
            }
            cout<<endl;
        }
    }
}
signed main() 
{ 

    // ios::sync_with_stdio(false); 
    // cin.tie(0); cout.tie(0); 
    // int fuckccf=read();
    // for(int i=1;i<=tot;i++)cout<<prime[i]<<"\n";
    // int QwQ=read();
    // while(QwQ--)solve(); 
    solve(); 
    return 0; 
}
//  6666   66666  666666 
// 6    6  6   6      6 
// 6    6  6666      6 
// 6    6  6  6    6 
//  6666   6   6  6666666



完结收工!!!!!

个人主页

看完点赞,养成习惯

\(\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\)

posted @ 2025-06-22 15:50  Nightmares_oi  阅读(9)  评论(0)    收藏  举报