社区讨论

只A了#4#5,求调,其他全RE

P2482[SDOI2010] 猪国杀参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mdle2tiu
此快照首次捕获于
2025/07/27 16:00
7 个月前
此快照最后确认于
2025/07/27 20:42
7 个月前
查看原帖
在猪国杀(超多样例调试版)里的所有样例本地都跑过了,但交上去全RE,只A了两个点10分
CPP
#include<bits/stdc++.h>
#define int int
#define rep(i,x,y) for(register int i=x;i<=y;++i)
#define ref(i,x,y) for(register int i=x;i>=y;--i)
#define rek(i,x,y) for(register int i=x;i<y;++i)
using namespace std;
#define endl '\n'
int T,n,m,cnt;
int mu_biao;
int ren_shu;
int lun_dao;
int shang_shai;
int fan_zhu_shu_liang;
char pai_dui[2005];
/*
tao P
sha K
shan D
jue_dou F
wu_xie_ke_ji J
nan_zhu_ru_qin N
wan_jian_qi_fa W
zhu_ge_lian_nu Z
*/
struct Pig
{
    int left;
    int right;
    int xue_liang;
    bool tiao_fan;
    bool tiao_zhong;
    bool lei_fan_zhu;
    bool zhu_ge_lian_nu;
    bool si_wang_pan_duan;
    string shen_fen;
    vector<char> shou_pai;
    Pig(){xue_liang=4,zhu_ge_lian_nu=si_wang_pan_duan=tiao_zhong=tiao_fan=0;}
};
Pig p[15];
void game_over()
{
    if(p[1].si_wang_pan_duan)
    {
        cout<<"FP\n";
        rep(i,1,n)
        {
            if(p[i].si_wang_pan_duan) cout<<"DEAD";
            else for(auto v:p[i].shou_pai) cout<<v<<" ";
            cout<<'\n';
        }
    }
    else 
    {
        cout<<"MP\n";
        rep(i,1,n)
        {
            if(p[i].si_wang_pan_duan) cout<<"DEAD";
            else for(auto v:p[i].shou_pai) cout<<v<<" ";
            cout<<'\n';
        }
    }
    exit(0);
}
void zhu_ge_lian_nu(int x)
{
    p[x].zhu_ge_lian_nu=1;
    // cout<<x<<"-->诸葛连弩\n";
}
void si_wang(int x,int lai_yuan)
{
    // cout<<x<<"阵亡,是"<<lai_yuan<<"杀的\n";
    p[x].si_wang_pan_duan=1;
    if(p[x].shen_fen=="MP") game_over();
    if(p[x].shen_fen=="FP") 
    {
        fan_zhu_shu_liang--;
        if(fan_zhu_shu_liang==0) game_over();
        // cout<<lai_yuan<<"击杀反贼,摸三张牌\n";
        // cout<<lai_yuan<<"摸到"<<pai_dui[cnt+1]<<'\n';
        p[lai_yuan].shou_pai.push_back(pai_dui[++cnt]),cnt-=(cnt==m);
        // cout<<lai_yuan<<"摸到"<<pai_dui[cnt+1]<<'\n';
        p[lai_yuan].shou_pai.push_back(pai_dui[++cnt]),cnt-=(cnt==m);
        // cout<<lai_yuan<<"摸到"<<pai_dui[cnt+1]<<'\n';
        p[lai_yuan].shou_pai.push_back(pai_dui[++cnt]),cnt-=(cnt==m);
    }
    if(p[x].shen_fen=="ZP"&&p[lai_yuan].shen_fen=="MP") 
    {
        // cout<<"主公击杀忠臣,弃置所有手牌\n";
        while(p[lai_yuan].shou_pai.size()>0) p[lai_yuan].shou_pai.pop_back();
        p[lai_yuan].zhu_ge_lian_nu=0;
    }
    int l=p[x].left,r=p[x].right;
    p[l].right=r,p[r].left=l,p[x].si_wang_pan_duan=1;
    return;
}
void shou_shang(int x,int lai_yuan)
{
    --p[x].xue_liang;
    // cout<<x<<"受伤,来源是"<<lai_yuan<<",血量"<<p[x].xue_liang+1<<"-->"<<p[x].xue_liang<<"\n";
    if(p[x].xue_liang==0)
    {
        int flag=1;
        rek(i,0,p[x].shou_pai.size())
        {
            int pai=p[x].shou_pai[i];
            if(pai=='P')
            {
                // cout<<x<<"吃了一颗桃,血量"<<p[x].xue_liang<<"-->"<<p[x].xue_liang+1<<"\n";
                flag=0,p[x].shou_pai.erase(p[x].shou_pai.begin()+i);
                break;
            } 
        }
        if(flag) si_wang(x,lai_yuan);
        else ++p[x].xue_liang;
    }
    return;
}
bool you_wu_xie_ke_ji(int x)
{
    rek(i,0,p[x].shou_pai.size())
    {
        int pai=p[x].shou_pai[i];
        if(pai=='J') return 1;
    }
    return 0;
}
bool chu_wu_xie_ke_ji(int x)
{
    rek(i,0,p[x].shou_pai.size())
    {
        int pai=p[x].shou_pai[i];
        if(pai=='J') return p[x].shou_pai.erase(p[x].shou_pai.begin()+i),1;
    }
    return 0;
}
bool wu_xie_ke_ji(int x,int zhuang_tai,int lai_yuan)
{
    int flagggg=1;
    rep(i,1,n) if(you_wu_xie_ke_ji(i)) flagggg=0;
    if(flagggg) return zhuang_tai;
    int k=lai_yuan,flag=0;
    while(k!=lai_yuan||flag==0)
    {
        if(k==lai_yuan&&flag==1) break;
        if(!you_wu_xie_ke_ji(k)||p[k].si_wang_pan_duan)
        {
            k=p[k].right,flag=1;
            continue;
        }
        if(p[x].tiao_zhong&&(p[k].shen_fen=="ZP"||p[k].shen_fen=="MP")&&zhuang_tai==1||p[x].tiao_fan&&p[k].shen_fen=="FP"&&zhuang_tai==1||p[x].tiao_fan&&(p[k].shen_fen=="ZP"||p[k].shen_fen=="MP")&&zhuang_tai==0||p[x].tiao_zhong&&p[k].shen_fen=="FP"&&zhuang_tai==0||p[x].lei_fan_zhu&&p[k].shen_fen=="MP"&&zhuang_tai==0) break;
        k=p[k].right,flag=1;
    }
    if(k!=lai_yuan||(k==lai_yuan&&flag==0))
    {
        // cout<<k<<"使用了一张无懈可击\n";
        if(zhuang_tai)
        {
            if(p[x].tiao_zhong) 
            {
                p[k].tiao_zhong=1,p[k].tiao_fan=p[k].lei_fan_zhu=0;
                // cout<<k<<"跳忠\n";
            }
            if(p[x].tiao_fan) 
            {
                p[k].tiao_fan=1;
                // cout<<k<<"跳反\n";
            }
        }
        else 
        {
            if(p[x].tiao_zhong) 
            {
                p[k].tiao_fan=1;
                // cout<<k<<"跳反\n";
            }
            if(p[x].tiao_fan) 
            {
                p[k].tiao_zhong=1,p[k].tiao_fan=p[k].lei_fan_zhu=0;
                // cout<<k<<"跳忠\n";
            }
        }
        chu_wu_xie_ke_ji(k);
        return wu_xie_ke_ji(x,!zhuang_tai,k);
    }
    else return zhuang_tai;
}
bool tao(int x)
{
    if(p[x].xue_liang<4)
    { 
        // cout<<x<<"吃了一颗桃,血量"<<p[x].xue_liang<<"-->"<<p[x].xue_liang+1<<"\n";
        return ++p[x].xue_liang,1;
    }
    else return 0;
}
bool chu_shan(int x)
{
    rek(i,0,p[x].shou_pai.size())
    {
        int pai=p[x].shou_pai[i];
        if(pai=='D')
        {
            // cout<<x<<"出了一张闪\n";
            return p[x].shou_pai.erase(p[x].shou_pai.begin()+i),1;
        }
    }
    return 0;
}
bool chu_sha(int x)
{
    rek(i,0,p[x].shou_pai.size())
    {
        int pai=p[x].shou_pai[i];
        if(pai=='K') 
        {
            // cout<<x<<"出了一张杀\n";
            return p[x].shou_pai.erase(p[x].shou_pai.begin()+i),1;
        }
    }
    return 0;
}
bool sha(int x,int ii)
{
    int k=p[x].right;
    if(!(p[k].tiao_fan&&(p[x].shen_fen=="ZP"||p[x].shen_fen=="MP")||p[k].tiao_zhong&&p[x].shen_fen=="FP"||p[k].lei_fan_zhu&&p[x].shen_fen=="MP")) return 0;
    // cout<<x<<"杀-->"<<k<<endl;
    p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+ii);
    if(p[k].tiao_fan) 
    {
        p[x].tiao_zhong=1,p[x].tiao_fan=p[x].lei_fan_zhu=0;
        // cout<<x<<"跳忠\n";
    }
    if(p[k].tiao_zhong) 
    {
        p[x].tiao_fan=1;
        // cout<<x<<"跳反\n";
    }
    if(!chu_shan(k)) shou_shang(k,x),shang_shai=1;
    return 1;
}
bool jue_dou(int x,int ii)
{
    int k=p[x].right;
    while(k!=x)
    {
        if(p[k].si_wang_pan_duan)
        {
            k=p[k].right;
            continue;
        }
        if(p[k].tiao_fan&&(p[x].shen_fen=="ZP"||p[x].shen_fen=="MP")||p[k].tiao_zhong&&p[x].shen_fen=="FP"||p[x].shen_fen=="MP"&&p[k].lei_fan_zhu) break;
        k=p[k].right;
    }
    if(k==x) return 0;
    if(p[x].shen_fen=="FP") k=1;
    p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+ii);
    // cout<<x<<"决斗-->"<<k<<endl;
    if(p[k].tiao_fan) 
    {
        p[x].tiao_zhong=1,p[x].tiao_fan=p[x].lei_fan_zhu=0;
        // cout<<x<<"跳忠\n";
    }
    if(p[k].tiao_zhong) 
    {
        p[x].tiao_fan=1;
        // cout<<x<<"跳反\n";
    }
    if(!wu_xie_ke_ji(k,1,x)) return 1;
    int id=k;
    if(p[x].shen_fen=="MP"&&p[k].shen_fen=="ZP") return shou_shang(k,x),1;
    while(chu_sha(id)) id=id==k?x:k;
    return shou_shang(id,id==k?x:k),shang_shai=1;
}
bool nan_zhu_ru_qin(int x,int ii)
{
    // cout<<x<<"使用南蛮入侵\n";
    p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+ii);
    rep(i,x+1,n)
    {
        if(p[i].si_wang_pan_duan) continue;
        if(!wu_xie_ke_ji(i,1,x)) continue;
        if(chu_sha(i)) continue;
        else 
        {
            shou_shang(i,x),shang_shai=1;
            if(i==1&&p[x].tiao_zhong==0) 
            {
                p[x].lei_fan_zhu=1;
                // cout<<x<<"跳类反\n";
            }
        }
    }
    rep(i,1,x-1)
    {
        if(p[i].si_wang_pan_duan) continue;
        if(!wu_xie_ke_ji(i,1,x)) continue;
        if(chu_sha(i)) continue;
        else 
        {
            shou_shang(i,x),shang_shai=1;
            if(i==1&&p[x].tiao_zhong==0) 
            {
                p[x].lei_fan_zhu=1;
                // cout<<x<<"跳类反\n";
            }
        }
    }
}
bool wan_jian_qi_fa(int x,int ii)
{
    // cout<<x<<"使用万箭齐发\n";
    p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+ii);
    rep(i,x+1,n)
    {
        if(p[i].si_wang_pan_duan) continue;
        if(!wu_xie_ke_ji(i,1,x)) continue;
        if(chu_shan(i)) continue;
        else 
        {
            shou_shang(i,x),shang_shai=1;
            if(i==1&&p[x].tiao_zhong==0) 
            {
                p[x].tiao_fan=1;
                // cout<<x<<"跳反\n";
            }
        }
    }
    rep(i,1,x-1)
    {
        if(p[i].si_wang_pan_duan) continue;
        if(!wu_xie_ke_ji(i,1,x)) continue;
        if(chu_shan(i)) continue;
        else 
        {
            shou_shang(i,x),shang_shai=1;
            if(i==1&&p[x].tiao_zhong==0) 
            {
                p[x].tiao_fan=1;
                // cout<<x<<"跳反\n";
            }
        }
    }
}
signed main()
{
    cin>>n>>m,ren_shu=n,p[1].left=n,p[1].right=2,p[n].left=n-1,p[n].right=1,p[1].tiao_zhong=1;
    rep(i,1,n+1) 
    {
        string jue_se;
        getline(cin,jue_se);
        if(!(i-1)) continue;
        if(jue_se[0]=='M') p[i-1].shen_fen="MP";
        if(jue_se[0]=='Z') p[i-1].shen_fen="ZP";
        if(jue_se[0]=='F') p[i-1].shen_fen="FP";
        fan_zhu_shu_liang+=(p[i-1].shen_fen=="FP"),p[i-1].shou_pai.push_back(jue_se[3]),p[i-1].shou_pai.push_back(jue_se[5]),p[i-1].shou_pai.push_back(jue_se[7]),p[i-1].shou_pai.push_back(jue_se[9]);
    }
    rek(i,2,n) p[i].left=i-1,p[i].right=i+1;
    string s;
    getline(cin,s);
    rek(i,0,s.size()) if(s[i]!=' ') pai_dui[++cnt]=s[i];
    cnt=0,lun_dao=1;
    while(!p[1].si_wang_pan_duan&&fan_zhu_shu_liang>0)
    {
        if(p[lun_dao].si_wang_pan_duan)
        {
            lun_dao=lun_dao%n+1;
            continue;
        }
        // cout<<lun_dao<<"摸到"<<pai_dui[cnt+1]<<'\n';
        p[lun_dao].shou_pai.push_back(pai_dui[++cnt]),cnt-=(cnt==m);
        // cout<<lun_dao<<"摸到"<<pai_dui[cnt+1]<<'\n';
        p[lun_dao].shou_pai.push_back(pai_dui[++cnt]),cnt-=(cnt==m);
        int chu_sha_ci_shu=0;
        if(p[lun_dao].shou_pai.size()==0)
        {
            lun_dao=p[lun_dao].right;
            continue;
        }
        rek(i,0,p[lun_dao].shou_pai.size())
        {
            if(p[lun_dao].shou_pai.empty()||p[lun_dao].si_wang_pan_duan) break;
            char pai=p[lun_dao].shou_pai[i];
            if(pai=='P') if(tao(lun_dao)) p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+i),i=-1;
            if(pai=='K') if((chu_sha_ci_shu<1||p[lun_dao].zhu_ge_lian_nu==1)&&sha(lun_dao,i)) ++chu_sha_ci_shu,i=-1;
            if(pai=='F') if(jue_dou(lun_dao,i)) i=-1;
            if(pai=='N') if(nan_zhu_ru_qin(lun_dao,i)) i=-1;
            if(pai=='W') if(wan_jian_qi_fa(lun_dao,i)) i=-1;
            if(pai=='Z') zhu_ge_lian_nu(lun_dao),p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+i),i=-1;
        }
        lun_dao=p[lun_dao].right;
    }
    game_over();
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...