社区讨论

求助斜率优化板子题

CF311BCats Transport参与者 3已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lo1oonax
此快照首次捕获于
2023/10/23 00:29
2 年前
此快照最后确认于
2023/10/23 00:29
2 年前
查看原帖
真看不出来错误了,,,也是Wa on test 2,tlq的问题我都检查了没有。还照着第一篇题解改了一些,还是不行。求大佬帮看!
CPP
#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
const int N=2e5+10,M=210;
int n,m,p,q[N],l,r,now;
ll t[N],dis[N],s[N];
ll f[M][N];
ll Y(int x){return s[x]+f[now][x];}
ll cross(int x,int y,int z){
	ll a=x-y,b=y-z,c=Y(x)-Y(y),d=Y(y)-Y(z);
	return d*a-c*b;
}
signed main(){
	scanf("%d%d%d",&n,&m,&p);
	for(int i=2;i<=n;i++){
		scanf("%d",&dis[i]);
		dis[i]+=dis[i-1];
	}
	for(int i=1;i<=m;i++){
		int x,T;scanf("%d%d",&x,&T);
		t[i]=T-dis[x];
	} 
	sort(t+1,t+m+1);
	for(int i=1;i<=m;i++) s[i]=s[i-1]+t[i];
	ll ans;
	for(int i=1;i<=m;i++) 
		f[1][i]=(ll)i*t[i]-s[i];
	ans=f[1][m];l=r=1; 
	for(int i=2;i<=p;i++){
		now=i-1;
		for(int j=1;j<=m;j++){
			while(l<r&&Y(q[l+1])-Y(q[l])<=t[j]*(q[l+1]-q[l])) l++;
			f[i][j]=f[i-1][q[l]]+(ll)(j-q[l])*t[j]-(s[j]-s[q[l]]);
			while(l<r&&cross(j,q[r],q[r-1])>0) r--;
			q[++r]=j;
		} 
		ans=min(ans,f[i][m]);
	}
	printf("%lld",ans);
    return 0;   
}


回复

6 条回复,欢迎继续交流。

正在加载回复...