제출 #1324847

#제출 시각아이디문제언어결과실행 시간메모리
1324847exoworldgdPermutation Game (APIO25_permgame)C++20
100 / 100
44 ms648 KiB
#include"permgame.h"
#include<bits/stdc++.h>
#define exoworldgd cin.tie(0)->sync_with_stdio(0),cout.tie(0)
#define ll long long
using namespace std;
int Alice(int M,int E,vector<int>U,vector<int>V,int N,vector<int>P){
	int n=N,m=M,a[405],nc;
	vector<int>al[405],ch,c[405];
	pair<int,int>e[405];
	auto decomp=[&](){
		bool v[405]={};
		nc=0;
		for(int x=0;x<n;x++)if(!v[x]){
			c[nc].clear(),c[nc].push_back(x);
			while(!v[c[nc].back()])v[c[nc].back()]=1,c[nc].push_back(a[c[nc].back()]);
			c[nc].pop_back(),nc++;
		}
		sort(c,c+nc,[](vector<int>a,vector<int>b){return a.size()>b.size();});
		int r=n;
		while(nc&&c[nc-1].size()==1)r--,nc--;
		return r;
	};
	auto send=[&](vector<int>v){
		vector<int>mv(m);
		for(int x=0;x<m;x++)mv[ch[x]]=v[x];
		int i=Bob(mv);
		swap(a[mv[e[i].first]],a[mv[e[i].second]]);
	};
	auto so=[&](vector<int>v){
		vector<int>r;
		for(int x=0;x<m;x+=2)r.push_back(v[x]);
		for(int x=m-2;x>0;x-=2)r.push_back(v[x]);
		send(r);
	};
	auto se=[&](vector<int>v){
		int s=v.size(),cu=0;
		vector<int>r={cu};
		for(int x=0;x<m/2-1;x++)cu%(2*(s-m)-2)==0?cu+=s-m:cu++,r.push_back(cu);
		cu++,r.push_back(cu),cu-=(s-m),r.push_back(cu);
		for(int x=0;x<m/2-2;x++)cu%(2*(s-m)-2)==1?cu-=s-m:cu--,r.push_back(cu);
		for(auto&i:r)i=v[i];
		send(r);
	};
	for(int x=0;x<n;x++)a[x]=P[x];
	if(m==2){
		decomp();
		for(int i=0;i<nc;i++)for(int x=1;x<c[i].size();x++)Bob({c[i][0],c[i][x]});
		return n;
	}
	for(int x=0;x<E;x++)al[U[x]].push_back(V[x]),al[V[x]].push_back(U[x]),e[x]={U[x],V[x]};
	int ans=0,r=0;
	for(int x=0;x<n;x++)ans+=(a[x]==x);
	bool bad=ans>=n-m+1;
	for(int x=0;x<m;x++)if(al[x].size()>=3)bad=1;
	if(bad)return ans;
	for(int x=0;x<m;x++)if(al[x].size()==1)r=x;
	ch={r};
	for(int x=0;x<m-1;x++)for(auto i:al[ch.back()])if(ch.size()==1||ch[ch.size()-2]!=i){ch.push_back(i);break;}
	if(E+1==m||(m%2==0&&ans==n-m)){
		while(decomp()>=m){
			vector<int>v;
			for(int i=0;i<nc;i++)v.insert(v.end(),c[i].begin(),c[i].end());
			v.resize(m);
			send(v);
		}
		return n-m+1;
	}
	else if(m&1){
		int g=n-decomp(),od=0,sz=0,ex=0;
		for(int i=0;i<nc;i++)c[i].size()%2==1?od++:sz+=c[i].size();
		for(int i=0;i<nc;i++)if(c[i].size()%2==1&&sz<m)ex++,sz+=c[i].size();
		g+=od-2*(ex/2);
		while(decomp()>n-g){
			vector<int>v;
			bool done=0;
			for(int i=0;i<nc&&!done;i++)if(c[i].size()%2==1){
				if(c[i].size()>m)so(c[i]),done=1;
				else if(c[i].size()==m)send(c[i]),done=1;
			}
			if(!done){
				for(int i=0;i<nc;i++)if(c[i].size()%2==0)v.insert(v.end(),c[i].begin(),c[i].end());
				while(v.size()>m-1)v.pop_back();
				for(int i=0;i<nc;i++)if(c[i].size()%2==1)v.insert(v.end(),c[i].begin(),c[i].end());
				v.resize(m);
				send(v);
			}
		}
		return g;
	}
	else{
		while(decomp()>m+1){
			int t=0;
			vector<int>v;
			bool done=0;
			for(int i=0;i<nc&&!done;i++)if(c[i].size()==m)send(c[i]),done=1;
			for(int i=0;i<nc&&!done;i++)if(c[i].size()>=m+2)se(c[i]),done=1;
			if(!done){
				for(int i=0;i<nc;i++)if(c[i].size()>2)t+=c[i].size();
				if(t<m+2)break;
				for(int i=0;i<nc;i++){
					v.insert(v.end(),c[i].begin(),c[i].end());
					if(v.size()==c[i].size()&&v.size()>m-1)v.resize(m-1);
				}
				v.resize(m),send(v);
			}
		}
		while(decomp()>m+1){
			vector<int>v;
			bool done=0;
			for(int i=0;i<nc&&!done;i++)if(c[i].size()==m)send(c[i]),done=1;
			for(int i=0;i<nc&&!done;i++)if(c[i].size()>=2*m-1)se(c[i]),done=1;
			if(!done){
				if(nc==1)break;
				for(int i=0;i<nc;i++){
					v.insert(v.end(),c[i].begin(),c[i].end());
					if(v.size()==c[i].size()&&v.size()>m-1)v.resize(m-1);
				}
				v.resize(m);
				send(v);
			}
		}
		while(decomp()>m+1){
			if(c[0].size()==m)send(c[0]);
			else if(c[0].size()>=m+2)se(c[0]);
			else{
				vector<int>v;
				for(int i=0;i<nc;i++)v.insert(v.end(),c[i].begin(),c[i].end());
				v.resize(m),send(v);
			}
		}
		return n-m-1;
	}
}
#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...