平衡树做法90分求助

P1886 滑动窗口 /【模板】单调队列

Albatross_LC @ 2023-09-03 17:21:13

平衡树做法T#9

#include "cstdio"
#include "vector"
#include "algorithm"
#include "string"
using namespace std;
int n, k, a[1000010];
int mx[1000010];
vector<int> e;
int read() {
    int ret = 0, sgn = 0, ch = getchar();
    while (!isdigit(ch)) sgn |= ch == '-', ch = getchar();
    while (isdigit(ch)) ret = ret * 10 + ch - '0', ch = getchar();
    return sgn ? -ret : ret;
}
main() {
    n = read(), k = read();
    for (int i = 1; i <= n; i ++ ) {
        a[i] = read();
        e.insert(upper_bound(e.begin(), e.end(), a[i]), a[i]);
        if (i >= k) {
            if (i > k) e.erase(lower_bound(e.begin(), e.end(), a[i - k]));
            mx[i] = e[k - 1];
            printf("%d ", e[0]);
        }
    }
    printf("\n");
    for (int i = k; i <= n; i ++ )
        printf("%d ", mx[i]);
}

想用平衡树试试,但T了,有没有大佬知道怎么回事,复杂度O(n\log n)


by dbxxx @ 2023-09-03 18:34:01

vector 里 insert 的复杂度是 insert 的位置后面的元素数量,复杂度可以被卡到线性,所以整体能被卡到平方.vector 跟平衡树也没关系,我不知道 STL 常数怎么样,但是 lower_bound 和 upper_bound 实测效率和手写的差不多,有些比如 deque 的 STL 会比较慢


by Regenbogen_71 @ 2023-09-03 18:35:15

我说为什么不用pbds


by Regenbogen_71 @ 2023-09-03 18:41:14

@Albatross_LC


by 听取MLE声一片 @ 2023-09-03 19:04:25

@羊羊君的幻想 所以你认为 vector 插入复杂度是 log 吗?


by mjrl_679 @ 2023-09-03 19:23:13

qp


by mjrl_679 @ 2023-09-03 19:44:19

神贴预订


by 羊羊君的幻想 @ 2023-09-03 20:26:47

哥们,我是真sb,我从七年级到高一学了三年算法,不算长,J组高手都不算,但是黄绿题以下秒掉也还是勉强可以做到的,你的迷惑性真的很强你知道吗,你的操作实在是太逆天了(非贬义),vector说是平衡树,n2说是nlogn,说来惭愧,我竟然都被你被迷惑了,真心很好奇你这红名是怎么来的??


by Albatross_LC @ 2023-09-04 22:00:28

@羊羊君的幻想 知道就好[滑稽]


上一页 |