标签:sumt return int yval 安排 任务 maxn sumc
这道题不太一样了。通过费用提前可以推倒递推式长这样:f[i]=min{f[j]+sumt[i]*(sumc[i]-sumc[j])+s*(sumc[n]-sumc[j])}
写成一次函数形式长这样:f[j]=(s+sumt[i])*sumc[j]+f[i]-sumt[i]*sumc[i]-s*sumc[n]
但是我们发现由于t不在保证是正数,sumt[i]也没有单调性,那么就只好二分求答案了。
看代码:
#include<bits/stdc++.h> using namespace std; #define int long long const int maxn=500000; int n,s,t[maxn],c[maxn],f[maxn]; int st[maxn],sc[maxn],q[maxn]; int yval(int a,int b){return f[b]-f[a];} int xval(int a,int b){return sc[b]-sc[a];} signed main(){ cin>>n>>s; for(int i=1;i<=n;i++){ scanf("%lld%lld",&t[i],&c[i]); st[i]=st[i-1]+t[i]; sc[i]=sc[i-1]+c[i]; } memset(f,0x3f,sizeof(f)); int l=1,r=1; q[l]=0;f[0]=0; for(int i=1;i<=n;i++){ int x=1,y=r; if(l!=r) while(x<y){ int mid=(x+y)>>1; if(yval(q[mid],q[mid+1])<=(s+st[i])*xval(q[mid],q[mid+1]))x=mid+1; else y=mid; } f[i]=f[q[x]]+st[i]*(sc[i]-sc[q[x]])+s*(sc[n]-sc[q[x]]); while(l<r&&yval(q[r-1],q[r])*xval(q[r],i)>=xval(q[r-1],q[r])*yval(q[r],i))r--; q[++r]=i; } printf("%lld\n",f[n]); return 0; }
标签:sumt,return,int,yval,安排,任务,maxn,sumc 来源: https://www.cnblogs.com/syzf2222/p/12386838.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。