Submission #1370794

#TimeUsernameProblemLanguageResultExecution timeMemory
1370794FaresSTHMagenta (COCI21_magenta)C++20
30 / 110
34 ms9100 KiB
#include"bits/stdc++.h"
using namespace std;
using ll=long long;
#define S second
#define F first 
const int mxn=1e5+5;
int d[mxn],p[mxn],rp[mxn][2],sz[mxn][2];
vector<pair<int,int>>g[mxn];
void dfs(int i=1){
    d[i]=d[p[i]]+1;
    for(auto j:g[i])if(j.F!=p[i]){
        p[j.F]=i;
        dfs(j.F);
    }
}
int fp(int i,bool t){
    if(i==rp[i][t])return i;
    return rp[i][t]=fp(rp[i][t],t);
}
void mrg(int a,int b,bool t){
    a=fp(a,t),b=fp(b,t);
    if(sz[a][t]<sz[b][t])swap(a,b);
    sz[b][t]+=sz[a][t];
    rp[b][t]=a;
}
void upd(int i,int pr,bool t){
    for(auto j:g[i])if(j.F!=pr){
        if(j.S!=1&&t!=1)mrg(i,j.F,0);
        if(j.S!=0&&t!=0)mrg(i,j.F,1);
        upd(j.F,i,t);
    }
}
int main(){
    cin.tie(0)->sync_with_stdio(0);
    int n,a,b;
    cin>>n>>a>>b;
    for(int i=1;i<=n;i++){
        rp[i][0]=i;
        sz[i][0]=1;
        rp[i][1]=i;
        sz[i][1]=1;
    }
    for(int i=1,u,v,t;i<n;i++){
        string s;
        cin>>u>>v>>s;
        if(s[0]=='p')t=0;
        else if(s[0]=='c')t=1;
        else t=2;
        g[u].push_back({v,t});
        g[v].push_back({u,t});
    }
    upd(a,0,0);
    upd(b,0,1);
    bool flag=1;
    for(int i=1;i<=n;i++){
        if(fp(a,0)==fp(i,0)&&fp(b,1)==fp(i,1))flag=0;
    }
    if(flag)return cout<<"Magenta",0;
    dfs();
    int dis[n+1];
    if((d[a]+d[b])%2==0){
        for(int i=1;i<=n;i++)d[i]=0,p[i]=0,dis[i]=-1;
        dfs(a);
        queue<int>q;
        q.push(b);
        dis[b]=0;
        while(q.size()){
            auto i=q.front();
            q.pop();
            for(auto [_,j]:g[i]){
                if(fp(b,1)!=fp(j,1)||dis[i]+1>=d[j])continue;
                dis[j]=dis[i]+1;
                q.push(j);
            }
        }
        bool flag=0;
        for(int i=1;i<=n;i++){
            if(fp(a,0)==fp(i,0)||dis[i]==-1)continue;
            for(auto [_,j]:g[i])if(dis[j]!=-1&&fp(a,0)!=fp(j,0))flag=1;
        }
        if(flag)cout<<"Magenta";
        else cout<<"Paula";
    }
    else{
        for(int i=1;i<=n;i++)d[i]=0,p[i]=0,dis[i]=-1;
        dfs(b);
        queue<int>q;
        q.push(a);
        dis[a]=0;
        while(q.size()){
            auto i=q.front();
            q.pop();
            for(auto [_,j]:g[i]){
                if(fp(a,0)!=fp(j,0)||dis[i]+1>=d[j])continue;
                dis[j]=dis[i]+1;
                q.push(j);
            }
        }
        bool flag=0;
        for(int i=1;i<=n;i++){
            // if(dis[i]!=-1)cout<<i<<endl;
            if(fp(b,1)==fp(i,1)||dis[i]==-1)continue;
            for(auto [_,j]:g[i])if(dis[j]!=-1&&fp(b,1)!=fp(j,1))flag=1;
        }
        if(flag)cout<<"Magenta";
        else cout<<"Marin";
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...