|
沙发
楼主 |
发表于 2021-11-8 10:31:51
|
只看该作者
考察点:逆向思维,数据结构维护。
1、直接模拟,用数组存,每次加入后把其他数往后移。
2、给各种加break、揣摩数据的乱搞qwq。
3、虽然实际情况是按时间顺序向长链中插入元素,但是随着元素的插入,链也不断发生着变化,这样除了模拟之外没有其他很好的算法。所以,我们不妨用逆向思维去思考这个问题。
如果是逆着插入点,首先,对于每一个元素i,在它之前必有ki-1个空元素(也就是在它之前插入的未知元素),而且对于最后插入的那个元素n,它的最终位置必为kn+1, 并且不会再发生移动。
再来考虑插入的第n-1个元素:
① 如果kn-1<kn,那么第n个元素的插入不会影响到它的最终位置,所以它的最终位置为kn-1+1,满足它之前有kn-1-1个空元素。
② 如果k[n-1]>=k[n],如果它仍然要插在k[n-1]+1的位置,那么第n个元素的插入使它
之前的空元素个数为$k[n-1]-2$,小于$k[n-1]-1$。这样会导致在它之前插入的点的个数大于所能提供的位置数,则它必须插在之前有$k[n-1]-1$个空元素的位置,也就是$k[n-1]+2$。
然后对于这之前的每一个元素i,都必须插在之前有ki-1个空元素的位置(当然那个位置也要为空),所以只要从头开始数,数到有ki个空元素的位置,将其插入。
朴素算法是$O(n^2)$的,所以可以用树状数组维护。(线段树也可以)
|
|