zoukankan      html  css  js  c++  java
  • AGC010E Rearranging

    Link
    若两个数并不互质,那么后手是无法改变这两个数的相对顺序的。
    那么我们把所有不互质的数之间建一条无向边,先手的操作就是给边定向使得每个连通块都是个DAG,后手就是求最大字典序。
    不难发现先手最优的策略是对于每个连通块选一个最小的作为起点,然后每次往最小的能够走到的点dfs。

    #include<queue>
    #include<cctype>
    #include<cstdio>
    #include<vector>
    #include<utility>
    #include<algorithm>
    const int N=2007;
    using pi=std::pair<int,int>;
    int n,a[N],vis[N],deg[N];std::vector<int>e[N];std::priority_queue<pi>q;
    int read(){int x=0,c=getchar();while(isspace(c))c=getchar();while(isdigit(c))(x*=10)+=c&15,c=getchar();return x;}
    void dfs(int u)
    {
        for(int v=vis[u]=1;v<=n;++v) if(!vis[v]&&std::__gcd(a[u],a[v])>1) e[u].push_back(v),++deg[v],dfs(v);
    }
    int main()
    {
        n=read();
        for(int i=1;i<=n;++i) a[i]=read();
        std::sort(a+1,a+n+1);
        for(int i=1;i<=n;++i) if(!vis[i]) dfs(i);
        for(int i=1;i<=n;++i) if(!deg[i]) q.emplace(a[i],i);
        for(int u;!q.empty();)
        {
    	printf("%d ",q.top().first),u=q.top().second,q.pop();
    	for(int v:e[u]) if(!--deg[v]) q.emplace(a[v],v);
        }
    }
    
  • 相关阅读:
    log4c demo
    c连接redis
    1108. IP 地址无效化
    1295. 统计位数为偶数的数字
    LCP 1. 猜数字
    1281. 整数的各位积和之差
    1313. 解压缩编码列表
    仿射变换及其变换矩阵的理解
    RNN 与 LSTM 的原理详解
    网络深度对深度学习模型性能有什么影响?
  • 原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12885151.html
Copyright © 2011-2022 走看看