SDOI2012 任务安排
这题首先要转化一下这里对于 的统计
我们先把 做后缀贡献
然后就有了这个式子:
其中
然后我们推式子:
最后是个:
且
右侧是个单调增的,所以是个下凸壳
然后就没了
如果我们不保证 单调呢?
我们照样维护一个下凸壳
然后每次在这里面找决策点的时候二分一下
具体见代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm{
inline int read()
{
int res=0,f=1; char k;
while(!isdigit(k=getchar())) if(k=='-') f=-1;
while(isdigit(k)) res=res*10+k-'0',k=getchar();
return res*f;
}
const int N=3e5+10;
int t[N],c[N],n,s,f[N],q[N],he,ta;
inline double X(int p){return c[p];}
inline double Y(int p){return f[p]-s*c[p];}
inline double slope(int x,int y){ return (Y(y)-Y(x))/(X(y)-X(x)); }
inline int work(double val)
{
int l=he,r=ta-1,ans=-1;
while(l<=r)
{
int mid=(l+r)>>1;
if(Y(q[mid])-Y(q[mid+1])<val*(X(q[mid])-X(q[mid+1]))) ans=mid,r=mid-1;
else l=mid+1;
}
if(ans==-1) return q[ta];
else return q[ans];
}
signed main()
{
n=read(); s=read();
for(int i=1;i<=n;++i) t[i]=read()+t[i-1],c[i]=read()+c[i-1];
for(int i=1;i<=n;++i)
{
int tmp=work(t[i]);
f[i]=f[tmp]+t[i]*(c[i]-c[tmp])+s*(c[n]-c[tmp]);
while(he<ta&&(Y(q[ta-1])-Y(q[ta]))*(X(q[ta])-X(i))>=(Y(q[ta])-Y(i))*(X(q[ta-1])-X(q[ta]))) ta--;
q[++ta]=i;
}
printf("%lld\n",f[n]);
return 0;
}
}
signed main(){return yspm::main();}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律