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