洛谷ide 30ms,本地50ms ,交上去tle?
查看原帖
洛谷ide 30ms,本地50ms ,交上去tle?
551133
liuliucy楼主2024/7/22 07:34

rt

我去linux也跑了一遍,跑的飞快,为什么T了。

#include<bits/stdc++.h>
using namespace std;
int n,m;
queue<char>q;//牌堆
string c[101];//手牌
int nam[101];//身份
int hp[101];//血量
bool zg[101];//是否有诸葛
int sn[101];//闪数量
int sa[101];//杀数量
int zt[101];//-2类反 -1反 0无 1忠
int fz;//反猪数量
void mopai(int nw,int num)//摸牌
{
	for(int i=0;i<num;i++){
		char x=q.front();
		c[nw]+=x;
		if(x=='K')sa[nw]++;
		if(x=='D')sn[nw]++;
		q.pop();
		if(q.empty())q.push(x);
	}
	return;
}
bool check(char ch,int nw){
	return ch=='K'||ch=='P'&&hp[nw]<4||ch=='F'||ch=='N'||ch=='W'||ch=='Z';
}
int dis[101];//距离
bool ded[101];//是否死亡
void jiesuan(int x)//结算
{
	if(x==-1){
		printf("FP\n");
	}
	else printf("MP\n");
	for(int i=1;i<=n;i++){
		if(ded[i]){
			printf("DEAD\n");
			continue;
		}
		else{
			for(int j=0;j<c[i].size();j++){
				char p=c[i][j];
				printf("%c",p);
				if(j!=c[i].size()-1)putchar(' ');
			}
			putchar('\n');
		}
	}
	exit(0);
}
int dd;
void kil(int nw,int i){//nw干掉了i
	ded[i]=1;
	dd--;
	if(nam[i]==0)jiesuan(-1);
	if(nam[nw]==0&&nam[i]==1){
		zg[nw]=sa[nw]=sn[nw]=0;
		c[nw].clear();
	}
	else if(nam[i]==-1){
		mopai(nw,3);
		fz--;
		if(fz==0)jiesuan(1);
	}
	for(int j=i-1;j;j--)dis[j]--;
	return;
}
void wuxie(int i,int j,bool &use){
	if((int)c[i].find("J")==-1)return;
	if(use){
		if(nam[i]>=0&&zt[j]==1){
			use^=1;
			zt[i]=1;
			c[i].erase(c[i].find('J'));	
		}
		if(nam[i]==-1&&zt[j]==-1){
			use^=1;
			zt[i]=-1;
			c[i].erase(c[i].find('J'));	
		}
	}
	else{
		if(nam[i]==0&&zt[j]<=-1||nam[i]==1&&zt[j]==-1){
			use^=1;
			zt[i]=1;
			c[i].erase(c[i].find('J'));	
		}
		else if(nam[i]==-1&&zt[j]==1){
			use^=1;
			zt[i]=-1;
			c[i].erase(c[i].find('J'));	
		}
	}
	return;
}
void use1(int x,bool p)//0-万剑 1-南猪
{
	for(int step=1;step<n;step++){
		int i=(x+step-1)%n+1;
		if(x==i)continue;
		if(ded[i])continue;
		bool use=1,xian=0;
		for(int stp=0;stp<n;stp++){
			int j=(i+stp-1)%n+1;
			wuxie(j,i,use);
		}
		if(!use)continue;
		if(p){
			if(sa[i]){
				sa[i]--;
				c[i].erase(c[i].find("K"),1);
			}
			else{
				hp[i]--;
				if(nam[i]==0&&zt[x]==0)zt[x]=-2;
				if(hp[i]==0&&(int)c[i].find("P")!=-1){
					c[i].erase(c[i].find("P"),1);
					hp[i]++;
				}
				else if(hp[i]==0){
					kil(x,i);
				}
			}
		}
		else{
			if(sn[i]){
				sn[i]--;
				if(nam[i]==0&&zt[x]==0)zt[x]=-2;
				c[i].erase(c[i].find("D"),1);
			}
			else{
				hp[i]--;
				if(hp[i]==0&&(int)c[i].find("P")!=-1){
					c[i].erase(c[i].find("P"),1);
					hp[i]++;
				}
				else if(hp[i]==0){
					kil(x,i);
				}
			}
		}
	}
}
int fd(int nw,int p){
	if(nam[nw]==-1){
		for(int i=1;i<=n;i++){
			if(i==nw)continue;
			if((dis[nw]-dis[i]+dd)%dd>1&&p==1)continue;	
			if(nam[i]==0)return i;
		}
		return -1;
	}
	if(p==-1){
		for(int i=1;i<=n;i++){
			if(i==nw)continue;
//			if((dis[nw]-dis[i]+dd)%dd>1)continue;	
			if(zt[i]==1&&nam[nw]==-1)return i;		
			if(zt[i]<0&&nam[nw]==0)return i;
			if(zt[i]==-1&&nam[nw]==1)return i;
		}
		return -1;
	}	
	for(int i=1;i<=n;i++){
		if(i==nw)continue;
		if((dis[nw]-dis[i]+dd)%dd>1)continue;
		if(nam[nw]==0){
			if(zt[i]<0)return i;
		}
		else{
			if(zt[i]==-1&&nam[nw]==1||zt[i]==1&&nam[nw]==-1){
				return i;
			}
		}
	}
	return -1;
}
void juedou(int a,int b)//决斗
{
	if(zt[a]==1)zt[b]=-1;
	if(zt[a]==-1)zt[b]=1;
	bool use=1;
	for(int stp=0;stp<n;stp++){
		int j=(a+stp-1)%n+1;
		wuxie(j,a,use);
	}
	if(!use)return;
	if(nam[a]==1&&nam[b]==0){
		hp[a]--;
		if(hp[a]==0&&(int)c[a].find("P")!=-1){
			c[a].erase(c[a].find("P"),1);
			hp[a]++;
		}
		else if(hp[a]==0){
			kil(b,a);
		}
		return;
	}
	bool nw=1;
	while(1){
		if(nw){
			if(sa[a]){
				sa[a]--;
				c[a].erase(c[a].find("K"),1);
			}
			else{
				hp[a]--;
				if(hp[a]==0&&(int)c[a].find("P")!=-1){
					c[a].erase(c[a].find("P"),1);
					hp[a]++;
				}
				else if(hp[a]==0){
					kil(b,a);
				}
				return;
			}
		}
		else{
			if(sa[b]){
				sa[b]--;
				c[b].erase(c[b].find("K"),1);
			}
			else{
				hp[b]--;
				if(hp[b]==0&&(int)c[b].find("P")!=-1){
					c[b].erase(c[b].find("P"),1);
					hp[b]++;
				}
				else if(hp[b]==0){
					kil(a,b);
				}
				return;
			}			
		} 
		nw^=1;
	}
}
int roud;
void ssa(int x,int y){
	if(zt[y]==-1)zt[x]=1;
	if(zt[y]==1)zt[x]=-1;
	if((int)c[y].find("D")!=-1){
		sn[y]--;
//		printf("%d : %d:",roud,y);
//		for(int i=0;i<c[y].size();i++)printf("%c ",c[y][i]);
//		putchar('\n');
		c[y].erase(c[y].find("D"),1);
	}
	else{
		hp[y]--;
		if(hp[y]==0&&(int)c[y].find("P")!=-1){
			c[y].erase(c[y].find("P"),1);
			hp[y]++;
		}
		else if(hp[y]==0){
			kil(x,y);
		}		
	}
}
int main(){
//	freopen("1.in","r",stdin);
//	freopen("2.out","w",stdout);
//	scanf("%d%d",&n,&m);
	cin>>n>>m;
	dd=n;
	for(int i=1;i<=n;i++){
		char ch1,ch2;hp[i]=4;
		dis[i]=n-i;
		scanf("%c",&ch1);
		while(ch1==' '||ch1=='\n')scanf("%c",&ch1);
		scanf("%c",&ch2);
		if(ch1=='M'&&ch2=='P')nam[i]=0,zt[i]=1;//主
		if(ch1=='Z'&&ch2=='P')nam[i]=1;//忠
		if(ch1=='F'&&ch2=='P')nam[i]=-1,fz++;//反
		for(int j=1;j<=4;j++){
			char chh;
			chh=getchar();
			while(chh==' '||chh=='\n')chh=getchar();
			if(chh=='K')sa[i]++;
			if(chh=='D')sn[i]++;
			c[i]+=chh;
		}
	}
	for(int i=1;i<=m;i++){
		char ch=getchar();
		while(ch==' '||ch=='\n')ch=getchar();
		q.push(ch);
	}
	int nw=1;
	for(int i=1;i<=n;i++)if(nam[i]==0)nw=i;
	while(!q.empty()){
		if(nw==1)roud++;
		if(ded[nw]){
			nw++;
			nw=(nw-1)%n+1;
			continue;
		}		
		mopai(nw,2);
		int flag=0;
		for(int i=0;i<c[nw].size();i++){
			if(check(c[nw][i],nw)){
				if(c[nw][i]=='P'){
					c[nw].erase(i,1);
					hp[nw]++;
					i--;
					continue;
				}
				if(c[nw][i]=='Z'){
					zg[nw]=1;
					c[nw].erase(i,1);
					i--;
					continue;
				}
				if(c[nw][i]=='N'||c[nw][i]=='W'){
					char p=c[nw][i];
					c[nw].erase(i,1);
					use1(nw,p=='N');
					i--;
					continue;
				}
				if(c[nw][i]=='F'){
					int x=fd(nw,-1);
					if(x!=-1){
						c[nw].erase(i,1);
						juedou(x,nw);
						i--;
					}
					continue;
				}
				if(c[nw][i]=='K'&&(flag==0||zg[nw])){
					int x=fd(nw,1);
					flag++;
					if(x!=-1){
						sa[nw]--;
						c[nw].erase(i,1);
						ssa(nw,x);
						i--;
					}
					continue;
				}
			}
		}
		nw++;
		nw=(nw-1)%n+1;
	}
}
2024/7/22 07:34
加载中...