Submission #1205032

#TimeUsernameProblemLanguageResultExecution timeMemory
1205032irmuunPermutation Game (APIO25_permgame)C++20
22 / 100
17 ms528 KiB
#include "permgame.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

const int N=400;

vector<int>g[N];//initial graph/not P
vector<bool>vis(N);
vector<int>line;
vector<vector<int>>f;

void find(int x){
	line.pb(x);
	vis[x]=true;
	for(int y:g[x]){
		if(!vis[y]){
			find(y);
		}
	}
}

void dfs(int x){
	vis[x]=true;
	f.back().pb(x);
	for(int y:g[x]){
		if(!vis[y]){
			dfs(y);
		}
	}
}

int Alice(int m, int e, vector<int> u, vector<int> v, int n, vector<int> p) {
	vector<int> t(m);
	if(m==2){
		for(int i=0;i<n;i++){
			if(p[i]!=i){
				for(int j=i+1;j<n;j++){
					if(p[j]==i){
						t[0]=i;
						t[1]=j;
						int j=Bob(t);
						swap(p[t[u[j]]], p[t[v[j]]]);
						break;
					}
				}
			}
		}
		return n;
	}
	int ans=0;
	for(int i=0;i<n;i++){
		if(p[i]==i){
			ans++;
		}
	}
	if(e>m){
		return ans;	
	}
	int start=ans;
	if(e==m-1){
		int deg=0;
		for(int i=0;i<e;i++){
			g[u[i]].pb(v[i]);
			g[v[i]].pb(u[i]);
		}
		for(int i=0;i<m;i++){
			deg=max(deg,(int)g[i].size());
		}
		if(deg>=3){
			return ans;
		}
		for(int i=0;i<m;i++){
			if(g[i].size()==1){
				find(i);
				break;
			}
		}
		int play=n*10;
		while(play--){
			fill(all(vis),false);
			for(int i=0;i<n;i++){
				g[i].clear();
			}
			f.clear();
			for(int i=0;i<n;i++){
				g[p[i]].pb(i);
				g[i].pb(p[i]);
			}
			for(int i=0;i<n;i++){
				if(!vis[i]){
					f.pb({});
					dfs(i);
				}
			}
			sort(all(f),[&](vector<int>a,vector<int>b){
				return (int)a.size()>(int)b.size();
			});
			vector<int>ord;
			for(int i=0;i<f.size();i++){
				for(int x:f[i]){
					ord.pb(x);
				}
			}
			for(int i=0;i<m;i++){
				t[line[i]]=ord[i];
			}
			int j=Bob(t);
			swap(p[t[u[j]]], p[t[v[j]]]);
			{
				int cnt=0;
				for(int i=0;i<n;i++){
					if(p[i]==i){
						cnt++;
					}
				}
				if(cnt>=max(n-m+1,start)){
					break;
				}
			}
		}
		return max(n-m+1,start);
	}
    return 0;
}
#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...