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