基于刚刚说过的单调队列pop和push的规则,代码不难实现,如下:
滑窗用一个单调队列维持

同理实现acm滑窗最小
C++代码如下:

#include <iostream>
#include <vector>
#include <deque>
#include <sstream>
#include <algorithm>

using namespace std;

int main() {
    string line;
    getline(cin, line);  // 第一行:crossroads[]
    stringstream ss(line);
    vector<int> crossroads;
    int x;
    while (ss >> x) {
        crossroads.push_back(x);
    }

    int k;
    if (!(cin >> k)) {
        cout << -1 << endl;
        return 0;
    }

    int n = crossroads.size();
    if (k < 1 || n < 1 || k > n) {
        cout << -1 << endl;
        return 0;
    }

    vector<int> result;
    deque<int> que;  // 单调递增队列,存下标

    int l = 0, r = 0;
    for (int i = 0; i < n - 1; ++i) {
        int left = max(0, i - k);
        int right = min(n - 1, i + k);

        // 移动右边界
        while (r <= right) {
            while (!que.empty() && crossroads[r] < crossroads[que.back()]) {
                que.pop_back();
            }
            que.push_back(r);
            ++r;
        }

        // 移动左边界
        while (!que.empty() && que.front() < left) {
            que.pop_front();
        }

        result.push_back(que.front());
    }

    // 输出
    for (int i = 0; i < result.size(); ++i) {
        if (i > 0) cout << " ";
        cout << result[i];
    }
    cout << endl;

    return 0;
}









#include <iostream>
#include<vector>
#include<string>
#include<stringstream>
//动态规划
using namespace std;
int main() {
    int n;
    cin>>n;
    vector<vector<int>> arr(n,n);
    for(int i=0;i<n;i++){
        string line;
        getline(cin,line);
        stringstream ss(line);
        int j=0;
        while(ss>>arr[i][j]){
            j++;
        }
    }
    string b;
    getline(cin,b);
    stringstream sb(b);
    
    vector<int> gates;
    int x=0;
    while(ss>>gates[x]){
        x++;
    }
    
    int in,out;
    cin>>in>>out;
    
    
    
    
}
// 64 位输出请用 printf("%lld")

图论中的 dijsktra最短路径

https://niumacode.com/problem/P1675

#include <iostream>
#include <sstream>
#include <vector>
#include <climits>
using namespace std;//dfs
int dij(vector<vector<int>> dis,int start ,int target){
    int l=dis.size();
    vector<int> mindist(l,INT_MAX);
    vector<bool> visited(l, false); // 标记是否访问过
    mindist[start]=0;
    
    for(int i=0;i<l;i++){
        int minval=INT_MAX;
        int cur=0;
        
        for(int p=0;p<l;p++){
            if(!visited[p]&&mindist[p]<minval){
                minval=mindist[p];
                cur=p;
            }//在每一轮选出最小
        }
         visited[cur] = true;  // 2、标记该节点已被访问
         // 3、第三步,更新非访问节点到源点的距离(即更新minDist数组)
        for (int v = 0; v < l; v++) {
            if (!visited[v] && dis[cur][v] != 	INT_MAX && mindist[cur] + dis[cur][v] < mindist[v]) {
                mindist[v] = mindist[cur] + dis[cur][v];
            }
        }//在每一次访问一个点时,更新mindist,并记录已访问。它储存着每个点到v点从头开始便利的最段路径。
    }
   
    
    
    return mindist[target];
}


int main() {
    int n,des;
    cin>>n;
    vector<vector<int>> dis(n+1,vector<int>(n+1,INT_MAX));
    int temp;

    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= n; j++) {
            cin >> temp;
            if (i == j) {
                dis[i][j] = 0;
            } else if (temp == 0) {
                dis[i][j] = INT_MAX;
            } else {
                dis[i][j] = temp;
            }
        }
    }


   
    cin>>des;
    
    int answer=dij(dis,0,des);
    cout<<answer<<endl;
    
        
    return 0;
   
    
    
}
// 64 位输出请用 printf("%lld")