CF765D Artsem and Saunders
直接猜一种构造做法,
h
(
x
)
h(x)
h(x)的值域一定和
f
(
x
)
f(x)
f(x)的值域一样,我们先满足
h
(
g
(
x
)
)
=
f
(
x
)
h(g(x))=f(x)
h(g(x))=f(x)这个条件,遍历
f
(
x
)
f(x)
f(x),每次添加
h
(
x
)
h(x)
h(x)中暂时没有的数,然后标记一下它在
h
(
x
)
h(x)
h(x)中的下标
m
p
mp
mp,并令
g
x
=
m
p
g_{x}=mp
gx=mp,这样就强制满足了条件,然后再去枚举
x
x
x看构造出来的
h
h
h 和
g
g
g ,是否满足另一个条件
const int N=1e5+5;
int mp[N],cnt;
void solve(){
int n;
std::cin>>n;
std::vector<int> a(n+1);
std::vector<int> g(n+1),h(n+1);
for (int i=1;i<=n;i++){
std::cin>>a[i];
if (!mp[a[i]]){
mp[a[i]]=++cnt;
h[cnt]=a[i];
}
g[i]=mp[a[i]];
}
for (int i=1;i<=cnt;i++){
if (g[h[i]]!=i){
std::cout<<"-1\n";
return;
}
}
std::cout<<cnt<<"\n";
for (int i=1;i<=n;i++){
std::cout<<g[i]<<" ";
}
std::cout<<"\n";
for (int i=1;i<=cnt;i++){
std::cout<<h[i]<<" ";
}
}