[AT2306]Rearranging(拓扑序)
[AT2306]Rearranging(拓扑序)
题面(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(拓扑序)的更多相关文章
- 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)
3832: [Poi2014]Rally Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 168 Solved: ...
- BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)
无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...
- hdu5438(2015长春赛区网络赛1002)拓扑序+DFS
题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...
- poj3553 拓扑序+排序贪心
题意:有多个任务,每个任务有需要花费的时间和最后期限,任务之间也有一些先后关系,必须先完成某个才能开始某个,对于每个任务,如果没有越期,则超时为0,否则超时为结束时间-最后期限,求总超时时间最小的任务 ...
- poj2762 强连通+拓扑序
题意:有 n 个房间,不同房间之间有单向通道,问是否任意两个房间 A .B 都可以从 A 到 B 或从 B 到 A(有一条有就可以). 在这题中,如果一些点是在同一个强连通分量中,那么这些点肯定能够相 ...
- poj1420 拓扑序
题意:给出一个表格,一部分单元格是给定的数字,而另一部分单元格则是一个式子,表示是其他一些单元格的和,让你输出最后计算出的所有格子的数. 因为有些格子需要其他格子先计算出来,所以计算顺序是按照拓扑序的 ...
- poj1270 拓扑序(DFS)
题意:给出将会出现的多个字母,并紧接着给出一部分字母的大小关系,要求按照字典序从小到大输出所有符合上述关系的排列. 拓扑序,由于需要输出所有排列,所以需要使用 dfs ,只要点从小到大遍历就可以实现字 ...
- poj1128 拓扑序(DFS)
题意:给出一张图,它是由一系列字母框按一定顺序从下到上摆放,因此上面的字母框会覆盖一部分下面的字母框,确保每个字母框的四条边都至少会出现一个点,要求输出所有可行的摆放顺序,字典序从小到大输出. 首先可 ...
- poj3687 拓扑序
题意:有编号 1-n 的球,每个球的质量不同,质量从 1 到 n 不等,给出一系列比较,分别是两个编号的球的大小关系,求一个序列满足上述关系,并且从编号 1 开始依次选择可选的最小质量,输出每个球的质 ...
随机推荐
- traceroute实用命令总结
在工作中,我们经常会使用到traceroute进行追踪路由,从而判断网络的故障点,或者网络策略限制等原因.对于网络排查traceroute还是有很大用处的. 一.traceroute常用命令参数 用法 ...
- python的import语句
1.import作用 import跟C/C++中的#include作用有点类似,都是为了调用定义在其他文件中的变量.函数或者类,但实现的区别很大. C/C++中如果a.cpp include了b.h那 ...
- GAN实战笔记——第三章第一个GAN模型:生成手写数字
第一个GAN模型-生成手写数字 一.GAN的基础:对抗训练 形式上,生成器和判别器由可微函数表示如神经网络,他们都有自己的代价函数.这两个网络是利用判别器的损失记性反向传播训练.判别器努力使真实样本输 ...
- 扫盲贴:2021 CSS 最冷门特性都是些啥?
最近几年 CSS 界的大事之一是每年年底的 <State Of CSS>,也就是 CSS 现状调查,去年年底发布了<State Of CSS 2021>.其中关于特性这一章,会 ...
- 乘风破浪,遇见未来元宇宙(Metaverse)之进入元宇宙世界,虚拟数字人行业洞察报告
正值元宇宙热潮,虚拟数字人兴起 作为⼀个新兴领域,虚拟数字⼈已经引起市场和资本的⾼度关注,截⾄目前据不完全统计,全球范围已有500+虚拟数字人相关项目获得融资,融资总额超10亿美元,并且融资项目和总额 ...
- oracle-11G转10G
先查询directory的地址 导出的文件必须放在此目录select * from dba_directories;找到directory_name的值 ,也可以新建一个create director ...
- 案例十:shell编写nginx服务启动程序
使用源码包安装的Nginx没办法使用"service nginx start"或"/etc/init.d/nginx start"进行操作和控制,所以写了以下的 ...
- 案例五:shell脚本实现定时监控http服务的运行状态
注意:监控方法可以为端口.进程.URL模拟访问方式,或者三种方法综合. 说明:由于截止到目前仅讲了if语句,因此,就请大家用if语句来实现. [root@oldboy-B scripts]# cat ...
- 【CPU】进程管理之五状态模型
本文为第三篇,进程管理之五状态模型,进程在操作系统里边是有多个状态的,本文就是了解进程在操作系统中的多个状态 1.进程的五个状态 创建状态 就绪状态 阻塞状态 执行状态 终止状态 2.进程处于这五种状 ...
- 商城秒杀系统总结(Java)
本文写的较为零散,对没有基础的同学不太友好. 一.秒杀系统项目总结(基础版) classpath 在.properties中时常需要读取资源,定位文件地址时经常用到classpath 类路径指的是sr ...