TLE #2#3求助

P2926 [USACO08DEC] Patting Heads S

@[ztr2022](/user/713387) 最坏时间复杂度为 $\mathcal{O}(nm)$,$a_i$ 来个 $1$ 就寄了。还需要优化。
by NightStriker @ 2022-12-24 10:32:08


@[_ljp_](/user/714084) 但是这个已经优化到极致了吧……
by ztr_qwq @ 2022-12-24 10:36:51


我再想想
by ztr_qwq @ 2022-12-24 10:37:21


@[ztr2022](/user/713387) 没看题,但是[这](https://www.luogu.com.cn/blog/soul-spirit/solution-p2926)篇题解似乎能好一点?
by NightStriker @ 2022-12-24 10:38:10


@[_ljp_](/user/714084) 想出来了,已优化至O(nlogn)并AC,thx,此贴完结
by ztr_qwq @ 2022-12-24 10:46:36


@[ztr_qwq](/user/713387) 求助,我写了自认为是O(nlogn)的解法,但是还是测试点2和3超时,楼主或许可以分享一下修改之后的代码吗?我的86分代码如下 ```c++ #include <iostream> #include<vector> using namespace std; int main() { vector<int>count(1000001, 0); //记录每个数出现的约数个数 int N;cin >> N; vector<int>nums(N); int maxNum = 0; vector<int>cnt(N, 0); for (int i = 0; i < N; i++) { cin >> nums[i]; cnt[i]++; maxNum = max(nums[i], maxNum); } for (int i = 0; i < N; i++) { for (int j = nums[i]; j <= maxNum ; j += nums[i]) { count[j]+=cnt[i]; } } for (int i = 0; i < N; i++) { cout << count[nums[i]]-1 << endl; } }
by 耿耿要逆袭 @ 2023-03-25 16:30:51


@[耿耿要逆袭](/user/446823) 你这个和我一样,来个1就寄了 或许可以利用一个类似于哈希的思想? 而且不想你这样这么麻烦捏…… 改正后代码: ```cpp #include <bits/stdc++.h> using namespace std; const int N=1e6+1; int a[N/10],cnt[N],ans[N]; int main() { int n,m=0; scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); cnt[a[i]]++; } for(int i=1;i<=N;i++) for(int j=i;j<=N;j+=i) ans[j]+=cnt[i]; for(int i=1;i<=n;i++) printf("%d\n",ans[a[i]]-1); return 0; } ```
by ztr_qwq @ 2023-03-26 07:10:57


@[耿耿要逆袭](/user/446823) 当然最主要的还是筛选捏
by ztr_qwq @ 2023-03-26 07:13:14


@[耿耿要逆袭](/user/446823) 你珂以看看这个代码,对比一下有什么不同,如果不懂的话就去题解区学习一下叭qwq
by ztr_qwq @ 2023-03-26 07:16:47


@[ztr_qwq](/user/713387) 非常感谢,知道自己问题出在哪了!昨天没细看,代码压根就没优化qwq
by 耿耿要逆袭 @ 2023-03-26 10:51:04


|