关于 STL 的大常数

P1908 逆序对

y_kx_b @ 2023-03-22 10:22:03

rt,使用了早年自己想出来的 sb 离散化(std::set + std::map),然后发现后一半点全 T 了还都 1.2s(开了 O2 后 700ms 左右)

思路:用 set 去重 + 排序,然后用 map 从原来的值映射到现在的离散化值

应该就用了大概 4n 次 STL O(\log n) 操作,然后跑不过 5\times10^5/kk

算了一下不算常数的话操作数大概是 4\times10^7,可洛谷不是 1s 能跑 5e8 吗,STL 常数真的大如 10 吗/jk

T 50pts 代码


by y_kx_b @ 2023-03-22 10:22:56

违规紫衫


by BFSDFS123 @ 2023-03-22 11:18:02

@y_kx_b 首先膜拜您/bx

但是为什么要用 set 和 map 离散化啊(,可以直接 map 离散化(毕竟 map 是会自动排序的)


by BFSDFS123 @ 2023-03-22 11:30:39

@y_kx_b 试了一下自己的 map 离散化也是 TLE 了,应该 STL 离散化常数比较大。

当然 O2 开了也是过了,应该就是 STL 的问题。。。。。。

code


by ud2_ @ 2023-03-22 11:33:52

用平衡树排序是这样的。换成 sort 跑得飞快。


by reveal @ 2023-03-22 11:34:17

在没有 O2 的前提下讨论 STL 的效率是无意义的


by ud2_ @ 2023-03-22 11:36:04

@reveal 虽然给出的链接中没有 -O2,但帖子中有对 -O2 下效率的描述。


by reveal @ 2023-03-22 11:40:29

@ud2_ 我的意思就是没开 O2 的 STL 没过就不必放上来了。

实际上 5\times 10^5 700ms 的话手写的 Splay 也差不多这个速度。


by ud2_ @ 2023-03-22 11:52:45

@reveal 这确实。

在评测机上测试,有 ~20% 的时间花在动态内存分配上。如果“差不多这个速度”的手写平衡树使用静态内存池,那么这反而证明标准库常数小。


by y_kx_b @ 2023-03-22 11:57:53

有 ~20% 的时间花在动态内存分配上。

/bx/bx/bx


by Chancylaser @ 2023-03-22 12:07:01

不开O2不要相信STL,用STL的情况下可以把总体时间复杂度先乘个log(,然后再决定是否使用


| 下一页