洛谷P2032

P2032 扫描

这两天被PPT搞晕了,我恨PPT
昨天晚上的CF.div2打0了,A题一点思路没有
B题思路对但是码力太弱,老过不去样例
C题想出来了螺旋填数,但是没看题解之前我不知道那叫螺旋填数,也被码量吓到了

点击查看代码
#include<bits/stdc++.h>
using namespace std;

int main() {
    int n, k; cin >> n >> k;
    vector<int>a(n);
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }

    deque<int> q;//单调队列容器(存的是下标而非a[i]的值)
    for(int i = 0; i < n; i++) {
        while(!q.empty() && a[q.back()] < a[i]) {
            q.pop_back();
        }
        //队列不为空时弹出所有比a[i]值小的下标
        //如原:1 3 4, a[5] = 4
        //对应a值:5 4 3
        //改动后: 1 3, a: 5 4
        q.push_back(i);
        //压入a[i]下标
        //e.g. 1 3 5 -> a: 5 4 4
    
        if(q.front() <= i - k)q.pop_front();
        //如果当前最大值被移出木板
        //最先进入的下标被pop
        //确保队列中最大a值能在木板之下
    
        if(i >= k - 1)cout << a[q.front()] << '\n';
        //前k-1个数覆盖不满木板
    }
    return 0;
}

// int main(){
//     int n, k; cin >> n >> k;
//     deque<int> q;
//     for(int i = 0; i < n; i++) {
//         int tmp; cin >> tmp;
//         q.push_back(tmp);
//         int maxa = 0;
//         if(i == k - 1){
//             for(int a : q) {
//                 maxa = max(a, maxa);
//             }
//             cout << maxa <<'\n';
//         }
//         if(i < k) continue;
//         q.pop_front();
//         for(int a : q) {
//             maxa = max(a, maxa);
//         }
//         cout << maxa <<'\n';
//     }
//     return 0;
// }
//暴力,两个测试点超时
posted @ 2025-05-12 16:55  Chuan81  阅读(6)  评论(0)    收藏  举报