求卡常

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

__youzimo2014__ @ 2024-11-28 19:06:48

record

尝试将 #9 1.04s -> 1.00s

有没有什么方法吗?

Code:

#include <bits/stdc++.h>
using namespace std;

int a[1000005];

int max_ans[1000005], min_ans[1000005];
map<int, int> data;

int main() {
    ios::sync_with_stdio(false);
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    int right = k+1;
    for (int i = 1; i <= k; i++) {
        if (data.find(a[i]) != data.end()) {
            data[a[i]]++;
        } else {
            data[a[i]] = 1;
        }
    }
    min_ans[1] = data.begin()  -> first;
    max_ans[1] = data.rbegin() -> first;

    while (right <= n){
        map<int, int>::iterator last_iter = data.find(a[right-k]), 
                                this_iter = data.find(a[right]);
        (last_iter -> second)--;
        if ((last_iter -> second) == 0) {
            data.erase(last_iter);
        }
        if (this_iter == data.end()) {
            data[a[right]] = 1;
        } else {
            (this_iter -> second)++;
        }
        min_ans[right-k+1] = data.begin()  -> first;
        max_ans[right-k+1] = data.rbegin() -> first;
        right++;
    }
    for (int i = 1; i <= n-k+1; i++) {
        cout << min_ans[i] << ' ';
    }
    cout << endl;
    for (int i = 1; i <= n-k+1; i++) {
        cout << max_ans[i] << ' ';
    }
    return 0;
} 

by __youzimo2014__ @ 2024-11-28 19:10:25

过了过了,我把 cout << endl 改成了 cout << "\n"


by __youzimo2014__ @ 2024-11-28 19:12:04

好像也没有 100% 过,都是靠运气

有没有大佬可以帮我卡到 100% 过?


by Glacial_Shine @ 2024-11-28 19:15:46

map 改成 unordered_map 试下


by Glacial_Shine @ 2024-11-28 19:17:23

if (data.find(a[i]) != data.end()) {
    data[a[i]]++;
} else {
    data[a[i]] = 1;
}

这个地方改成下面这样试试

data[a[i]]++;

by Vector_Li @ 2024-11-28 19:18:52

@youzimo2014 cin.tie(nullptr) 也有用!


by __youzimo2014__ @ 2024-11-28 19:26:17

@Glacial_Shine 谢谢,我试试


by __youzimo2014__ @ 2024-11-28 19:29:58

@Vector_Li 谢谢,但是 cin.tie(nullptr)似乎没有作用,反而 897ms -> 1.20s

@Glacial_Shine 谢谢,我改了 data[a[i]]++; 就基本上都在 800多ms到900多ms了。


by Vector_Li @ 2024-11-28 19:33:54

@youzimo2014 我靠,这我还是第一次遇到,您可以讲一下为什么会变慢吗?


by __youzimo2014__ @ 2024-11-28 19:38:34

@Vector_Li 我也不知道啊,但是之前卡常的时候也遇到过。

之前我卡常的时候把 cin.tiecout.tie 都删掉了,然后就过了,就很奇怪,我去网上看看吧。

明明是蓝钩大佬,咋感觉太谦虚了啊?


by __youzimo2014__ @ 2024-11-28 19:41:06

@Vector_Li 听说是因为把 cincout 的缓冲区隔开了,所以导致缓存利用率变低,内存效率自然就变低了,然后就导致程序变慢(只是听说,我其实一开始不明白为什么)


| 下一页