P1440 求m区间内的最小值

题目:

P1440 求m区间内的最小值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

 P1440 求m区间内的最小值_第1张图片

思路: 

1.定义双向队列(deque)dp,扫过的前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];
	dequedp;
	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;
}

 

你可能感兴趣的:(算法,数据结构,c++)