社区讨论
关于单调队列
学术版参与者 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 条回复,欢迎继续交流。
正在加载回复...