P1440
题目
题目描述:
一个含有 n 项的数列,求出每一项前的 m 个数到它这个区间内的最小值。若前面的数不足 m 项则从第 1 个数开始,若前面没有数则输出 0。
输入格式:
第一行两个整数,分别表示 n,m。
第二行,n 个正整数,为所给定的数列 ai。
输出格式:
n 行,每行一个整数,第 i 个数为序列中 ai 之前 m 个数的最小值。
数据范围与说明:
对于 100% 的数据,保证 1≤m≤n≤2×106,1≤ai≤3×107。
输入输出样例 #1
输入:
输出:
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include<bits/stdc++.h> using namespace std; int q[2000005], a[2000005]; int main(){ int n,m; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int front=1,rear=0; printf("0\n"); for(int i=1;i<=n-1;i++){ while(front<=rear&&q[front]<=i-m){ front++; } while(front<=rear&&a[q[rear]]>=a[i]){ rear--; } q[++rear]=i; printf("%d\n",a[q[front]]); } }
|