[AT2306]Rearranging(拓扑序)

只有luogu

题面(luogu):

有一个$n$个数组成的序列$a_{i}$。

高桥君会把整个序列任意排列,然后青木君可以选择两个相邻的互质的数交换位置。

高桥君希望最终序列的字典序尽量小,而青木君希望字典序尽量大。求最终序列。

思路:

经过一番思考,我们发现我们可以知道的只有“不互质的数之间不能交换”

换句话说也就是两个不互质的数之间的先后是不会反转的

但通过这个我们无法得到任何推论。。。

所以只能从这个唯一条件下手了。

考虑将不互质的数连未定向边

拓扑序就是这几个元素之间的相互顺序。

单个连通块里的处理:

找到连通块里最小的一个元素作为起点之后每次找相连的最小元素继续搜。

所以还请注意一下开始连边的枚举顺序。

多个连通块:

一个堆搞定。

#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N=2333;
int a[N];
int g[N][N];
int n;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
struct sumireko{int to,ne;}e[N*1000];
int he[N],ecnt;
void addline(int f,int t)
{
e[++ecnt].to=t;
e[ecnt].ne=he[f];
he[f]=ecnt;
}
bool vv[N];
int bi;
int sp[N];
vector<int> to[N];
void dfs(int x)
{
vv[x]=1;
for(int i=he[x],t;i;i=e[i].ne)
{
t=e[i].to;
if(!vv[t])
{
to[x].push_back(t);
dfs(t);
}
}
}
priority_queue<int> q;
int main()
{
freopen("rearranging.in","r",stdin);
freopen("rearranging.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+n);
for(int i=n;i;i--)
for(int j=i-1;j;j--)
if(gcd(a[i],a[j])!=1)
addline(i,j),addline(j,i);
for(int i=1;i<=n;i++) if(!vv[i])
{
bi++;
sp[bi]=i;
dfs(i);
}
for(int i=1;i<=bi;i++)
q.push(sp[i]);
while(!q.empty())
{
int g=q.top();
q.pop();
printf("%d ",a[g]);
for(int i=0;i<to[g].size();i++) q.push(to[g][i]);
}
return 0;
}

[AT2306]Rearranging(拓扑序)的更多相关文章

  1. 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)

    3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved:  ...

  2. BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)

    无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...

  3. hdu5438(2015长春赛区网络赛1002)拓扑序+DFS

    题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...

  4. poj3553 拓扑序+排序贪心

    题意:有多个任务,每个任务有需要花费的时间和最后期限,任务之间也有一些先后关系,必须先完成某个才能开始某个,对于每个任务,如果没有越期,则超时为0,否则超时为结束时间-最后期限,求总超时时间最小的任务 ...

  5. poj2762 强连通+拓扑序

    题意:有 n 个房间,不同房间之间有单向通道,问是否任意两个房间 A .B 都可以从 A 到 B 或从 B 到 A(有一条有就可以). 在这题中,如果一些点是在同一个强连通分量中,那么这些点肯定能够相 ...

  6. poj1420 拓扑序

    题意:给出一个表格,一部分单元格是给定的数字,而另一部分单元格则是一个式子,表示是其他一些单元格的和,让你输出最后计算出的所有格子的数. 因为有些格子需要其他格子先计算出来,所以计算顺序是按照拓扑序的 ...

  7. poj1270 拓扑序(DFS)

    题意:给出将会出现的多个字母,并紧接着给出一部分字母的大小关系,要求按照字典序从小到大输出所有符合上述关系的排列. 拓扑序,由于需要输出所有排列,所以需要使用 dfs ,只要点从小到大遍历就可以实现字 ...

  8. poj1128 拓扑序(DFS)

    题意:给出一张图,它是由一系列字母框按一定顺序从下到上摆放,因此上面的字母框会覆盖一部分下面的字母框,确保每个字母框的四条边都至少会出现一个点,要求输出所有可行的摆放顺序,字典序从小到大输出. 首先可 ...

  9. poj3687 拓扑序

    题意:有编号 1-n 的球,每个球的质量不同,质量从 1 到 n 不等,给出一系列比较,分别是两个编号的球的大小关系,求一个序列满足上述关系,并且从编号 1 开始依次选择可选的最小质量,输出每个球的质 ...

随机推荐

  1. 通讯录管理系统(C++)

    前言 本程序采用VS2019开发实现 博主尽可能完善并健壮了程序功能,如有不理想之处,请加以指正,博主会在第一时间修改完善.原创不易,望"推荐","关注",&q ...

  2. Linux CentOS 搭建SVN并用钩子自动实现同步到Web目录

    linux安装配置SVN并设置钩子   安装说明 系统环境:CentOS-6.3安装方式:yum install (源码安装容易产生版本兼容的问题)安装软件:系统自动下载SVN软件 检查已安装版本 # ...

  3. 定制Centos7.9镜像

    Ps:因为工作内容:有一部份是需要重装系统:系统版本镜像为centos7.9.可每次装完都需要下载一些基础包:最近因为设备过多:网卡名称太乱:导致做后续配置太繁琐:不规整:索性自己定制个系统: 搭建基 ...

  4. The POM for com.alibaba:druid:jar:1.2.6 is invalid, transitive dependencies (if any) will not be available

    开发环境 IDEA2020.3,  jdk1.8.0_231 问题描述 开发中引入了druid-spring-boot-starter最新版本1.2.6,项目install时的时候一直出现警告 The ...

  5. ASP.NET Core 6框架揭秘实例演示[11]:诊断跟踪的几种基本编程方式

    在整个软件开发维护生命周期内,最难的不是如何将软件系统开发出来,而是在系统上线之后及时解决遇到的问题.一个好的程序员能够在系统出现问题之后马上定位错误的根源并找到正确的解决方案,一个更好的程序员能够根 ...

  6. 基于mysql的报表工具有哪些?值得推荐的mysql报表工具

    什么是SQL?SQL是结构化查询语言. 什么是数据库?数据库是用来存储数据的. 什么是mysql?Mysql是目前较为流行的数据库. 基于mysql的报表工具有哪些? 其实现在所有的报表工具,基本都支 ...

  7. springboot项目 @Scheduled注解 实现定时任务

    使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实 ...

  8. 【C#多态】as 类型检测(原理分析) ---用于多态检

    as(OpCodes.Castclass)功能:测试对象引用(O 类型)是否为特定类的实例.相当于:expression is type ? (type)expression : (type)null ...

  9. PDF格式简单分析

    上周因需要编辑了下PDF,用了一两个试用软件,感觉文字版的PDF还是挺好编辑的.想要研究一下PDF格式. 0. 站在前辈的肩膀上 从前辈的文章和书籍了解到 PDF文件是一种文本和二进制混排的格式,二进 ...

  10. 浅谈cache

    2021.9.22更新: <浅谈Cache Memory> http://blog.sina.com.cn/s/blog_6472c4cc0102dusv.html 为什么贴上这个链接呢, ...