题目

分析

首先我们知道,原A序列其实表示一个矩阵,而这个矩阵的对角线上的数字就是答案B序列。

接着\(a、b>=gcd(a,b)\),所以序列A中的最大的数就是ans[1],第二大的数就是ans[2]。

但是ans[3]并不一定就是序列A中的第三大的数,因为gcd(ans[1],ans[2])有可能是序列A中的第三大的数。

所以但找到了ans[i],对于每个gcd(ans[i],ans[1~i-1])在序列A中删掉两个(就是删掉2(i-1)个。为什么是两个自己考虑)。时间复杂度\(O(n^2log_2n)\)

至于如何删掉gcd(ans[i],ans[1~i-1]),有两种方法:hash和二分

这里讲二分的方法:

因为已经将序列A从大到小排好了序,接着二分出位置最小的gcd(ans[i],ans[1~i-1])的位置,设位置为pos,接着将bz[pos]、bz[pos+1]赋值为false。

再设next,将next[pos]加二,下次删除就从next[pos]开始。如此类推。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=1005;
using namespace std;
int a[N*N],sum[N*N],n,m,ans[N*N],tot,next[N*N];
bool bz[N*N];
bool cmp(int x,int y)
{
return x>y;
}
int gcd(int x,int y)
{
if(y==0) return x;
if(x<y) return gcd(y,x);
else return gcd(y, x%y);
}
int rf(int l,int r,int p)
{
while(l+1<r)
{
int mid=(l+r)/2;
if(a[mid]>p)
l=mid;
else
r=mid;
}
if(p==a[l])
return l;
else
return r;
}
int main()
{
scanf("%d",&n);
a[0]=maxlongint;
memset(bz,true,sizeof(bz));
for(int i=1;i<=n*n;i++)
{
scanf("%d",&a[i]);
next[i]=i;
}
sort(a+1,a+n*n+1,cmp);
ans[1]=a[1];
int k=1;
for(int i=2;i<=n*n && k<n;i++)
{
if(bz[i])
{
ans[++k]=a[i];
for(int j=1;j<=k-1;j++)
{
int p=gcd(ans[j],ans[k]);
int pos=rf(i+1,n*n,p);
bz[next[pos]]=bz[next[pos]+1]=false;
next[pos]=next[pos]+2;
}
}
}
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
}

最新文章

  1. APIO2015简要题解
  2. 关于HTML标签(元素)的那些事?
  3. android 根据包名打开app程序
  4. AVAudioPlayer 播放音频
  5. Arch linux安装
  6. Python 学习之urllib模块---用于发送网络请求,获取数据(3)
  7. 响应式web前端框架Foundation &amp; Bootstrap 对比
  8. Dubbo和Spring Cloud
  9. How to find SPRO path by t-code name
  10. vim 基础命令大全
  11. 修改主机IP地址
  12. 杭高OI20190125 (genies出题)
  13. Route Between Two Nodes in Graph
  14. 『科学计算』L0、L1与L2范数_理解
  15. JSTORM 问题排查
  16. ADC新库
  17. bzoj 1109
  18. java程序结构
  19. git 学习之基本操作
  20. 一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)

热门文章

  1. unieap platform eclipse.ini vm设置
  2. 【OpenCV开发】OpenCV:使用VideoCapture类进行视频读取和显示
  3. selenium:css_selector定位详解
  4. 基于vant实现一个问卷调查
  5. 未能加载文件或程序集“microsoft.Build.Engine, Version=3.5.0.0,...”或它的摸一个依赖项。
  6. 2019JAVA第三次实验报告
  7. tableau日常管理
  8. [转帖]预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响
  9. SpringBoot_01
  10. java来接收邮件并解析邮件正文中的表格