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\)

浙公网安备 33010602011771号