单调队列DP WA求助
查看原帖
单调队列DP WA求助
217743
sc84bbs楼主2020/7/24 08:49

RT

期望得分100 实际得分20

本来自己写,发现过不了样例,于是推翻并面向题解编程,照着题解调,发现仍然过不了

用的第一页倒数第二篇题解,写了个STL版

#include<bits/stdc++.h>
//#include<iostream>
//#include<algorithm>      
//#include<cctype>
//#include<cmath>   
//#include<cstdio>
//#include<cstdlib>
//#include<cstring>
//#include<ctime>      
//#include<fstream>   
//#include<map>      
//#include<iomanip>   
//#include<iostream>   
//#include<queue>    
//#include<set>      
//#include<sstream>    
//#include<stack>        
//#include<string>      
//#include<vector>
using namespace std;
long long n,k;
deque<long long>qwq;
long long qzh[1000005];
long long dp[1000005][2];
long long orz[1000005];
int main(){
	cin>>n>>k;
	for(long long i=1;i<=n;i++){
		cin>>orz[i];
		qzh[i]=qzh[i-1]+orz[i];
	}
	memset(dp,0,sizeof(dp));
	dp[1][1]=orz[1];
	for(long long i=2;i<=n;i++){
		dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
		while(!qwq.empty()&&qwq.back()<i-k)qwq.pop_back();
		if(qwq.empty())dp[i][1]=dp[0][0]-qzh[0]+qzh[i];
		else dp[i][1]=dp[qwq.back()][0]-qzh[qwq.back()]+qzh[i];
		
		while(!qwq.empty()&&qzh[i]-dp[i][0]<qzh[qwq.front()]-dp[qwq.front()][0])qwq.pop_front(); 
		qwq.push_front(i);
	}
	cout<<max(dp[n][0],dp[n][1]);
	return 0;
}


求调QAQ

2020/7/24 08:49
加载中...