bzoj P1607

本题用暴力模拟就能过了,但是还是需要加一些优化。。

枚举一下每个a[i]值,然后判断吗??

这样对于10万的数据来说很容易炸。。

所以,我们又发现,相同的a[i]是可以一次算出来的,于是我们就开一个f数组,

表示置为i的数是否被计算过,如果计算过,那么就直接保存答案。。

这个思想类似于记忆化搜索。。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,a[100010],f[1000010],ans[1000010],q;
int main(){
scanf(
"%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),f[a[i]]++,q=max(q,a[i]);
for(int i=1;i<=n;i++){
if(f[a[i]]){
int k=a[i];
while(k<=q){
ans[k]
+=f[a[i]];
k
+=a[i];
}
}
f[a[i]]
=0;
}
for(int i=1;i<=n;i++)printf("%d\n",ans[a[i]]-1);
return 0;
}

 

posted @ 2017-10-23 18:31  Accelerator-D-x  阅读(122)  评论(0编辑  收藏  举报