求助 55pts
查看原帖
求助 55pts
169480
Hencecho楼主2021/7/31 20:29
#include<bits/stdc++.h>
using namespace std;
int cn['Z'+100];
char nc[400];
struct Pig
{
	int hp,sf1,sf2;
	int nxt;
	int ln;
	int alive;
	int flag[9];
	queue <int> p[9];
}p[20];
int pk[20100],cnt;
int n,m;
queue <int> zer;
inline void yuchuli()
{
	cn['P']=1;
	cn['K']=2;
	cn['D']=3;
	cn['F']=4;
	cn['N']=5;
	cn['W']=6;
	cn['J']=7;
	cn['Z']=8;
	
	nc[1]='P';
	nc[2]='K';
	nc[3]='D';
	nc[4]='F';
	nc[5]='N';
	nc[6]='W';
	nc[7]='J';
	nc[8]='Z';
	
	for (int i=1;i<=13;i++)
	p[i].hp=4;
	return ;
}
inline void add(int i)
{
	cnt++;
	p[i].p[pk[min(cnt,m)]].push(cnt);
	
}
inline int del(int u)
{
	int maxx=0x3f3f3f3f,maxn=-1;
	for (int i=1;i<=8;i++)
	if (p[u].flag[i]==1 && !p[u].p[i].empty() && p[u].p[i].front()<maxx) 
	{
		maxx=p[u].p[i].front();
		maxn=i;
	}
	if (maxn==-1) return 0;
	p[u].p[maxn].pop();
	p[u].flag[maxn]=0;
	return maxn;
}
inline void read()
{
	scanf("%d%d",&n,&m);
	int j=0;
	for (int i=1;i<=n;i++) p[i].nxt=i+1;
	p[n].nxt=1;
	for (int i=1;i<=n;i++)
	{
		string a;
		cin>>a;
		if (a=="MP") p[i].sf1=1,p[i].sf2=1;else
		if (a=="ZP") p[i].sf1=1;else
		if (a=="FP") p[i].sf1=2;
		for (int i1=1;i1<=4;i1++)
		{
			char b;
			j++;
			m++;
			cin>>b;
			//scanf("%c",&b);
			pk[j]=cn[int(b)];
			add(i);
		}
	}
	j++;
	for (;j<=m;j++)
	{
		char b;
		cin>>b;
		//scanf("%c",&b);
		pk[j]=cn[int(b)];
	}
}
inline void win_lose()
{

	if (p[1].alive==1)
	{
		puts("FP");
		for (int i=1;i<=n;i++)
		{
			
			if (p[i].alive==1) puts("DEAD");
			else 
			{	
				int qaq;
				for (int j=1;j<=8;j++) p[i].flag[j]=1;
				for (;;)
				{
					
					qaq=del(i);
					p[i].flag[qaq]=1;
					if (qaq==0) break;
					putchar(nc[qaq]);
					putchar(' ');
				//	cout<<nc[qaq]<<" ";
				}
				puts("");
			}
		}
		exit(0);
	}
	for (int i=1;i<=n;i++)
	{
		if (p[i].alive==0 && p[i].sf1==2)
		return ;
	}
	puts("MP");
	for (int i=1;i<=n;i++)
	{
		if (p[i].alive==1) puts("DEAD");
		else 
		{
			
			int qaq;
			for (int j=1;j<=8;j++) p[i].flag[j]=1;
			for (;;)
			{
				
				qaq=del(i);
				p[i].flag[qaq]=1;
				if (qaq==0) break;
				putchar(nc[qaq]);
				putchar(' ');
			}
			puts("");
		}
	}
	exit(0);

}
inline void GG(int u,int v)
{
	if (p[u].alive==1) return ;
	
	while (p[u].hp<=0 && !p[u].p[cn['P']].empty()) 
	{
		p[u].p[cn['P']].pop();
		p[u].hp++;
	//	return ;
	}
	if (p[u].hp>=1) return ;
//	cout<<u<<" "<<v;
	if (p[u].hp<=0) p[u].alive=1;
	for (int i=1;i<=n;i++)
	if (p[i].nxt==u) p[i].nxt=p[u].nxt;
	win_lose();
	
	if (v==1 && p[u].sf1==1)
	{
		for (int i=1;i<=8;i++) p[v].p[i]=zer;
		p[v].ln=0;
	}
	if (p[u].sf1==2)
	{
		add(v);
		add(v);
		add(v);
	}
}
inline int dy(int u,int v)
{
	if (p[v].sf2==0) return 0;
	if (p[v].sf2==3 && u!=1) return 0;
	if (p[v].sf2==3 && u==1) return 2;
	if (p[u].sf1==p[v].sf2) return 1;
	if (p[u].sf1!=p[v].sf2) return 2;
}
inline void kil(int u,int v)
{
    p[u].sf2=p[u].sf1;
	if (!p[v].p[cn['D']].empty()) 
	{
		p[v].p[cn['D']].pop();
		return ;
	}
	p[v].hp--;
	GG(v,u);
	return ; 
}
inline void peach(int i)
{
	p[i].hp++;
	return ;
}
inline void zg(int u)
{
	if(p[u].hp<4) p[u].flag[cn['P']]=1;else p[u].flag[cn['P']]=0;
	
	if (dy(u,p[u].nxt)!=2) p[u].flag[cn['K']]=0;
	
	
	p[u].flag[cn['D']]=0;
	
	p[u].flag[cn['F']]=0;
	if (p[u].sf1==2) p[u].flag[cn['F']]=1;else
	if (p[u].sf1==1)
	{
		for (int i=p[u].nxt;i!=u;i=p[i].nxt)
		if (dy(u,i)==2) p[u].flag[cn['F']]=1;
	}
	
	
	p[u].flag[cn['N']]=1;
	p[u].flag[cn['W']]=1;
	p[u].flag[cn['J']]=0;
	p[u].flag[cn['Z']]=1;
}
inline bool wx(int u)
{
	
	if (p[u].p[7].empty()) return 0;
	p[u].p[7].pop();
	p[u].sf2=p[u].sf1;
	for (int i=p[u].nxt;i!=u;i=p[i].nxt)
	{
		if (dy(i,u)==2)
		{
		//	cout<<u<<endl;
			if (wx(i)==1) return 0;
		}
	//	cout<<u<<" ";
	}

	return 1;
}
inline void jd(int u)
{
	int v=0;
//	p[u].sf2=p[u].sf1;
	for (int i=p[u].nxt;i!=u;i=p[i].nxt)
	if (dy(u,i)==2){v=i;break;}
	if (p[u].sf1==2) v=1;
	
	for (int i=p[u].nxt;i!=u;i=p[i].nxt)
	if (dy(i,v)==1){if (wx(i)) return ;}
	if (u==1 && p[v].sf1==1) 
	{
		p[v].hp--;
		GG(v,u);
		return ;
	}
	for (;;)
	{
		if (p[v].p[2].empty())
		{
			p[u].sf2=p[u].sf1;
			p[v].hp--;
			GG(v,u);
			return ;
		}else
		p[v].p[2].pop();
		
		if (p[u].p[2].empty())
		{
			p[v].sf2=p[v].sf1;
			p[u].hp--;
			GG(u,v);
			return ;
		}else
		p[u].p[2].pop();
	}
}
inline void nm(int u)
{
	for (int i=p[u].nxt;i!=u;i=p[i].nxt)
	{
		
		bool qaqq=0;
		if (dy(u,i)==1) qaqq=wx(u);
		for (int j=p[u].nxt;j!=u && qaqq==0;j=p[j].nxt)
		if (dy(j,i)==1) qaqq=wx(j);
		if (qaqq) continue;
		if (p[i].p[2].empty())
		{
			if (i==1 && p[u].sf2==0) p[u].sf2=3;
			p[i].hp--;
			GG(i,u);
		}else p[i].p[2].pop();
	}

}
inline void wj(int u)
{
	for (int i=p[u].nxt;i!=u;i=p[i].nxt)
	{
		bool qaqq=0;
		if (dy(u,i)==1) qaqq=wx(u);
		for (int j=p[u].nxt;j!=u && qaqq==0;j=p[j].nxt)
		if (dy(j,i)==1) qaqq=wx(j);
		if (qaqq) continue;
		if (p[i].p[3].empty())
		{
			if (i==1 && p[u].sf2==0) p[u].sf2=3;
			p[i].hp--;
			GG(i,u);
		}else p[i].p[3].pop();
	}

}
inline void huihe(int u)
{
	if (p[u].alive==1) return ;
	add(u);
	add(u);
	p[u].flag[cn['K']]=1;
	int nowa=0;
	while(1)
	{
		if (p[u].ln==1) p[u].flag[cn['K']]=1;
		zg(u);
		nowa=del(u);
		if (nowa==1) peach(u);else 
		if (nowa==2) kil(u,p[u].nxt);else
		if (nowa==4) jd(u);else
		if (nowa==5) nm(u);else
		if (nowa==6) wj(u);else
        if (nowa==8) p[u].ln=1;else
		return ;
	}
}
int main()
{
	yuchuli();
	read();
//	yuchuli1();
	for (;;)
	{
		for (int i=1;i<=n;i++)
		{
			huihe(i);
//			check();
		}
	}
	return 0;
}
2021/7/31 20:29
加载中...