玄关求条
查看原帖
玄关求条
982629
PDAST楼主2025/7/28 21:42

0pts,只过了样例,蒟蒻实在是改不动力

#include<bits/stdc++.h>
#define rep(i,n,m) for(int i(n);i<=m;++i)
#define Rep(i,n,m) for(int i(n+1);i!=n;i=(i)%(m)+1)
using namespace std;
int id_sum[3],n,m,top;
char Card[2005];
set<int> leifan;
struct Pig{
    int id;//0:Master Pig;1:Zhong Pig;2:Fan Pig
    int hp=4,tot=4,num,alive=1,wuqi=0,have_used_sha;
    int card[11],flag=0;
    multiset<pair<char,int>> order;
};
Pig pig[11];
int CTOI(char ch){
    switch(ch){
        case 'P': return 0;
        case 'K': return 1;
        case 'D': return 2;
        case 'F': return 3;
        case 'N': return 4;
        case 'W': return 5;
        case 'J': return 6;
        case 'Z': return 7;
        default: return -1;
    }
}
char ITOC(int x){
    switch(x){
        case 0: return 'P';
        case 1: return 'K';
        case 2: return 'D';
        case 3: return 'F';
        case 4: return 'N';
        case 5: return 'W';
        case 6: return 'J';
        case 7: return 'Z';
    }
    return '\0';
}
void print(){
    rep(i,1,n){
        if(!pig[i].alive) cout<<"DEAD\n";
        else{
            set<pair<int,char>> tmp;
            for(auto it:pig[i].order) tmp.insert({it.second,it.first});
            bool first=1;
            for(auto it:tmp){
                if(!first) cout<<" ";
                cout<<it.second;
                first=0;
            }
            cout<<"\n";
        }
    }
    exit(0);
}
bool check_same(int p1,int p2){
    return (pig[p1].id==pig[p2].id&&pig[p1].flag!=0&&pig[p2].flag!=0);
}
void pumping(int pos,int num){
    while(num--){
        if(top!=m) ++top;
        ++pig[pos].card[CTOI(Card[top])];
        pig[pos].order.insert({Card[top],++pig[pos].tot});   
    }
}
bool use_tao(int pos){
    if(pig[pos].card[0]<=0) return 0;
    --pig[pos].card[0],++pig[pos].hp;
    auto it=pig[pos].order.lower_bound({'P',0});
    pig[pos].order.erase(it);
    return 1;
}
bool use_shan(int pos){
    if(pig[pos].card[CTOI('D')]<=0) return 0;
    --pig[pos].card[CTOI('D')];
    auto it=pig[pos].order.lower_bound({'D',0});
    pig[pos].order.erase(it);
    return 1;
}
void dying(int pos,int from){
    while(use_tao(pos));
    if(pig[pos].hp<1){
        pig[pos].alive=0;
        --id_sum[pig[pos].id];
        if(id_sum[pig[pos].id]==0){
            if(pig[pos].id==2){
                cout<<"MP\n";
                print();
            }
        }
        if(pig[pos].id==0&&pig[pos].hp<=0){
            cout<<"FP\n";
            print();
        }
        if(pig[from].id==0&&pig[pos].id==1){
            rep(i,0,7) pig[from].card[i]=0;
            pig[from].order.clear();
            pig[from].wuqi=0;
        }
        if(pig[pos].id==2) pumping(from,3);
    }
}
void been_kill(int pos,int from){
    if(use_shan(pos));
    else{
        --pig[pos].hp;
        if(pig[pos].hp<1) dying(pos,from);
    }
}
void use_wuqi(int pos){
    if(!pig[pos].card[CTOI('Z')]) return;
    auto it=pig[pos].order.lower_bound({CTOI('Z'),0});
    --pig[pos].card[CTOI('Z')];
    pig[pos].order.erase(it);
    pig[pos].wuqi=1;
}
void fight(int from,int pos){
    pig[from].flag=1;
    while(pig[from].card[CTOI('K')]>=1&&pig[pos].card[CTOI('K')]>=1){
        auto it=pig[pos].order.lower_bound({CTOI('K'),0});
        --pig[pos].card[CTOI('K')];
        pig[pos].order.erase(it);
        swap(from,pos);
    }
    if(!pig[from].card[CTOI('K')]&&pig[pos].card[CTOI('K')]>0) swap(from,pos);
    --pig[pos].hp;
    // cout<<from<<" "<<pos<<" "<<pig[pos].hp<<"\n";
    if(pig[pos].hp<1) dying(pos,from);
}
void use_wuxie(int from,int pos,int need){
    if(need!=CTOI('F')&&pig[pos].card[need]>0&&pig[pos].flag!=0){
        --pig[pos].card[need];
        pig[pos].order.erase(pig[pos].order.lower_bound({ITOC(need),0}));
        return ;
    }
    int f=1;
    while(pig[pos].flag!=0){
        bool flag=0;
        if(f&&pig[pos].card[CTOI('J')]){
            --pig[pos].card[CTOI('J')];
            auto it=pig[pos].order.lower_bound({'J',0});
            pig[pos].order.erase(it);
            f=0;
            flag=1;
            pos=from;
        }
        if(!flag){
            rep(i,1,n){
                if(pig[i].alive && (check_same(i,pos)^!f) && pig[i].card[CTOI('J')]){
                    --pig[i].card[CTOI('J')];
                    auto it=pig[i].order.lower_bound({'J',0});
                    pig[i].order.erase(it);
                    f^=1;
                    flag=1;
                    pos=i;
                    break;
                }
            }
        }
        if(!flag) break;
    }
    // cout<<from<<" "<<pos<<" "<<need<<"\n";
    if(f){
        if(need==0) fight(from,pos);
        else if(need==CTOI('K')||need==CTOI('D')){
            --pig[pos].hp;
            if(pig[pos].hp<1) dying(pos,from);
        }
    }
}

bool use_sha(int pos){
    if((pig[pos].have_used_sha&&!pig[pos].wuqi)||!pig[pos].card[CTOI('K')]) return 0;
    int next=(pos==n)?1:pos+1;
    while(!pig[next].alive)next=(pos==n)?1:pos+1;
    auto it=leifan.lower_bound(next);
    if(pig[next].alive&&(!check_same(pos,next)||it!=leifan.end()&&(*it)==next)&&(pig[next].flag||pig[next].id==0)){
        pig[pos].have_used_sha=1;
        pig[pos].flag=1;
        --pig[pos].card[CTOI('K')];
        auto it=pig[pos].order.lower_bound({'K',0});
        pig[pos].order.erase(it);
        if(!use_shan(next)) been_kill(next,pos);
        return 1;
    }
    return 0;
}

void action(int pos){
    pig[pos].have_used_sha=0;
    pumping(pos,2);
    if(pig[pos].hp<4) while(use_tao(pos));
    if(!pig[pos].wuqi&&pig[pos].card[CTOI('Z')]) use_wuqi(pos);
    // rep(i,1,n){
    //     cout<<i<<" "<<pig[i].alive<<" "<<pig[i].flag<<" "<<pig[i].id<<" "<<pig[i].wuqi<<" "<<pig[i].hp<<"\n";
    //     rep(j,0,7) cout<<pig[i].card[j]<<" ";
    //     cout<<"\n";
    // }
    rep(j,3,5){
        while(pig[pos].card[j]>0){
            bool used=0;
            Rep(i,pos,n){
                auto it=leifan.lower_bound(i);
                // cout<<pos<<" "<<i<<" "<<pig[i].alive<<" "<<check_same(pos,i)<<"\n";
                if(pig[i].alive&&(j!=3||!check_same(i,pos)&&pig[pos].flag&&pig[i].flag||it!=leifan.end()&&*it==i&&pos==1)){
                    if(i==1) leifan.insert(pos);
                    int need=0;
                    if(j==4) need=CTOI('K');
                    if(j==5) need=CTOI('D'); 
                    use_wuxie(pos,i,need);
                    used=1;
                    if(j==3) break;
                }
            }
            if(!used) break;
            --pig[pos].card[j];
            auto it=pig[pos].order.lower_bound({ITOC(j),0});
            // cout<<(it==pig[pos].order.begin())<<" "<<(it==pig[pos].order.begin())<<"\n";
            if((it==pig[pos].order.begin())&&(it==pig[pos].order.begin())){
                pig[pos].order.clear();
                continue;
            }
            pig[pos].order.erase(it);
        }
    }
    while(use_sha(pos));
}
signed main(){
    // Rep(i,2,3) cout<<i<<"\n";
    pig[1].flag=1;
    cin>>n>>m;
    rep(i,1,n){
        string s; char t;
        cin>>s;
        if(s=="MP") pig[i].id=0;
        else if(s=="ZP") pig[i].id=1;
        else pig[i].id=2;
        rep(j,1,4){
            cin>>t;
            ++pig[i].card[CTOI(t)];
            pig[i].order.insert({t,j});
        }
    }
    rep(i,1,m) cin>>Card[i];
    
    pig[1].flag=1;
    rep(i,1,n) id_sum[pig[i].id]++;
    
    while(1){
        rep(i,1,n){
            if(pig[i].alive){
                action(i);
                if(!id_sum[0]){ cout<<"FP\n"; print(); }
                if(!id_sum[2]){ cout<<"MP\n"; print(); }
            }
            // cout<<"\n";
        }
        // cout<<"\n\n";
    }
}
2025/7/28 21:42
加载中...