Submission #1205030

#TimeUsernameProblemLanguageResultExecution timeMemory
1205030irmuunPermutation Game (APIO25_permgame)C++20
36 / 100
23 ms460 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; vector<int>t; int ans=0; vector<array<int,3>>d; int m,e,n; vector<int>u,v,p; vector<int>opt; 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); } } } void go(){ 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(); }); } void solve3(){ go(); for(int i=0;i<f.size();i++){ if(f[i].size()>=3&&opt[f[i].size()]>0){ int sz=f[i].size(); t[0]=f[i][d[sz][0]-1]; t[1]=f[i][d[sz][0]+d[sz][1]-1]; t[2]=f[i][d[sz][0]+d[sz][1]+d[sz][2]-1]; int j=Bob(t); swap(p[t[u[j]]], p[t[v[j]]]); solve3(); return; } } return; } int Alice(int M, int E, vector<int> U, vector<int> V, int N_, vector<int> P) { m=M,e=E,u=U,v=V,n=N_,p=P; t.resize(m); d.resize(n+5); opt.resize(n+5); 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; } for(int i=0;i<n;i++){ if(p[i]==i){ ans++; } } if(e>m){ return ans; } int start=ans; 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; } find(0); opt[1]=1; for(int i=m;i<=n;i++){ for(int j=1;j<i;j++){ for(int l=1;l+j<i;l++){ int r=i-j-l; int mn=min({opt[j]+opt[n-j],opt[l]+opt[n-l],opt[r]+opt[n-r]}); if(mn>opt[i]){ opt[i]=mn; d[i]={j,l,r}; } } } } if(e==3){ solve3(); go(); ans=0; for(int i=0;i<f.size();i++){ if(f[i].size()==1){ ans++; } } return ans; } // vector<int>bef(n+5,0); // vector<bool>dp(n+5,0); // dp[0]=true; // for(int x:v){ // for(int i=n;i>=0;i--){ // if(dp[i]){ // if(i+x<=n&&!dp[i+x]){ // dp[i+x]=true; // bef[i+x]=x; // } // } // } // } // if(!dp[n]){ // return ans; // } // vector<int>num; // int cur=n; // while(cur>0){ // num.pb(bef[cur]); // cur-=bef[cur]; // } // if(e==3){ // return ans; // } int play=n*10; int mx=0; bool reach=false; 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++; } } mx=max(mx,cnt); if(cnt>=max(n-m+1,start)){ reach=true; break; } } } if(!reach){ return max(n-m+1,start); } return max(n-m+1,start); }
#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...