Submission #1220722

#TimeUsernameProblemLanguageResultExecution timeMemory
1220722guagua0407Permutation Game (APIO25_permgame)C++20
70 / 100
11 ms492 KiB
#include "permgame.h"
//#include "grader.cpp"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define f first
#define s second
#define all(x) x.begin(),x.end()
#define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

int Alice(int m, int e, std::vector<int> u, std::vector<int> v, int n, std::vector<int> p) {
    int cur=0;
    for(int i=0;i<n;i++){
        if(p[i]==i) cur++;
    }
    if(e>m) return cur;
    vector<vector<int>> adj(m);
    for(int i=0;i<e;i++){
        //cout<<u[i]<<' '<<v[i]<<'\n';
        adj[u[i]].push_back(v[i]);
        adj[v[i]].push_back(u[i]);
    }
    int st=0;
    for(int i=0;i<m;i++){
        if((int)adj[i].size()>2) return cur;
        if((int)adj[i].size()==1) st=i;
    }
    vector<int> ord;
    vector<bool> vis(m);
    while(!vis[st]){
        vis[st]=true;
        ord.push_back(st);
        int x=-1;
        for(auto v:adj[st]){
            if(!vis[v]){
                x=v;
                break;
            }
        }
        if(x==-1) break;
        st=x;
    }
    int best=0;
    {
        vector<bool> used(n);
        for(int i=0;i<n;i++){
            if(used[i]) continue;
            vector<int> tmp;
            int x=i;
            while(!used[x]){
                used[x]=true;
                tmp.push_back(x);
                x=p[x];
            }
            if((int)tmp.size()%2==1) best++;
        }
    }
    while(true){
        vector<vector<int>> cycle;
        vector<bool> used(n);
        for(int i=0;i<n;i++){
            if(used[i]) continue;
            vector<int> tmp;
            int x=i;
            while(!used[x]){
                used[x]=true;
                tmp.push_back(x);
                x=p[x];
            }
            if((int)tmp.size()>1) cycle.push_back(tmp);
        }
        vector<vector<int>> cnt(n+1);
        int mx=1;
        for(int i=0;i<(int)cycle.size();i++){
            cnt[(int)cycle[i].size()].push_back(i);
            mx=max(mx,(int)cycle[i].size());
        }
        vector<int> res(m,-1);
        if(e==m-1){
            for(int i=0;i<m;i++){
                if(cycle.empty()) break;
                if(cycle.back().empty()) cycle.pop_back();
                if(cycle.empty()) break;
                res[i]=cycle.back().back();
                cycle.back().pop_back();
            }
        }
        else if(m==3 and e==3){
            for(int i=3;i<=n;i+=2){
                if(!cnt[i].empty()){
                    int id=cnt[i][0];
                    for(int t=0;t<3;t++){
                        res[ord[t]]=cycle[id][t];
                    }
                }
            }
        }
        else{
            if((int)cnt[4].size()>=1){
                int id=cnt[4][0];
                for(int t=0;t<4;t++){
                    res[ord[t]]=cycle[id][t];
                }
            }
            else if(mx>5){
                int id=cnt[mx][0];
                vector<int> ord4={0,1,5,4};
                for(int t=0;t<4;t++){
                    res[ord[t]]=cycle[id][ord4[t]];
                }
            }
            else if((int)cnt[2].size()>1){
                int id1=cnt[2][0];
                int id2=cnt[2][1];
                for(int t=0;t<2;t++){
                    res[ord[t]]=cycle[id1][t];
                }
                for(int t=0;t<2;t++){
                    res[ord[t+2]]=cycle[id2][t];
                }
            }
            else if((int)cnt[3].size()>1){
                int id1=cnt[3][0];
                int id2=cnt[3][1];
                for(int t=0;t<2;t++){
                    res[ord[t]]=cycle[id1][t];
                }
                for(int t=0;t<2;t++){
                    res[ord[t+2]]=cycle[id2][t];
                }
            }
            else if(n>=5 and (int)cnt[5].size()>=1){
                int id1=cnt[5].back();
                cnt[5].pop_back();
                int id2=-1;
                for(int i=2;i<=5;i++){
                    if((int)cnt[i].size()>=1){
                        id2=cnt[i][0];
                        break;
                    }
                }
                if(id2!=-1){
                    for(int t=0;t<2;t++){
                        res[ord[t]]=cycle[id1][t];
                    }
                    for(int t=0;t<2;t++){
                        res[ord[t+2]]=cycle[id2][t];
                    }
                }
            }
        }
        if(res.back()==-1) break;
        int j=Bob(res);
        swap(p[res[u[j]]],p[res[v[j]]]);
        cur=0;
        for(int i=0;i<n;i++){
            if(p[i]==i) cur++;
        }
    }
    if(m==3 and e==3) return best;
    else return cur;
}
/*
3 3
0 1
1 2
2 0
10
8 2 7 6 1 5 0 9 3 4
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...