P5610 [Ynoi2013] 大学

[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)\)

posted @ 2024-04-10 19:28  FOX_konata  阅读(3)  评论(0编辑  收藏  举报