CF 765D Artsem and Saunders 构造
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]<<" ";}
}