社区讨论

60分求调,莫名TLE前两个点

P1923【深基9.例4】求第 k 小的数参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlqoa3gj
此快照首次捕获于
2026/02/17 22:02
3 周前
此快照最后确认于
2026/02/22 09:00
2 周前
查看原帖
CPP
#include <cstdio>
#include <algorithm>
#include <random>
using namespace std;
namespace pnl {
    #define reg register
    typedef long long LL;
    constexpr LL N = 6000100;
    LL l = 1, r, k;
    mt19937 eng(random_device{}());
    int a[N], b[N];
    int main() {
        scanf("%lld%lld", &r, &k);
        ++k;
        for (reg int i = l; i <= r; ++i) {
            scanf("%d", &a[i]);
        }
    
        while (l < r) {
            b[l - 1] = l - 1;
            b[r + 1] = r + 1;
            LL mid = a[eng() % (r - l + 1) + l];
            for (reg int i = l; i <= r; ++i) {
                if (a[i] < mid)
                    b[++b[l - 1]] = a[i];
                else
                    b[--b[r + 1]] = a[i];
            }
    
            if (b[l - 1] >= k) {
                r = b[l - 1];
            } else {
                l = b[r + 1];
            }
    
            for (reg int i = l; i <= r; ++i) a[i] = b[i];
        }
    
        printf("%d\n", a[l]);
        return 0;
    }
}

int main() {
    // Audaces fortuna iuvat
    pnl::main();
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...