社区讨论

目标10分TLE求条必关

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhjrauye
此快照首次捕获于
2025/11/04 07:13
4 个月前
此快照最后确认于
2025/11/04 07:13
4 个月前
查看原帖
CPP
//打卡:肝猪国杀的第 2 天!
#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int n,m;
int j[15],jf[15],zg[15],pd[2009],cnt=1,t[15],zs[15],ys[15],fzs,psw[15],sll;
//忠猪 1,主猪 3,反猪 2。
//桃 P 1,杀 K 2,闪 D 8,决斗 F 3,南蛮入侵 N 4,万箭齐发 W 5,无懈可击 J 6,诸葛连弩 Z 7。
list<int>z[15];
void sl() {
	sll=1;
	FOR(i,1,n) {
		if(psw[i]) {
			cout<<"DEAD\n";
			continue;
		}
		for (const auto& x : z[i]) {
			cout << x << " ";
		}
		cout<<"\n";
	}
}
void sw(int x,int s) {
	psw[x]=1;
	j[jf[x]]=j[x];
	jf[j[x]]=jf[x];
	if(zs[x]==1) {
		cout<<"FP\n";
		sl();
		if(sll)return;
	}
	if(zs[x]==2) {
		fzs--;
		if(fzs==0) {
			cout<<"MP\n";
			sl();
			return;
		}
		FOR(i,1,3) {
			if(cnt!=m)cnt++;
			z[s].push_back(i);
		}
	}
	if(zs[x]==1&&zs[s]==3) {
		z[s].clear();
		zg[s]=0;
	}
}
void bs(int x,int s) {
	auto it = find(z[x].begin(), z[x].end(), 8);
	if (it != z[x].end()) {
		z[x].erase(it);
		return;
	} else {
		sw(x,s);
	}
}
bool p8(int x) {
	auto it = find(z[x].begin(), z[x].end(), 8);
	if (it != z[x].end()) {
		z[x].erase(it);
		return 1;
	}
	return 0;
}
bool p1(int x) {
	if(t[x]<4) {
		t[x]++;
		return 1;
	}
	return 0;
}
bool p2(int x) {
	if((ys[x]==3||ys[x]==1)&&ys[j[x]]==2||(ys[j[x]]==3||ys[j[x]]==1)&&ys[x]==2) {
		if(ys[j[x]]==1||ys[j[x]]==3)ys[x]=2;
		else ys[x]=1;
		if(!p8(x)) {
			t[j[x]]--;
			if(t[j[x]]==0)bs(j[x],x);
			if(sll)return 0;
			return 1;
		}
	}
	return 0;
}
int main() {
	string x;
	int p;
	cin>>n>>m;
	FOR(i,1,n)t[i]=4;
	FOR(i,1,n-1)j[i]=i+1;
	FOR(i,2,n)jf[i]=i-1;
	j[n]=1;
	jf[1]=n;
	FOR(i,1,n) {
		cin>>x;
		if(x=="MP")zs[i]=3,ys[i]=3,p=i;
		if(x=="ZP")zs[i]=1;
		if(x=="FP")zs[i]=2,fzs++;
		FOR(j,1,4) {
			cin>>x;
			if(x=="P")z[i].push_back(1);
			if(x=="K")z[i].push_back(2);
			if(x=="D")z[i].push_back(8);
			if(x=="F")z[i].push_back(3);
			if(x=="N")z[i].push_back(4);
			if(x=="W")z[i].push_back(5);
			if(x=="J")z[i].push_back(6);
			if(x=="Z")z[i].push_back(7);
		}
	}
	FOR(i,1,m) {
		cin>>x;
		if(x=="P")pd[i]=1;
		if(x=="K")pd[i]=2;
		if(x=="D")pd[i]=8;
		if(x=="F")pd[i]=3;
		if(x=="N")pd[i]=4;
		if(x=="W")pd[i]=5;
		if(x=="J")pd[i]=6;
		if(x=="Z")pd[i]=7;
	}
	int zz;
	while(!sll) {
		FOR(i,1,2) {
			if(cnt<m)cnt++;
			z[p].push_back(pd[cnt]);
		}
		zz=1;
		for (list<int>::iterator it = z[p].begin(); it != z[p].end(); ) {
			if(*it==1) {
				if(p1(p)) {
					it=z[p].erase(it);
					continue;
				}
			}
			if(*it==2&&(zz||zg[p])) {
				if(p2(p)) {
					if(sll)return 0;
					it=z[p].erase(it);
					zz=0;
					continue;
				}
			}
//			if(*it==4)p4(p);
//			if(*it==5)p5(p);
//			if(*it==6)p6(p);
//			if(*it==7)p7(p);
			if(*it==8)zg[p]=1;
			++it;
		}
		p=j[p];
	}
}

回复

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

正在加载回复...