悬关求调 40pts
查看原帖
悬关求调 40pts
546159
lihansheng1楼主2024/7/23 15:08
#include<bits/stdc++.h>
using namespace std;
long long n, q, k;
long long a[1000010];
long long dp[1000010];


void init() {
	for (long long i = 0; i <= n; i++)dp[i] = 0;
}

void print() {
	for (long long i = 1; i <= n; i++)cout << dp[i] << " ";
	cout << endl;
	return ;
}

int main() {
	cin >> n;
	for (long long i = 1; i <= n; i++)cin >> a[i];
	cin >> q;
	while (q--) {
		deque<pair<long long, long long>>s;//val index_
		init();
		cin >> k;
		for (long long i = 1; i <= n; i++) {
			if (s.empty()) {
				dp[i] = 0;
				s.push_back(make_pair(0, i));
				continue;
			}
			while (!s.empty() && i - s.front().second > k)s.pop_front();
			long long j = a[s.front().second] - a[i];
			if (j > 0)j = 0;
			else j = 1;
			dp[i] = s.front().first + j;
			while (!s.empty() && s.back().first > dp[i])s.pop_back();
			if (!s.empty() && s.back().first == dp[i] && a[s.back().second] <= a[i])s.pop_back();
			s.push_back(make_pair(dp[i], i));
		}
//		print();
		cout << dp[n] << endl;
	}
}
2024/7/23 15:08
加载中...