单调队列优化dp WA #6 #10 求助
查看原帖
单调队列优化dp WA #6 #10 求助
602833
kczw楼主2024/1/21 15:47
#include"iostream"
#include"deque"
#include<string.h>
#include"algorithm"
using namespace std;
const int K=1e4+5,N=5e2+5;
struct node{int x,f,c;}stn[N];
bool cmp(node a,node b){return a.x<b.x;}
int k,e,n,sum;
long long f[N][K];
int main(){
	scanf("%d%d%d",&k,&e,&n);
	memset(f,0x3f,sizeof(f));
	f[0][0]=0;
	for(int i=1,a,b,c;i<=n;i++){
		scanf("%d%d%d",&a,&b,&c);
		stn[i]={a,b,c};
		f[i][0]=0;
	}sort(stn+1,stn+n+1,cmp);
	for(int i=1;i<=n+1;i++){
		sum+=stn[i].f;
		deque<pair<long long,int>> q;
		q.push_back({0,0});
		for(int j=1;j<=min(sum,k);j++){
            while(!q.empty()&&j-q.front().second>stn[i].f)q.pop_front();
            while(!q.empty()&&q.back().first>=f[i-1][j]+1ll*j*j*(stn[i].x-stn[i-1].x)-j*stn[i].c)q.pop_back();
            q.push_back({f[i-1][j]+1ll*j*j*(stn[i].x-stn[i-1].x)-j*stn[i].c,j});
            f[i][j]=q.front().first+1ll*j*stn[i].c;
		}
	}
	printf("%lld",f[n][k]+k*k*(e-stn[n].x));
	return 0;
}
2024/1/21 15:47
加载中...