[POI2012]Odległość
[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ść的更多相关文章
- 2795: [Poi2012]A Horrible Poem
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 484 Solved: 235[Subm ...
- [BZOJ2803][Poi2012]Prefixuffix
2803: [Poi2012]Prefixuffix Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 219 Solved: 95[Submit][St ...
- [BZOJ2799][Poi2012]Salaries
2799: [Poi2012]Salaries Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 91 Solved: 54[Submit][Statu ...
- [BZOJ2797][Poi2012]Squarks
2797: [Poi2012]Squarks Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 211 Solved: 89[Submit][Status ...
- [BZOJ2791][Poi2012]Rendezvous
2791: [Poi2012]Rendezvous Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 95 Solved: 71[Submit][Sta ...
- [BZOJ2795][Poi2012]A Horrible Poem
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 261 Solved: 150[Subm ...
- [BZOJ2794][Poi2012]Cloakroom
2794: [Poi2012]Cloakroom Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 167 Solved: 119[Submit][St ...
- [BZOJ2793][Poi2012]Vouchers
2793: [Poi2012]Vouchers Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 316 Solved: 148[Submit][Stat ...
- [BZOJ2792][Poi2012]Well
2792: [Poi2012]Well Time Limit: 40 Sec Memory Limit: 64 MBSubmit: 137 Solved: 61[Submit][Status][D ...
随机推荐
- JS学习笔记Day16
一.匀速运动 保证速度不让用户提供,将速度写到函数中 speed = target-obj.offsetLeft>0 ? 正速度 :负速度 二.缓冲运动 var speed=(target-ob ...
- (二叉树 BFS) leetcode102. Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- 微信小程序之动态获取元素宽高
我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了... 那么,这个api接口怎么用 ...
- JQuery 的遍历方法 $.each
博主呢最近在公司实习,发现公司基本上都会统一代码风格,今天看到还有很多事用JQuery写的js 请求Ajax与后台进行数据交互的方式 当我看到$each 遍历时 然我想起我学JQuery的时候 于是复 ...
- Go语言系列(三)- 基础函数和流程控制
一.strings和strconv的使用 1. strings.HasPrefix(s string, prefix string) bool:判断字符串s是否以prefix开头 . 2. strin ...
- 老男孩Python全栈学习 S9 日常作业 007
1.把列表中所有姓周的人的信息删掉 lst = ['周老二', '周星星', '麻花藤', '周扒皮'] lst = ['周老二', '周星星', '麻花藤', '周扒皮'] lst2 = [] fo ...
- Vim使用技巧汇总
一 写在开头 1.1 本文内容 Vim使用技巧与学习资源汇总. 二 Vim学习资源 1. Vimtutor 2. Vim中文帮助(http://vimcdoc.sourceforge.net/doc/ ...
- 第五节: EF高级属性(一) 之 本地缓存、立即加载、延迟加载(不含导航属性)
一. 本地缓存 从这个章节开始,介绍一下EF的一些高级特性,这里介绍的首先介绍的EF的本地缓存,在前面的“EF增删改”章节中介绍过该特性(SaveChanges一次性会作用于本地缓存中所有的状态的变化 ...
- requests session operation
# encoding:utf-8# baseic usage of requests.sessionsimport requestsfrom requests import sessions r = ...
- Python3:关于列表的操作(合并、拼接,嵌套排序··)
一:# 将2个列表合并成字典,按最少个数key=['winnie','anna','lisa']value=[18,20,22] k_v=dict(zip(key,value))print(k_v) ...