为什么T了?

P2482 [SDOI2010] 猪国杀

cerr的输出也占时间
by _Regenbogen_ @ 2023-08-30 17:12:51


@[Jasminoides](/user/322792) `cerr` 占时间,并且你的数组开小了。
by pyy1 @ 2023-08-30 17:20:53


@[pyy1](/user/581316) 谢谢您
by Jasminoides @ 2023-08-30 19:09:00


@[h8866](/user/791638) 也谢谢您
by Jasminoides @ 2023-08-30 19:09:15


``` #include <iostream> #include <string> #include <cstring> using namespace std; struct pig{ int id,glid; int prev,next; int noc,hp; char card[10010]; bool used[10010],aed,aliv; pig(){;} inline pig(string id,char c1,char c2,char c3,char c4,int num){ memset(card,0,sizeof card),memset(used,0,sizeof used); glid=0; if(id=="MP") this->id=0,glid=1; else if(id=="ZP") this->id=1; else if(id=="FP") this->id=-1; prev=num-1,next=num+1; card[1]=c1,card[2]=c2,card[3]=c3,card[4]=c4,noc=4; hp=4,aed=false,aliv=true; return ; } }pigs[15]; int n,m,k=0,cur,endgm=0,ctfp=0,clmk=0; char cardq[20010]={}; inline void getcard(int num){ if(k!=m) k++; pigs[num].card[++pigs[num].noc]=cardq[k]; return ; } inline bool useP(int num){ if(pigs[num].hp<4){ cerr<<"pig "<<num<<"-th use P!"<<endl; pigs[num].hp++; return true; } return false; } inline bool useZ(int num){ cerr<<"pig "<<num<<"-th use Z!"<<endl; pigs[num].aed=true; return true; } inline void useD(int num){ for(int i=1;i<=pigs[num].noc;i++){ if(pigs[num].card[i]=='D'&&!pigs[num].used[i]){ cerr<<"Pig "<<num<<"-th use D!"<<endl; pigs[num].used[i]=true; return; } } cerr<<"Pig "<<num<<"-th lose 1 hp!"<<endl; pigs[num].hp--; return ; } inline void die(int num,int frm){ for(int i=1;i<=pigs[num].noc;i++){ if(pigs[num].card[i]=='P'&&!pigs[num].used[i]){ pigs[num].hp++,pigs[num].used[i]=true; if(pigs[num].hp>0){ cerr<<"Pig "<<num<<"-th use P to survive!"<<endl; return; } } } if(pigs[num].hp<=0){ cerr<<"Pig "<<num<<"-th DIES!"<<endl; pigs[num].aliv=false; pigs[pigs[num].prev].next=pigs[num].next,pigs[pigs[num].next].prev=pigs[num].prev; if(!pigs[num].id){ endgm=-1; return; } if(pigs[num].id==-1){ ctfp--; if(ctfp==0){ endgm=1; return; } cerr<<"Pig "<<frm<<"-th get 3 cards!"<<endl; getcard(frm),getcard(frm),getcard(frm); } if(pigs[num].id==1) if(pigs[frm].id==0){ cerr<<"Pig "<<frm<<"-th incorrectly killed pig "<<num<<"-th!"<<endl; pigs[frm].aed=false,pigs[frm].noc=0; memset(pigs[frm].card,0,sizeof pigs[frm].card); memset(pigs[frm].used,0,sizeof pigs[frm].used); clmk=1; } } return ; } inline bool useK(int num){ int trg=pigs[num].next; if(!pigs[num].id){ if(pigs[trg].glid==-1||(pigs[trg].id==-1&&pigs[trg].glid==1)){ cerr<<"Pig "<<num<<"-th use K to "<<trg<<"-th pig!"<<endl; pigs[num].glid=1; useD(trg); if(pigs[trg].hp<=0) die(trg,num); return true; } } if(pigs[num].id==1){ if(pigs[trg].glid==1&&pigs[trg].id==-1){ cerr<<"Pig "<<num<<"-th use K to "<<trg<<"-th pig!"<<endl; pigs[num].glid=1; useD(trg); if(pigs[trg].hp<=0) die(trg,num); return true; } } if(pigs[num].id==-1){ if(pigs[trg].glid==1&&(pigs[trg].id>=0)){ cerr<<"Pig "<<num<<"-th use K to "<<trg<<"-th pig!"<<endl; pigs[num].glid=1; useD(trg); if(pigs[trg].hp<=0) die(trg,num); return true; } } return false; } inline bool useJ(int num,int dsi){ int now=num; do{ if(pigs[now].id!=-1&&dsi==1){ for(int i=1;i<=pigs[now].noc;i++){ if(pigs[now].card[i]=='J'&&!pigs[now].used[i]){ cerr<<"Pig "<<now<<"-th use J!"<<endl; pigs[now].used[i]=true; if(pigs[now].glid!=1) pigs[now].glid=1; return !useJ(now,-1); } } } if(pigs[now].id==-1&&dsi==-1){ for(int i=1;i<=pigs[now].noc;i++){ if(pigs[now].card[i]=='J'&&!pigs[now].used[i]){ cerr<<"Pig "<<now<<"-th use J!"<<endl; pigs[now].used[i]=true; if(pigs[now].glid!=1) pigs[now].glid=1; return !useJ(now,1); } } } now=pigs[now].next; }while(now!=num); return false; } inline bool useN(int num){ cerr<<"Pig "<<num<<"-th use N!"<<endl; for(int i=pigs[num].next;i!=num;i=pigs[i].next){ bool usedK=false; if(pigs[i].glid==1) if(useJ(num,pigs[i].id==0?1:pigs[i].id)) continue; for(int j=1;j<=pigs[i].noc;j++){ if(pigs[i].card[j]=='K'&&!pigs[i].used[j]){ usedK=true,pigs[i].used[j]=true; break; } } if(!usedK){ cerr<<"Pig "<<i<<"-th down 1 hp!"<<endl; pigs[i].hp--; if(pigs[i].hp<=0) die(i,num); if(pigs[i].id==0&&pigs[num].glid==0) pigs[num].glid=-1; if(endgm!=0) return true; } else cerr<<"Pig "<<i<<"-th use K!"<<endl; } return true; } inline bool useW(int num){ cerr<<"Pig "<<num<<"-th use W!"<<endl; for(int i=pigs[num].next;i!=num;i=pigs[i].next){ bool usedD=false; if(pigs[i].glid==1) if(useJ(num,pigs[i].id==0?1:pigs[i].id)) continue; for(int j=1;j<=pigs[i].noc;j++){ if(pigs[i].card[j]=='D'&&!pigs[i].used[j]){ usedD=true,pigs[i].used[j]=true; break; } } if(!usedD){ cerr<<"Pig "<<i<<"-th down 1 hp!"<<endl; pigs[i].hp--; if(pigs[i].hp<=0) die(i,num); if(pigs[i].id==0&&pigs[num].glid==0) pigs[num].glid=-1; if(endgm!=0) return true; }else cerr<<"Pig "<<i<<"-th use D!"<<endl; } return true; } inline void F(int atk,int dnf){ cerr<<"Pig "<<atk<<"-th use F to attack pig "<<dnf<<"-th!"<<endl; if(atk==1&&pigs[dnf].id==1){ pigs[dnf].hp--; if(pigs[dnf].hp<=0) die(dnf,atk); return; } int now=dnf; while(true){ bool usedK=false; for(int i=1;i<=pigs[now].noc;i++){ if(pigs[now].card[i]=='K'&&!pigs[now].used[i]){ usedK=true,pigs[now].used[i]=true; break; } } if(!usedK){ cerr<<"Pig "<<now<<"-th lose in F, down 1 hp!"<<endl; pigs[now].hp--; if(pigs[now].hp<=0) die(now,now==dnf?atk:dnf); return; } now=(now==dnf?atk:dnf); } return ; } inline bool useF(int num){ if(pigs[num].id==-1){ pigs[num].glid=1; bool flg=useJ(num,1); cerr<<"Pig "<<num<<"-th use F!"<<endl; if(!flg) F(num,1); return true; } if(pigs[num].id==1){ for(int i=pigs[num].next;i!=num;i=pigs[i].next){ if(pigs[i].glid==1&&pigs[i].id==-1){ cerr<<"Pig "<<num<<"-th use F!"<<endl; pigs[num].glid=1; bool flg=false; if(pigs[i].glid==1) flg=useJ(num,-1); if(!flg) F(num,i); return true; } } } if(!pigs[num].id){ for(int i=pigs[num].next;i!=num;i=pigs[i].next){ if((pigs[i].glid==1&&pigs[i].id==-1)||pigs[i].glid==-1){ cerr<<"Pig "<<num<<"-th use F!"<<endl; bool flg=false; if(pigs[i].glid==1) flg=useJ(num,-1); if(!flg) F(num,i); return true; } } } return false; } signed main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n>>m; for(int i=1;i<=n;i++){ string d; char c[5]; cin>>d; if(d=="FP") ++ctfp; for(int j=1;j<=4;j++) cin>>c[j]; pigs[i]=pig(d,c[1],c[2],c[3],c[4],i); } pigs[1].prev=n,pigs[n].next=1,cur=1; for(int i=1;i<=m;i++) cin>>cardq[i]; while(true){ getcard(cur),getcard(cur); bool usedK=false; for(int i=1;i<=pigs[cur].noc;i++){ if(!pigs[cur].used[i]){ bool usedc=false; if(pigs[cur].card[i]=='P') usedc=useP(cur); if(pigs[cur].card[i]=='Z') usedc=useZ(cur); if(pigs[cur].card[i]=='K'&&(!usedK||pigs[cur].aed)) usedK=usedc=useK(cur); if(pigs[cur].card[i]=='N') usedc=useN(cur); if(pigs[cur].card[i]=='W') usedc=useW(cur); if(pigs[cur].card[i]=='F') usedc=useF(cur); if(usedc){ if(i==1&&clmk) clmk=0; else pigs[cur].used[i]=true; i=0; } } if(!pigs[cur].aliv) break; if(endgm!=0) break; } cerr<<"-----------------"<<'\n'; if(endgm!=0) break; cur=pigs[cur].next; } if(endgm==1) cout<<"MP"<<'\n'; else cout<<"FP"<<'\n'; for(int i=1;i<=n;i++){ if(!pigs[i].aliv) cout<<"DEAD"<<'\n'; else{ for(int j=1;j<=pigs[i].noc;j++){ if(!pigs[i].used[j]) cout<<pigs[i].card[j]<<' '; } cout<<'\n'; } } return 0; } ``` 改好了
by xiaogege @ 2023-09-13 13:15:55


|