zoukankan      html  css  js  c++  java
  • codeforces 765 D Artsem and Saunders

    传送门

    题意:给你一个函数f[x],问你是否存在满足 g(h(x)) = x for all , and h(g(x)) = f(x) for all , 的两个函数

    题解:先化简公式得到一个构造g(x)的公式,g(x)=g(f(x)),并查集将x和f(x)捆绑起来,然后for一遍g(x)这个函数,将属于同一个集团里面的编上相同的号码,然后推出公式h(x)=f(h(x))得到h(x)函数的值,最后用题目条件分别check一下生成的函数

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <map>
    #include <queue>
    #include <vector>
    #include <cstring>
    #include <iomanip>
    #include <set>
    #include<ctime>
    #include<unordered_map>
    //CLOCKS_PER_SEC
    #define se second
    #define fi first
    #define ll long long
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define Pii pair<int,int>
    #define Pli pair<ll,int>
    #define ull unsigned long long
    #define pb push_back
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    const int N=1e6+10;
    const ull base=163;
    const int INF=0x3f3f3f3f;
    using namespace std;
    int f[N],g[N],h[N];
    int fa[N];
    int F(int x){
        return fa[x]==x?x:fa[x]=F(fa[x]);
    }
    map<int,int>mp;
    int main(){
        fio;
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>f[i];
        }
        for(int i=1;i<=N-5;i++)fa[i]=i;
        for(int i=1;i<=n;i++){
            int u=i,v=f[i];
            u=F(i),v=F(v);
            if(u!=v){
                fa[u]=v;
            }
        }
        int m=0;
        for(int i=1;i<=n;i++){
            if(!mp[F(f[i])]){
                mp[F(f[i])]=++m;
            }
            g[i]=mp[F(f[i])];
        }
        for(int i=1;i<=n;i++){
            h[g[i]]=f[i];
        }
        for(int i=1;i<=n;i++){
            if(h[g[i]]!=f[i]){
                return cout<<-1,0;
            }
        }
        for(int i=1;i<=m;i++){
            if(g[h[i]]!=i){
                return cout<<-1,0;
            }
        }
        cout<<m<<endl;
        for(int i=1;i<=n;i++){
            cout<<g[i]<<" ";
        }
        cout<<endl;;
        for(int i=1;i<=m;i++){
            cout<<h[i]<<" ";
        }
        return 0;
    }
  • 相关阅读:
    Shell脚本学习笔记2
    Shell脚本学习笔记1
    华大MCU硬件SMBus的应用
    华大MCU的应用中的问题记录
    STM32定时器输入捕获功能应用——超声波模块
    STM32定时器应用——PWM
    利用KEIL的软件仿真的逻辑分析仪功能观察GPIO的波形
    周期性过程数据通信和非周期性邮箱数据通信
    JDBCUtils
    反射
  • 原文地址:https://www.cnblogs.com/Mrleon/p/9098848.html
Copyright © 2011-2022 走看看