P5610 [Ynoi2013] 大学
-
傻逼卡常题
-
发现自己基础数据结构用的还不是很熟练,并没有想到一开始的 \(set\) 做法,更不用提后面的并查集优化了
-
首先每个数最多被进行 \(O(\log A)\) 次有效除法,如果我们找到区间中哪些数要被除后直接暴力用树状数组单点修改,可以做到 \(O(n \log n \log A)\),因此现在的问题是找到这些书
-
一个数的因数大约有 \(O(A^{\frac{1}{3}})\),个,所以考虑把所有拥有因数 \(i\) 的放到第 \(i\) 个集合中,用数据结构维护,需要支持以下操作:
-
删除一个数
-
\(lower\_bound\)
-
查询一个数的值
-
-
平衡树可以,但是过不去
-
发现没有插入操作,直接并查集跑
-
然后你会发现你 \(TLE\) 了
毕竟这是由乃题 -
优化:
-
不要暴力分解因数,而是用筛子做到 \(O(nA^{\frac{1}{3}})\)
-
处理因数时不要用 \(vector\),不然会增加 \(1.5 \sim 3\) 倍常数,写邻接表
-
不要用 \(vector\),用内存池
-
不要用
C++14 (GCC 9)
提交,而是用C++14
提交 (我也不知道这是什么原因)
-
-
然后应该就可以过了
-
最终复杂度 \(O(nA^{\frac{1}{3}} + A \log A + n \log n)\)