社区讨论
目标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 条回复,欢迎继续交流。
正在加载回复...