Codeforces 1249 E. By Elevator or Stairs?
2024-09-01 14:49:07
首先显然下楼的操作一定是不优的,所以只要考虑上楼
设 $f[i]$ 表示到第 $i$ 层时需要的最少时间
那么首先考虑走楼梯,有转移,$f[i]=f[i-1]+a[i-1]$
然后考虑坐电梯有:$f[i]=f[j]+(\sum_{k=j}^{i-1}b[k])+c$
显然那个 $\sum b$ 可以用前缀和搞一下,那么 $f[i]=f[j]+sum[i-1]-sum[j-1]+c$
我们 $dp$ 转移的时候只要维护一个当前 $f[j]-sum[j-1]$ 的最小值 $mi$ 即可
即 $f[i]=mi+sum[i-1]+c$
别问我为什么要强行写个线段树,我脑抽了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+;
const ll INF=1e18;
ll n,m,A[N],B[N];
struct SegTree {
ll t[N<<];
inline void ins(int o,int l,int r,int pos,int v)
{
if(l==r) { t[o]+=v; return; }
int mid=l+r>>;
pos<=mid ? ins(o<<,l,mid,pos,v) : ins(o<<|,mid+,r,pos,v);
t[o]=min(t[o<<],t[o<<|]);
}
inline ll query(int o,int l,int r,int ql,int qr)
{
if(l>=ql&&r<=qr) return t[o];
if(l>qr||r<ql) return INF;
int mid=l+r>>;
return min(query(o<<,l,mid,ql,qr),query(o<<|,mid+,r,ql,qr));
}
}T;
ll f[N];
int main()
{
n=read(),m=read();
for(int i=;i<=n;i++) A[i]=read();
for(int i=;i<=n;i++) B[i]=B[i-]+read();
for(int i=;i<=n;i++)
{
f[i]=f[i-]+A[i];
f[i]=min(f[i],T.query(,,n,,i-)+B[i]+m);
T.ins(,,n,i,f[i]-B[i]);
}
for(int i=;i<=n;i++) printf("%lld ",f[i]); puts("");
return ;
}
最新文章
- CoreGraphics-基本图形绘制-直线、三角形、矩形、椭圆形、弧形
- ubuntu 下python版本切换
- ios取证
- Beat the Spread![HDU1194]
- win8 C 盘 突然少了 十几G 空间 原因,解决方法
- sgu 176 Flow construction(有源汇的上下界最小流)
- [转]DRY原则和Shy原则
- css_day6
- Spring3 MVC 拦截器拦截不到的问题
- android 实现与服务器的长链接 方式
- Windows安装mysql-python提示:error: Microsoft Visual C++ 9.0 is required
- requests爬取网页的通用框架
- HDU - 1036
- iOS 仿抖音 视频裁剪
- [Swift]LeetCode872. 叶子相似的树 | Leaf-Similar Trees
- PHP到底有多牛?你所知道的网站都在用它
- Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】
- Eclipse里选一个变量后,这个类里的该变量不变色了
- Microsoft.Office.Interop.Excel 导出Excel
- JS 日期与时间戳相互转化