P1440 求m区间内的最小值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1.定义双向队列(deque),扫过的前m个元素以前的元素对列前弹出,小于当前元素的队列内元素从队列后弹出。
2.输入数据太多,无法定义一般数组存储---->手动开辟堆空间(int *arr=new int[2*1e6])
注意:堆空间需要在最后手动释放开辟的空间arr。(delete []arr)
- #include
- #include
- #include
- #include
- typedef long long ll;
- const ll N = 1e7;
- using namespace std;
-
- int main()
- {
- ll n, m, i;
- cin >> n >> m;
-
- ll* arr = new ll[N];
- deque
dp; - for (i = 1; i <= n; i++)scanf("%lld", &arr[i]);
- printf("0\n");
- for (i = 1; i <= n; i++) {
- if (!dp.empty()&&i-dp.front() > m)dp.pop_front();
- if(!dp.empty())printf("%d\n", arr[dp.front()]);
- while (!dp.empty() && arr[i] < arr[dp.back()])dp.pop_back();
- dp.push_back(i);
- }
- delete[]arr;
- }