社区讨论

关于单调队列

学术版参与者 5已保存回复 9

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@miu3szxx
此快照首次捕获于
2025/12/06 17:41
2 个月前
此快照最后确认于
2025/12/08 20:50
2 个月前
查看原帖
P1440 这段代码91分
CPP
#include<bits/stdc++.h>
using namespace std;
const int N =2000005;
long long a[N];
deque<long long>q;                   //队列中的数据,实际上是元素在原序列中的位置
int main(){
    int n,m;   scanf("%d%d",&n,&m);  
    for(int i=1;i<=n;i++)    scanf("%ld",&a[i]);  
    for(int i=1;i<=n;i++){                       //输出最小值 
    	//while(!q.empty() && q.front()<i-m)    q.pop_front();  //删头  
    	
        while(!q.empty() && a[q.back()]>=a[i])     q.pop_back();   //去尾            
        
        if(i!=1){      //每个窗口输出一次
            while(!q.empty() && q.front()<i-m)    q.pop_front();  //删头             
            printf("%ld\n", a[q.front()]);
        }
        else printf("0\n"); 
		q.push_back(i);
    }
    return 0;
}

但是我把删头放在了前面,就对了
CPP
#include<bits/stdc++.h>
using namespace std;
const int N =2000005;
long long a[N];
deque<long long>q;                   //队列中的数据,实际上是元素在原序列中的位置
int main(){
    int n,m;   scanf("%d%d",&n,&m);  
    for(int i=1;i<=n;i++)    scanf("%ld",&a[i]);  
    for(int i=1;i<=n;i++){                       //输出最小值 
    	while(!q.empty() && q.front()<i-m)    q.pop_front();  //删头  
    	
        while(!q.empty() && a[q.back()]>=a[i])     q.pop_back();   //去尾            
        
        if(i!=1){      //每个窗口输出一次
            //while(!q.empty() && q.front()<i-m)    q.pop_front();  //删头             
            printf("%ld\n", a[q.front()]);
        }
        else printf("0\n"); 
		q.push_back(i);
    }
    return 0;
}

为什么???????

回复

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

正在加载回复...