[SDOI2010]猪国杀

Au爷faebdc:"神犇来做猪国杀吧,我自己做太蛋疼了"

蒟蒻:"好吧"

Au爷faebdc“我过了”

蒟蒻:"......"

Au爷faebdc:"我rank1了"

蒟蒻:"......"

一天后

蒟蒻:"我过了"

Au爷faebdc:"......"

-----------------------------------------------------------------------

被机房各种神犇D,但我觉得模拟比其他(data struture)都好写多了......

太弱各种傻逼调了好久

纪念纯手写10k+

刷rank失败真是233

没什么说的了

代码太丑不想贴了

算了还是贴吧

Code:

#include <cstdio>
#include <cstring>
using namespace std;
#define N 11
#define M 2001
#define js() ((!alive) || (zgs))
struct shenfen
{
	char c[4];
	bool operator == (const shenfen &x) const
	{
		for (int i = 0;i < 4; ++i)
			if (c[i] != x.c[i])return 0;
		return 1;
	}
}zg, zc, fz, sf[N];
short alive, n, m, now, ans, tl[N] = {0}, spl[N] = {0}, spr[N] = {0}, sps[N] = {0}, num[N][100], wu1, wu2;
char c1[4], sp[N][M] = {0}, pd[M] = {0};
bool tz[N] = {0}, tf[N] = {0}, lf[N] = {0}, zb[N] = {0}, zgs(0);
const char tao = 'P', sha = 'K', shan = 'D', jd = 'F', nan = 'N', wan = 'W', wu = 'J', zhu = 'Z';
inline void yongpai(int i, char pai)
{
	if (pai == wu)
	{
		if (sf[i] == fz)wu2--;
		else	wu1--;
	}
	num[i][pai]--, sps[i]--;
	while (sp[i][spl[i]] == 0 && spl[i] < spr[i])spl[i]++;
	for (int k = spl[i];;++k)
		if (sp[i][k] == pai)
		{
			sp[i][k] = 0;
			break;
		}
	if (!sps[i])
		spl[i] = spr[i] = 0;
}
inline int target_sha(int i)
{
	int j, k;
	if (i == 1)
	{
		for (j = i+1;j <= n; ++j)
			if (tl[j])
			{
				if (lf[j] || tf[j])
					return j;
				return 0;
			}
		return 0;
	}
	if (sf[i] == zc)
	{
		for (j = i+1;j != i; ++j)
		{
			if (j > n)j = 1;
			if (tl[j])
			{
				if (tf[j])
					return j;
				return 0;
			}
		}
		return 0;
	}
	if (sf[i] == fz)
	{
		for (j = i+1;j != i; ++j)
		{
			if (j > n)j = 1;
			if (tl[j])
			{
				if (j == 1 || tz[j])
					return j;
				return 0;
			}
		}
		return 0;
	}
}
inline int target_jd(int i)
{
	int j, k;
	if (i == 1)
	{
		for (j = i+1;j <= n; ++j)
			if (tl[j] && (lf[j] || tf[j]))
				return j;
		return 0;
	}
	if (sf[i] == zc)
	{
		for (j = i+1;j != i; ++j)
		{
			if (j > n)j = 1;
			if (tl[j] && tf[j])
				return j;
		}
		return 0;
	}
	if (sf[i] == fz)
	{
		for (j = i+1;j != i; ++j)
		{
			if (j > n)j = 1;
			if (tl[j] && tz[j])
				return j;
		}
		return 0;
	}
}
inline void mo(int x, int k)
{
	if (js())return;
	while (k--)
		if (m)
		{
			if (pd[m] == wu)
			{
				if (sf[x] == fz)wu2++;
				else	wu1++;
			}
			sp[x][++spr[x]] = pd[m], num[x][pd[m]]++, sps[x]++, m -= (m > 1);
		}
}
inline void yongtao(int i)
{
	yongpai(i, tao), tl[i]++;
}
inline void diaoxie(int i)
{
	tl[i]--;
	if (!tl[i])
	{
		if (num[i][tao])
		{
			yongpai(i, tao);
			tl[i]++;
		}
		else
		{
			if (i == 1)
				zgs = 1;
			if (sf[i] == fz)
				alive--;
		}
	}
}
inline void yongshan(int i)
{
	if (num[i][shan])
		yongpai(i, shan);
	else
		diaoxie(i);
}
inline void zhushazhong()
{
	memset(sp[1], 0, sizeof(sp[1]));
	memset(num[1], 0, sizeof(num[1]));
	sps[1] = spl[1] = spr[1] = zb[1] = 0;
}
inline void yongsha(int i, int j)
{
	if (j == 1 || tz[j])tf[i] = 1;
	if (tf[j] && i != 1)tz[i] = 1, lf[i] = 0;
	if (num[i][sha])
	{
		yongpai(i, sha);
		if (j)
		{
			yongshan(j);
			if (!tl[j])
			{
				if (sf[j] == fz && alive)
					mo(i, 3);
				if (sf[j] == zc && i == 1)
					zhushazhong();
			}
		}
	}
}
inline void xunwenwuxie(int i)
{
	if (sf[i] == fz && !wu1)return;
	if (tz[i] && !wu2)return;
	for (int j = i+1;; ++j)
	{
		if (j > n)j = 1;
		if (j == i)break;
		if (!tl[j])continue;
		if (tf[i])
		{
			if ((sf[j] == zc || tz[j]) && num[j][wu])
			{
				yongpai(j, wu);
				tz[j] = 1, lf[j] = 0;
				ans ^= 1;
				xunwenwuxie(j);
				return;
			}
		}
		if (tz[i] || i == 1)
		{
			if (sf[j] == fz && num[j][wu])
			{
				yongpai(j, wu);
				tf[j] = 1;
				ans ^= 1;
				xunwenwuxie(j);
				return;
			}
		}
	}
}
inline void nanmanruqin(int i)
{
	for (int j = i+1;j != i; ++j)
	{
		if (j > n)j = 1;
		if (j == i || js())break;
		if (!tl[j])continue;
		ans = 1;
		if (j == 1 || tz[j])
		{
			if ((tz[i] || sf[i] == zc) && num[i][wu])
			{
				ans ^= 1;
				yongpai(i, wu);
				tz[i] = 1, lf[i] = 0;
				xunwenwuxie(i);
			}
			else
			{
				for (int k = i+1;k != i; ++k)
				{
					if (k > n)k = 1;
					if (k == i)break;
					if (!tl[k])continue;
					if ((tz[k] || sf[k] == zc) && num[k][wu])
					{
						ans ^= 1;
						yongpai(k, wu);
						tz[k] = 1, lf[k] = 0;
						xunwenwuxie(k);
						break;
					}
				}
			}
		}
		else
		if (tf[j])
		{
			if (sf[i] == fz && num[i][wu])
			{
				ans ^= 1;
				yongpai(i, wu);
				tf[i] = 1;
				xunwenwuxie(i);
			}
			else
			{
				for (int k = i+1;k != i; ++k)
				{
					if (k > n)k = 1;
					if (k == i)break;
					if (!tl[k])continue;
					if (sf[k] == fz && num[k][wu])
					{
						ans ^= 1;
						yongpai(k, wu);
						tf[k] = 1;
						xunwenwuxie(k);
						break;
					}
				}
			}
		}
		if (ans)
		{
			if (num[j][sha])
			{
				yongsha(j, 0);
			}
			else
			{
				diaoxie(j);
				if (!tl[j])
				{
					if (sf[j] == zc && i == 1)
						zhushazhong();
					if (sf[j] == fz && alive)
						mo(i, 3);
				}
				else
				{
					if (j == 1 && !tz[i] && !tf[i])
						lf[i] = 1;
				}
			}
		}
	}
}
inline void wanjianqifa(int i)
{
	for (int j = i+1;j != i; ++j)
	{
		if (j > n)j = 1;
		if (j == i || js())break;
		if (!tl[j])continue;
		ans = 1;
		if (j == 1 || tz[j])
		{
			if ((tz[i] || sf[i] == zc) && num[i][wu])
			{
				ans ^= 1;
				yongpai(i, wu);
				tz[i] = 1, lf[i] = 0;
				xunwenwuxie(i);
			}
			else
			{
				for (int k = i+1;k != i; ++k)
				{
					if (k > n)k = 1;
					if (k == i)break;
					if (!tl[k])continue;
					if ((tz[i] || sf[k] == zc) && num[k][wu])
					{
						ans ^= 1;
						yongpai(k, wu);
						tz[k] = 1, lf[k] = 0;
						xunwenwuxie(k);
						break;
					}
				}
			}
		}
		else
		if (tf[j])
		{
			if (sf[i] == fz && num[i][wu])
			{
				ans ^= 1;
				yongpai(i, wu);
				tf[i] = 1;
				xunwenwuxie(i);
			}
			else
			{
				for (int k = i+1;k != i; ++k)
				{
					if (k > n)k = 1;
					if (k == i)break;
					if (!tl[k])continue;
					if (sf[k] == fz && num[k][wu])
					{
						ans ^= 1;
						yongpai(k, wu);
						tf[k] = 1;
						xunwenwuxie(k);
						break;
					}
				}
			}
		}
		if (ans)
		{
			if (num[j][shan])
			{
				yongshan(j);
			}
			else
			{
				diaoxie(j);
				if (!tl[j])
				{
					if (sf[j] == zc && i == 1)
						zhushazhong();
					if (sf[j] == fz && alive)
						mo(i, 3);
				}
				else
				{
					if (j == 1 && !tz[i] && !tf[i])
						lf[i] = 1;
				}
			}
		}
	}
}
inline void juedou(int i, int j)
{
	if (num[i][jd])
	{
		yongpai(i, jd);
		if (i == 1)
		{
			if (tf[j])
			{
				ans = 1;
				for (int k = 2;k <= n; ++k)
				{
					if (!tl[k])continue;
					if (sf[k] == fz && num[k][wu])
					{
						ans ^= 1;
						yongpai(k, wu);
						tf[k] = 1;
						xunwenwuxie(k);
						break;
					}
			 	}
			 	if (!ans)
			 		return;
			}
			if (sf[j] == fz)
			{
				if (!num[j][sha])
				{
					diaoxie(j);
					if (!tl[j] && alive)
						mo(i, 3);
					return;
				}
				while (num[j][sha] && num[i][sha])
				{
					yongsha(j, 0);
					yongsha(i, 0);
					if (!num[j][sha])
					{
						diaoxie(j);
						if (!tl[j] && alive)
							mo(i, 3);
						return;
					}
					if (!num[i][sha])
					{
						diaoxie(i);
						return;
					}
				}
			}
			if (sf[j] == zc)
			{
				diaoxie(j);
				if (!tl[j])
					zhushazhong();
			}
			return;
		}
		else
		{
			if (sf[i] == zc)
			{
				tz[i] = 1, lf[i] = 0;
				ans = 1;
				for (int k = i+1;k != i; ++k)
				{
					if (k > n)k = 1;
					if (k == i)break;
					if (!tl[k])continue;
					if (sf[k] == fz && num[k][wu])
					{
						ans ^= 1;
						yongpai(k, wu);
						tf[k] = 1;
						xunwenwuxie(k);
						break;
					}
				}
				if (!ans)
					return;
			}
			if (sf[i] == fz)
			{
				tf[i] = 1;
				ans = 1;
				for (int k = i+1;k != i; ++k)
				{
					if (k > n)k = 1;
					if (i == 1)break;
					if (!tl[k])continue;
					if ((sf[k] == zc || tz[k]) && num[k][wu])
					{
						ans ^= 1;
						yongpai(k, wu);
						tz[k] = 1, lf[k] = 0;
						xunwenwuxie(k);
						break;
					}
				}
				if (!ans)
					return;
			}
			if (!num[j][sha])
			{
				diaoxie(j);
				if (!tl[j] && sf[j] == fz && alive)
					mo(i, 3);
			}
			if (num[j][sha] && !num[i][sha])
			{
				yongsha(j, 0);
				diaoxie(i);
				if (!tl[i] && sf[i] == fz && alive)
					mo(j, 3);
			}
			while (num[j][sha] && num[i][sha])
			{
				yongsha(j, 0);
				yongsha(i, 0);
				if (!num[j][sha])
				{
					diaoxie(j);
					if (!tl[j] && sf[j] == fz && alive)
						mo(i, 3);
					continue;
				}
				if (!num[i][sha])
				{
					diaoxie(i);
					if (!tl[i] && sf[i] == fz && alive)
						mo(j, 3);
					continue;
				}
			}
		}
	}
}
inline void chu(int i, int s1)
{
	int j, k, u, s(0);
	while (sp[i][spl[i]] == 0)spl[i]++;
	for (u = spl[i];u <= spr[i]; ++u)
	{
		if (sp[i][u] == 0 || sp[i][u] == wu || sp[i][u] == shan)continue;
		if (sp[i][u] == tao)
		{
			if (tl[i] < 4)
				yongtao(i);
			continue;
		}
		if (sp[i][u] == nan)
		{
			yongpai(i, nan);
			nanmanruqin(i);
			if(js())return;
			if (sps[i])
			{
				chu(i, s+s1);
				return;
			}
			continue;
		}
		if (sp[i][u] == wan)
		{
			yongpai(i, wan);
			wanjianqifa(i);
			if(js())return;
			if (sps[i])
			{
				chu(i, s+s1);
				return;
			}
			continue;
		}
		if (sp[i][u] == zhu)
		{
			zb[i] = 1;
			yongpai(i, zhu);
			if (num[i][sha])
			{
				if (sps[i])
				{
					chu(i, s+s1);
					return;
				}	
			}
			continue;
		}
		if (sp[i][u] == sha)
		{
			if (!zb[i] && !s1 && !s)
			{
				j = target_sha(i);
				if (j)
				{
					s = 1;
					yongsha(i, j);
					if(js())return;
				}
				continue;
			}
			if (zb[i])
			{
				j = target_sha(i);
				if (j)
					yongsha(i, j);
				if(js())return;
				continue;
			}
		}
		if (sp[i][u] == jd)
		{
			if (sf[i] == fz)
				j = 1;
			else
				j = target_jd(i);
			if (j)
			{
				juedou(i, j);
				if (!tl[i])return;
				if(js())return;
				if (sps[i])
				{
					chu(i, s+s1);
					return;
				}
			}
			continue;
		}
	}
}
int main()
{
	int i, j, k, l;
	zg.c[0] = 'M', zg.c[1] = 'P';
	zc.c[0] = 'Z', zc.c[1] = 'P';
	fz.c[0] = 'F', fz.c[1] = 'P';
	scanf("%d %d ", &n, &m);
	for (i = 1;i <= n; ++i)
	{
		scanf("%s", sf[i].c);
		if (sf[i] == fz)
			alive++;
		tl[i] = spr[i] = sps[i] = 4;
		spl[i] = 1;
		for (j = 1;j <= 4; ++j)
		{
			scanf("%s", c1);
			if (c1[0] == 'P'){now = tao, sp[i][j] = now, num[i][now]++;}
			if (c1[0] == 'K'){now = sha, sp[i][j] = now, num[i][now]++;}
			if (c1[0] == 'D'){now = shan, sp[i][j] = now, num[i][now]++;}
			if (c1[0] == 'F'){now = jd, sp[i][j] = now, num[i][now]++;}
			if (c1[0] == 'N'){now = nan, sp[i][j] = now, num[i][now]++;}
			if (c1[0] == 'W'){now = wan, sp[i][j] = now, num[i][now]++;}
			if (c1[0] == 'J'){now = wu, sp[i][j] = now, num[i][now]++;}
			if (c1[0] == 'Z'){now = zhu, sp[i][j] = now, num[i][now]++;}
		}
		if (sf[i] == fz)wu2 += num[i][wu];
		else wu1 += num[i][wu];
	}
	for (i = m;i >= 1; --i)
	{
		c1[0] = getchar();
		while (c1[0] == ' ' || c1[0] == '\n')c1[0] = getchar();
		if (c1[0] == 'P'){now = tao, pd[i] = now;}
		if (c1[0] == 'K'){now = sha, pd[i] = now;}
		if (c1[0] == 'D'){now = shan, pd[i] = now;}
		if (c1[0] == 'F'){now = jd, pd[i] = now;}
		if (c1[0] == 'N'){now = nan, pd[i] = now;}
		if (c1[0] == 'W'){now = wan, pd[i] = now;}
		if (c1[0] == 'J'){now = wu, pd[i] = now;}
		if (c1[0] == 'Z'){now = zhu, pd[i] = now;}
	}
	tz[1] = 1;
	for (i = 1;;i = (i == n) ? 1 : ++i)
	{
		if (js()){break;}
		if (!tl[i]){continue;}
		mo(i, 2);
		if (!sps[i]){continue;}
		chu(i, 0);
	}
	if(zgs)
		puts("FP");
	else
		puts("MP");
	for (i = 1;i <= n; ++i)
	{
		if (tl[i])
		{
			if (sps[i])
			{
				while (sp[i][spl[i]] == 0)spl[i]++;
				putchar(sp[i][spl[i]]);
				for (j = spl[i]+1;j <= spr[i]; ++j)
				{
					if (sp[i][j] == 0)
						continue;
					putchar(32), putchar(sp[i][j]);
				}
			}
			if (i < n)
				puts("");
		}
		else
			if (i < n)
				puts("DEAD");
			else
				printf("DEAD");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值