P7294-[USACO21JAN]Minimum Cost Paths P【单调栈】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P7294


1|1题目大意

n×m的网格,当你在(x,y)时你有两种选择

  1. 花费x2的代价向右移动
  2. 花费cy的代价向下移动

q次询问(1,1)走到(x,y)的最小代价。

1n109,1m,q2×105


1|2解题思路

假设我们开始都是直接走最上面向右的路(也就是代价都是12)。

然后考虑在某个位置(x,y)要走到(n,m)时向下走会产生的贡献为cy+(my)×(2x+1)(后面要抬my个横着走,然后从x2(x+1)2要到加2x+1)。

然后拆一下就是cy+my+2xm2xy。发现斜率2y是按照y递增递减的,而且我们要求选出的若干个cyy一定要递增,但是这样的话我们选出来的一定是递增的所以我们只需要考虑对于每个x选择一个y使得最小化cy+(my)×(2x+1)

按照询问排序,一个一个加入新的cy,按照斜率维护一个上凸壳,然后在凸壳上面二分就好了。

时间复杂度O(m+qlogm)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=2e5+10; struct node{ ll n,m,id; }q[N]; ll n,m,t,top,b[N],k[N],s[N],sum[N],l[N],r[N],ans[N]; ll calc(ll i,ll j)//i<j {return (b[j]-b[i]+k[i]-k[j]-1)/(k[i]-k[j]);} ll cap(ll i,ll j){ ll x=calc(i,j); if(x<=l[i])return 1; return 0; } ll getf(ll x,ll l,ll r) {return (r+l)*(r-l+1)/2*k[x]+b[x]*(r-l+1);} bool cmp(node x,node y) {return x.m<y.m;} signed main() { // freopen("data.in","r",stdin); // freopen("data.out","w",stdout); scanf("%lld%lld",&n,&m); for(ll i=1;i<=m;i++){ scanf("%lld",&b[i]); b[i]=b[i]-i;k[i]=2*(-i); } scanf("%lld",&t); for(ll i=1;i<=t;i++){ scanf("%lld%lld",&q[i].n,&q[i].m); q[i].id=i; } sort(q+1,q+1+t,cmp); for(ll i=1,z=1;i<=m;i++){ r[i]=n; while(top>0&&cap(s[top],i))top--; if(top)l[i]=max(calc(s[top],i),1ll);else l[i]=1; if(l[i]<=r[i]){ r[s[top]]=l[i]-1;s[++top]=i; sum[top-1]=((top>1)?sum[top-2]:0)+getf(s[top-1],l[s[top-1]],r[s[top-1]]); sum[top]=sum[top-1]+getf(i,l[i],r[i]); } while(z<=t&&q[z].m<=i){ ll qn=q[z].n-1,L=1,R=top; while(L<=R){ ll mid=(L+R)>>1; if(r[s[mid]]<qn)L=mid+1; else R=mid-1; } ans[q[z].id]=sum[L-1]+getf(s[L],l[s[L]],qn)+(qn+1)*qn*i+i*qn+i-1; z++; } } for(ll i=1;i<=t;i++) printf("%lld\n",ans[i]); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15152175.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(183)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示