[POI2012]Odległość

题目大意:

一个长度为\(n(n\le10^5)\)的序列\(A(1\le A_i\le10^6)\),定义\(d(i,j)\)为每次对\(A_i,A_j\)中的一个数乘一个质数\(p\),让\(A_i=A_j\)的最少操作步数。

对于每个\(i\),求能使\(d(i,j)\)最小的\(j\),若有多个解,输出最小的\(j\)。

思路:

用\(f(x)\)表示\(x\)所有质因子次数之和,则\(d(i,j)=f(A_i)+f(A_j)-2f(\gcd(A_i,A_j))\)。

对于每个\(A_i\),枚举其约数作为\(\gcd\),对于每个约数记录其倍数\(x\)中最小、次小的\(f(x)\)。

时间复杂度\(\mathcal O(n\sqrt m)\)。

这样能在BZOJ通过,但是不能在SZKOpuł上通过。官方题解提供的做法是\(\mathcal O(n\log\log n)\)。

源代码:

#include<cstdio>
#include<cctype>
#include<climits>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1e5+1,A=1e6+1;
int a[N],d[A],p[A];
bool vis[A];
std::pair<int,int> min[A][2];
inline void sieve(const int &n) {
for(register int i=2;i<=n;i++) {
if(!vis[i]) {
d[i]=1;
p[++p[0]]=i;
}
for(register int j=1;p[j]*i<=n;j++) {
vis[p[j]*i]=true;
d[p[j]*i]=d[i]+1;
if(i%p[j]==0) break;
}
}
}
inline void upd(const int &j,const int &i) {
std::pair<int,int> tmp=std::make_pair(d[a[i]]-d[j]*2,i);
if(tmp<min[j][0]) std::swap(tmp,min[j][0]);
if(tmp<min[j][1]) std::swap(tmp,min[j][1]);
}
int main() {
const int n=getint();
for(register int i=1;i<=n;i++) {
a[i]=getint();
}
const int m=*std::max_element(&a[1],&a[n]+1);
sieve(m);
for(register int i=1;i<=m;i++) {
min[i][0]=min[i][1]=std::make_pair(INT_MAX,INT_MAX);
}
for(register int i=1;i<=n;i++) {
for(register int j=1;j*j<=a[i];j++) {
if(a[i]%j) continue;
upd(j,i);
if(j*j!=a[i]) upd(a[i]/j,i);
}
}
for(register int i=1;i<=n;i++) {
std::pair<int,int> ans=std::make_pair(INT_MAX,INT_MAX);
for(register int j=1;j*j<=a[i];j++) {
if(a[i]%j) continue;
ans=std::min(ans,min[j][min[j][0].second==i]);
ans=std::min(ans,min[a[i]/j][min[a[i]/j][0].second==i]);
}
printf("%d\n",ans.second);
}
return 0;
}

[POI2012]Odległość的更多相关文章

  1. 2795: [Poi2012]A Horrible Poem

    2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 235[Subm ...

  2. [BZOJ2803][Poi2012]Prefixuffix

    2803: [Poi2012]Prefixuffix Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 219  Solved: 95[Submit][St ...

  3. [BZOJ2799][Poi2012]Salaries

    2799: [Poi2012]Salaries Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 91  Solved: 54[Submit][Statu ...

  4. [BZOJ2797][Poi2012]Squarks

    2797: [Poi2012]Squarks Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 211  Solved: 89[Submit][Status ...

  5. [BZOJ2791][Poi2012]Rendezvous

    2791: [Poi2012]Rendezvous Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 95  Solved: 71[Submit][Sta ...

  6. [BZOJ2795][Poi2012]A Horrible Poem

    2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 261  Solved: 150[Subm ...

  7. [BZOJ2794][Poi2012]Cloakroom

    2794: [Poi2012]Cloakroom Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 167  Solved: 119[Submit][St ...

  8. [BZOJ2793][Poi2012]Vouchers

    2793: [Poi2012]Vouchers Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 316  Solved: 148[Submit][Stat ...

  9. [BZOJ2792][Poi2012]Well

    2792: [Poi2012]Well Time Limit: 40 Sec  Memory Limit: 64 MBSubmit: 137  Solved: 61[Submit][Status][D ...

随机推荐

  1. 百度在职 iOS 架构师的成长笔记,送给还在迷茫的你!

    前言 我们经常在网上会看到这样的文章,你的同龄人正在如何如何.......这是典型的贩卖焦虑的文章.的确,现阶段,刚毕业几年的年轻人,面临车,房子等,有时候压力挺大的. 但你过度焦虑的话,每天生活在恐 ...

  2. ASP.NET Web API 2 之路由配置

    Ø  简介 ASP.NET Web API 路由配置也是必须掌握的技术点之一,要真正的完全掌握和理解它也是需要一定的过程的.不过,在平常的开发过程中,对它有基本的了解就足够了.因为我们主要关注点并不在 ...

  3. How far away ? HDU - 2586 【LCA】【RMQ】【java】

    题目大意:求树上任意两点距离. 思路: dis[i]表示i到根的距离(手动选根),则u.v的距离=dis[u]+dis[v]-2*dis[lca(u,v)]. lca:u~v的dfs序列区间里,深度最 ...

  4. Java(6)for循环

    一.for循环的使用场合 1.1.while循环——先判断,再循环 while(1.条件表达式){      //2.循环操作      //3.更改循环条件表达式 } 1.2.do…while——先 ...

  5. audio autoplay 是pause 不会停止播放

    $("#alarmWav").append( $('<audio id="alarmAudio" autoplay loop src="../j ...

  6. stm32F10x复习-1

    地点:家 1.库文件说明 _htmresc: LOGO的设计图 Libraries: 源代码及启动文件 -- CoreSupport 核内设备函数层的CM3核通用的源文件.作用是为采用Cortex-M ...

  7. BootStrap分页教程

    https://www.cnblogs.com/laowangc/p/8875526.html https://www.cnblogs.com/yinglunstory/p/6092834.html ...

  8. Django-1-URL路由系统

    一.分发地址 在APP中创建urls.py文件,将属于该APP的url地址都写入到这个文件中,当程序收到用户发送的请求时,先在根目录的urls.py文件中查找该地址属于哪个APP,将这个请求分发到该A ...

  9. c#基础之Type

    官方文档:https://msdn.microsoft.com/zh-cn/library/system.type%28v=vs.110%29.aspx?f=255&MSPPError=-21 ...

  10. CentOS7上部署taiga项目管理软件

    作者:waringid 一.简介 Taiga 是一个免费开源,而且功能非常强大的项目管理平台,用于初创企业和敏捷开发团队.提供一个简单.漂亮的项目管理工具.Taiga 采用 Python Django ...