社区讨论
求助斜率优化板子题
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 条回复,欢迎继续交流。
正在加载回复...