#include "permgame.h"
#include <vector>
#include <utility>
#include <bits/stdc++.h>
#define dbg(x) cerr << #x << ' ' << x << endl;
#define ll long long
#define inf (ll) 1e17
using namespace std;
// vector<int> t={ind[i],i};
// int j = Bob(t);
// std::swap(p[t[u[j]]], p[t[v[j]]]);
vector<bool> vis;
vector<int> ind;
void dfs(ll node, ll par, vector<vector<ll>>& adj)
{
if(vis[node]) return;
vis[node]=true;
ind.push_back(node);
for (auto &&e : adj[node])
{
if(e!=par)
{
dfs(e,node,adj);
}
}
}
void combine(vector<int>& p, vector<int> v1, vector<int> v2, vector<int>& u, vector<int>& v)
{
vector<int> t(4);
t[ind[0]]=v1[0];
t[ind[1]]=v2[0];
t[ind[2]]=v1[1];
t[ind[3]]=v2[1];
int j = Bob(t);
std::swap(p[t[u[j]]], p[t[v[j]]]);
}
vector<vector<int>> groups(vector<int>& p)
{
vector<vector<int>> grps;
vector<bool> v(p.size(),false);
for (int i=0;i<p.size();i++)
{
if(i!=p[i] && !v[i])
{
vector<int> g;
for (int j=i;true;j=p[j])
{
v[j]=1;
g.push_back(j);
if(p[j]==i) break;
}
grps.push_back(g);
}
}
return grps;
}
int Alice(int m, int e, std::vector<int> u, std::vector<int> v, int n, std::vector<int> p) {
vector<vector<ll>> adj(m);
vis.assign(n,0);
ll curans=0;
for (int i=0;i<n;i++)
{
curans+=p[i]==i;
}
for (int i=0;i<e;i++)
{
adj[u[i]].push_back(v[i]);
adj[v[i]].push_back(u[i]);
}
for (int i=0;i<m;i++)
{
if(adj[i].size() > 2)
{
return curans;
}
}
dfs(0,0,adj);
vis.assign(n,0);
for (int i=0;i<n;i++)
{
if(p[i]!=i && !vis[i])
{
vector<int> g;
for (int j=i;true;j=p[j])
{
vis[j]=true;
g.push_back(j);
if(p[j]==i) break;
}
while(g.size() > 4)
{
vector<int> t(4);
t[ind[0]]=g[0];
t[ind[1]]=g[1];
t[ind[2]]=g[3];
t[ind[3]]=g[4];
int j = Bob(t);
std::swap(p[t[u[j]]], p[t[v[j]]]);
g.clear();
for (int j=i;true;j=p[j])
{
g.push_back(j);
if(p[j]==i) break;
}
}
}
}
vis.assign(n,0);
while(true)
{
bool salina=true;
vector<vector<int>> grps=groups(p);
for (auto &&g : grps)
{
while(g.size() > 4)
{
salina=false;
ll indx=g[0];
vector<int> t(4);
t[ind[0]]=g[0];
t[ind[1]]=g[1];
t[ind[2]]=g[3];
t[ind[3]]=g[4];
int j = Bob(t);
std::swap(p[t[u[j]]], p[t[v[j]]]);
g.clear();
for (int j=indx;true;j=p[j])
{
g.push_back(j);
if(p[j]==indx) break;
}
}
}
grps=groups(p);
for (auto &&g : grps)
{
if(g.size()==4)
{
salina=false;
vector<int> t(4);
t[ind[0]]=g[0];
t[ind[1]]=g[1];
t[ind[2]]=g[2];
t[ind[3]]=g[3];
int j = Bob(t);
std::swap(p[t[u[j]]], p[t[v[j]]]);
}
}
grps=groups(p);
sort(grps.begin(), grps.end(),[](vector<int>& g1, vector<int>& g2){return g1.size() < g2.size();});
for (int i=1;i<grps.size();i++)
{
if(grps[i].size() == grps[i-1].size())
{
salina=false;
combine(p,{grps[i][0],grps[i][1]},{grps[i-1][0],grps[i-1][1]},u,v);
break;
}
}
if(salina)break;
}
ll cnt=0;
for (int i=0;i<n;i++)
{
cnt+=p[i]==i;
}
return cnt;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |