社区讨论

洛谷 IDE 正确 评测机 RE

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

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@loms374z
此快照首次捕获于
2023/11/06 18:47
2 年前
此快照最后确认于
2023/11/06 20:38
2 年前
查看原帖
确认了 IDE 的环境完全一样,都是 C++14(GCC 9)+O2
不知道是什么问题 RE 了。在 IDE 能正常输出且正确。
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int n,m,now,uid,zid,nxt[maxn],lst[maxn],otherstate[maxn],nowMP,nowZP,nowFP;//0 no 1 friend 2 enemy 3 like enemy
struct user{
	int id,len,blood;
	bool crossbow,vis[maxn];//0 MP 1 ZP 2 FP
	char s[maxn];
	void checkstate(){
		printf("len:%d blood:%d\n",len,blood);
		for(int i=1;i<=len;i++){
			if(!vis[i])printf("%c ",s[i]);
			else printf("(%c) ",s[i]);
		}
		printf("\n");
	}
}a[11];
char card[maxn],s[maxn];
bool nowcard,dead[maxn],fl2;
void gameend(){
	if(!nowMP)printf("FP\n");
	else printf("MP\n");
	for(int i=1;i<=n;i++){
		if(dead[i])printf("DEAD\n");
		else{
			int flu=0;
			for(int j=1;j<=a[i].len;j++){
				if(!a[i].vis[j]){
					if(!flu)flu=1,printf("%c",a[i].s[j]);
					else printf(" %c",a[i].s[j]);
				}
			}
			printf("\n");
		}
	}
	exit(0);
	fl2=1;
}
void getcard(int id,int num){
	while(num--){
		if(now==m)a[id].s[++a[id].len]=card[m];
		else a[id].s[++a[id].len]=card[++now];
	}
}
bool checklimit(int id,int xid){
//	cout<<a[id].id<<" "<<otherstate[xid]<<endl;
	if((a[id].id==0&&(otherstate[xid]==2||otherstate[xid]==5))
	||(a[id].id==1&&(otherstate[xid]==2))
	||(a[id].id==2&&(otherstate[xid]==4||otherstate[xid]==1)))
		return 1;
	return 0;
}
void treat(int id,int cardid){
	if(a[id].blood<4)
		a[id].blood++,a[id].vis[cardid]=1;
}//×¢Òâ¾ö¶·¡¢Íò¼ýÆë·¢µÈ»á¶Ô×Ô¼ºÔì³ÉÉ˺¦»¹¿ÉÒÔÓÃ
int findinvalid(int st,int frid,int yesorno){
	int id=st;
	while(1){
		bool fl=0;
		if(a[id].id==2&&(otherstate[frid]==4||otherstate[frid]==1)&&yesorno==1)fl=1;
		else if(a[id].id==2&&otherstate[frid]==2&&yesorno==0)fl=1;
		else if(a[id].id==4&&(a[frid].id==2||a[frid].id==5)&&yesorno==1)fl=1;
		else if(a[id].id==1&&a[frid].id==2&&yesorno==1)fl=1;
		else if((a[id].id==4||a[id].id==1)&&(otherstate[frid]==4||otherstate[frid]==1)&&yesorno==0)fl=1;
		if(fl){
			for(int i=1;i<=a[id].len;i++)
				if(a[id].s[i]=='J'&&!a[id].vis[i]){
				a[id].vis[i]=1;return id;
			}	
		}
		if(nxt[id]==st)break;
		id=nxt[id];
	}
	return -1;
}
bool findkilll(int id){
	for(int i=1;i<=a[id].len;i++)
		if(a[id].s[i]=='K'&&!a[id].vis[i]){
			a[id].vis[i]=1;return 1;
		}
	return 0;
}
bool finddodge(int id){
	for(int i=1;i<=a[id].len;i++)
		if(a[id].s[i]=='D'&&!a[id].vis[i]){
			a[id].vis[i]=1;return 1;
		}
	return 0;
}
bool findtreat(int id){
	for(int i=1;i<=a[id].len;i++)
		if(a[id].s[i]=='P'&&!a[id].vis[i]){
			a[id].blood++,a[id].vis[i]=1;return 1;
		}
	return 0;
}
void deadstate(int id,int frid){
	nxt[lst[id]]=nxt[id];
	lst[nxt[id]]=lst[id];
	dead[id]=1;
	if(a[id].id==0)nowMP--;
	if(a[id].id==1)nowZP--;
	if(a[id].id==2)nowFP--;
	if(!nowMP||!nowFP)gameend();
	else{
		if(a[id].id==1&&a[frid].id==0){
			for(int i=1;i<=a[frid].len;i++)
				a[frid].s[i]='0',a[frid].vis[i]=0;
			a[frid].len=0,a[frid].crossbow=0;
		}
		if(a[id].id==2)getcard(frid,3);
	}
}
void reduceblood(int id,int frid){
	a[id].blood--;
	if(!a[id].blood){
		if(!findtreat(id))
			deadstate(id,frid);
	}
}
void killl(int id,int cardid){
	int xid=nxt[id];
//	cout<<id<<" "<<xid<<" "<<checklimit(id,xid)<<" "<<nowcard<<endl;
	if(checklimit(id,xid)&&((!nowcard&&!a[id].crossbow)||a[id].crossbow)){
		nowcard=1;
		if(otherstate[id]==0||otherstate[id]==5)otherstate[id]=a[id].id;
		a[id].vis[cardid]=1;
		if(!finddodge(xid))
			reduceblood(xid,id);
	}
}//×¢ÒâÖî¸ðÁ¬åóºó¿ÉÄÜ»¹ÓÃɱ 
void duel(int id,int cardid){
//	if(id==4)cout<<233<<endl;
	int xid=nxt[id];
	if(a[id].id==2){
		xid=zid;
	}
	else{
		while(1){
			if(xid==id)return ;
			if(checklimit(id,xid))break;
			xid=nxt[xid];
		}		
	}
	a[id].vis[cardid]=1;
	if(otherstate[id]==0||otherstate[id]==5)otherstate[id]=a[id].id;
	int nowstate=0,users=xid;
	while(1){
		users=findinvalid(users,users,nowstate);
//		cout<<id<<" "<<users<<endl;
		if(users==-1)break;
		else{
			otherstate[users]=a[users].id;
			nowstate^=1;
		}
	}
	if(nowstate==0){
		while(1){
			if(a[id].id==0&&a[xid].id==1){reduceblood(xid,id);break;}
			if(!findkilll(xid)){reduceblood(xid,id);break;}
			if(otherstate[xid]==0||otherstate[xid]==5)otherstate[xid]=a[xid].id;
			if(!findkilll(id)){reduceblood(id,xid);break;}
		}
	}
}
void arrows(int id,int numid,int cardid){//0 dodge 1 killl
	int xid=nxt[id];
	a[id].vis[cardid]=1;
//	if(!otherstate[id])otherstate[id]=5;
	while(1){
		int nowstate=0,users=id;
		while(dead[users])users=nxt[users];
		while(1){
			users=findinvalid(users,xid,nowstate);
			if(users==-1)break;
			else{
				otherstate[users]=a[users].id;
				nowstate^=1;
			}
		}
		if(nowstate==0){
			if(numid==0){
				if(!finddodge(xid)){
					if(xid==1&&!otherstate[id])otherstate[id]=5;
					reduceblood(xid,id);
				}
			}
			else{
				if(!findkilll(xid)){
					if(xid==1&&!otherstate[id])otherstate[id]=5;
					reduceblood(xid,id);
				}				
			}
		}
		if(nxt[xid]==id)break;
		xid=nxt[xid];
	}
}
void arm(int id,int cardid){
	a[id].vis[cardid]=1;
	a[id].crossbow=1;
}
int main(){
//	freopen("6.in","r",stdin); 
//	freopen("p.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%s",s);
		if(s[0]=='M')a[i].id=0,nowMP++,zid=i;
		if(s[0]=='Z')a[i].id=1,nowZP++;
		if(s[0]=='F')a[i].id=2,nowFP++;
		a[i].len=4,a[i].blood=4;
		for(int j=1;j<=4;j++)
			getchar(),a[i].s[j]=getchar();
	}
	otherstate[zid]=4;
	for(int i=1;i<=n;i++){
		nxt[i]=i+1;lst[i]=i-1;
	}
	getchar();
	nxt[n]=1;lst[1]=n;
	for(int i=1;i<=m;i++)
		card[i]=getchar(),getchar();
	card[m+1]='=';
	if(!nowMP||!nowFP)gameend();
	uid=1;
	while(1){
		//game start
//		cout<<uid<<":\n";
//		a[uid].checkstate();		
		getcard(uid,2);
		nowcard=0; 
		for(int i=1;i<=a[uid].len;i++){
			if(dead[uid])break;
			if(a[uid].vis[i])continue;
			if(a[uid].s[i]=='P')treat(uid,i);
			if(a[uid].s[i]=='K')killl(uid,i);
			if(a[uid].s[i]=='F')duel(uid,i);
			if(a[uid].s[i]=='W')arrows(uid,0,i);
			if(a[uid].s[i]=='N')arrows(uid,1,i);
			if(a[uid].s[i]=='Z'){
				int fl3=0;
				if(a[uid].crossbow)fl3=1;
				arm(uid,i);
				if(!fl3)i=0;
			}
		}
//		cout<<"\n"<<uid<<"'s turn:\n";
//		for(int i=1;i<=n;i++){
//			cout<<i<<" nowstate:\n";
//			if(dead[i])cout<<"DEAD\n";
//			else a[i].checkstate();
//		}
//		printf("\n");
		if(fl2)break;
		uid=nxt[uid];
		
	}
	return 0;
}

回复

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

正在加载回复...