20分求助
查看原帖
20分求助
234224
青鸟_Blue_Bird楼主2020/11/4 08:36

RT, 蒟蒻从暴力 dpdp 到自己写单调队列 dpdp, 再到抄题解,输出全部是 11. 已经快疯了,求助!

#include <bits/stdc++.h>
using namespace std;
#define N 1000010
#define int long long
#define ll long long

template <class T>
inline void read(T& a){
	T x = 0, s = 1;
	char c = getchar();
	while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); }
	while(isdigit(c)){ x = x * 10 + (c ^ '0'); c = getchar(); }
	a = x * s;
	return ;
}

int dp[N];
int sum[N], w[N]; 
int n, k; 
int d[N]; 

deque <int> q;
int que(int x){
	d[x] = dp[x - 1] - sum[x];
	while(!q.empty() && d[q.back()] < d[x]) q.pop_back();
	q.push_back(x);
	while(!q.empty() && q.front() < x - k) q.pop_front(); 
	return d[q.front()]; 
}

signed main(){
	read(n), read(k);
	for(int i = 1; i <= n; i++){
		read(w[i]); sum[i] = sum[i - 1] + w[i]; 
	}
	for(int i = 1; i <= n; i++)
		dp[i] = que(i) + sum[i]; 
	cout << dp[n] << endl; 
	return 0;  
}

2020/11/4 08:36
加载中...