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]<<" ";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值