Submission #1359756

#TimeUsernameProblemLanguageResultExecution timeMemory
1359756AvianshPermutation Game (APIO25_permgame)C++20
12 / 100
4 ms608 KiB
#include "permgame.h"
#include <bits/stdc++.h>

using namespace std;

vector<vector<int>>cyc(vector<int>p, int n){
    bool vis[n];
    fill(vis,vis+n,0);
    vector<vector<int>>ans;
    for(int i = 0;i<n;i++){
        if(vis[i])
            continue;
        vis[i]=1;
        int curr = p[i];
        vector<int>curcyc;
        curcyc.push_back(i);
        while(curr!=i){
            curcyc.push_back(curr);
            vis[curr]=1;
            curr=p[curr];
        }
        ans.push_back(curcyc);
    }
    return ans;
}

void dfs(int st, vector<int>g[], bool vis[], vector<int>&order){
    order.push_back(st);
    vis[st]=1;
    for(int i : g[st]){
        if(vis[i])
            continue;
        dfs(i,g,vis,order);
    }
}

int Alice(int m, int e, vector<int> u, vector<int> v, int n, vector<int> p) {
    vector<int> t(m);
    vector<vector<int>>current = cyc(p,n);
    vector<int>g[m];
    for(int i = 0;i<e;i++){
        g[u[i]].push_back(v[i]);
        g[v[i]].push_back(u[i]);
    }
    for(int i = 0;i<m;i++){
        if(g[i].size()>=3){
            ///bad
            int ans = 0;
            for(vector<int>v:current){
                if(v.size()==1){
                    ans++;
                }
            }
            return ans;
        }
    }
    ///need to find order of cyc.
    vector<int>order;
    bool vis[m];
    fill(vis,vis+m,0);
    dfs(0,g,vis,order);
    while(1){
        current = cyc(p,n);
        int mxsiz = 0;
        vector<int>mxv;
        for(vector<int>v:current){
            mxsiz=max(mxsiz,(int)v.size());
            if(mxsiz==v.size()){
                mxv=v;
            }
        }
        if(mxsiz<m){
            break;
        }
        ///take m people from mxv
        for(int i = 0;i<m;i++){
            t[order[i]]=mxv[i];
        }
        int j = Bob(t);
        swap(p[t[u[j]]], p[t[v[j]]]);
    }
    int ans = 0;
    for(vector<int>v:current){
        if(v.size()==1){
            ans++;
        }
    }
    return ans;
}
#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...