【ARC073F】Many Moves

题目

一个显然的\(dp\),设\(dp_{i,j}\)表示其中一个棋子在\(x_i\)点,另一个棋子在\(j\)点的最小花费

显然\(dp_{i,j}\)有两种转移

第一种是把\(x_i\)上的棋子移到\(x_{i+1}\),那么那么就是\(dp_{i+1,j}=\min(dp_{i,j}+|x_{i+1}-x_i|)\)

第二种就是把\(j\)上的棋子移动到\(x_{i+1}\),那么就是\(dp_{i+1,x_i}=\min(dp_{i,j}+|j-x_{i+1}|)\)

这是\(O(nQ)\)的,考虑优化

发现第一种转移形式非常固定,于是直接整体\(dp\)。第一种转移其实就是全局加,我们维护一个加法标记就可以了。

第二种转移都是转移到\(dp_{i+1,x_i}\),绝对值看起来比较讨厌,考虑将绝对值拆开,当\(j\geq x_{i+1}\)时,\(dp_{i+1,x_i}=dp_{i,j}+j-x_{i+1}\);当\(j\leq x_{i+1}\)时,\(dp_{i+1,x_i}=dp_{i,j}-j+x_{i+1}\),于是考虑直接使用线段树来维护\(dp_{i,j}+j\)\(dp_{i,j}-j\)的最小值,查一下这两个区间就能转移了。

代码

#include<bits/stdc++.h>
#define re register
#define LL long long
inline int read() {
    char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const LL inf=1e15;
const int maxn=2e5+5;
int l[maxn<<2],r[maxn<<2];LL mx[maxn<<2][2],tag;
int pos[maxn],d[maxn],n,A,B,Q;
inline LL min(LL a,LL b) {return a<b?a:b;}
void build(int x,int y,int i) {
    l[i]=x,r[i]=y;mx[i][0]=mx[i][1]=inf;
    if(x==y) {pos[x]=i;return;}
    int mid=x+y>>1;
    build(x,mid,i<<1),build(mid+1,y,i<<1|1);
}
void change(int x,LL v,int o) {
    x=pos[x];mx[x][o]=min(v,mx[x][o]);x>>=1;
    while(x) mx[x][o]=min(mx[x][o],v),x>>=1;
}
LL query(int x,int y,int i,int o) {
    if(x<=l[i]&&y>=r[i]) return mx[i][o];
    int mid=l[i]+r[i]>>1;LL now=inf;
    if(x<=mid) now=min(now,query(x,y,i<<1,o));
    if(y>mid) now=min(now,query(x,y,i<<1|1,o));
    return now;
}
inline LL ABS(LL x) {return x>=0?x:-x;}
int main() {
    n=read(),Q=read(),A=read(),B=read();
    for(re int i=1;i<=Q;i++) d[i]=read();
    build(1,n,1);
    change(A,ABS(d[1]-B)+A,0);change(A,ABS(d[1]-B)-A,1);
    change(B,ABS(d[1]-A)+B,0);change(B,ABS(d[1]-A)-B,1);
    for(re int i=2;i<=Q;i++) {
        LL x=query(d[i],n,1,0)-d[i],y=query(1,d[i],1,1)+d[i];
        x=min(x,y);
        LL a=min(mx[pos[d[i-1]]][0]-d[i-1],mx[pos[d[i-1]]][1]+d[i-1]);
        if(x<a+ABS(d[i]-d[i-1])) {
            x+=tag;tag+=ABS(d[i]-d[i-1]);x-=tag;
            change(d[i-1],x+d[i-1],0),change(d[i-1],x-d[i-1],1);
        }
        else tag+=ABS(d[i]-d[i-1]);
    }
    LL ans=inf;
    for(re int i=1;i<=n;i++) ans=min(ans,mx[pos[i]][1]+i);
    printf("%lld\n",ans+tag);
    return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/11551707.html

内容概要:本文档主要介绍了Intel Edge Peak (EP) 解决方案,涵盖从零到边缘高峰的软件配置和服务管理。EP解决方案旨在简化客户的入门门槛,提供一系列工具和服务,包括Edge Software Provisioner (ESP),用于构建和缓存操作系统镜像和软件栈;Device Management System (DMS),用于远程集群或本地集群管理;以及Autonomous Clustering for the Edge (ACE),用于自动化边缘集群的创建和管理。文档详细描述了从软件发布、设备制造、运输、安装到最终设备激活的全过程,并强调了在不同应用场景(如公共设施、工业厂房、海上油井和移动医院)下的具体部署步骤和技术细节。此外,文档还探讨了安全设备注册(FDO)、集群管理、密钥轮换和备份等关键操作。 适合人群:具备一定IT基础设施和边缘计算基础知识的技术人员,特别是负责边缘设备部署和管理的系统集成商和运维人员。 使用场景及目标:①帮助系统集成商和客户简化边缘设备的初始配置和后续管理;②确保设备在不同网络环境下的安全启动和注册;③支持大规模边缘设备的自动化集群管理和应用程序编排;④提供详细的密钥管理和集群维护指南,确保系统的长期稳定运行。 其他说明:本文档是详细描述了Edge Peak技术及其应用案例。文档不仅提供了技术实现的指导,还涵盖了策略配置、安全性和扩展性的考虑,帮助用户全面理解和实施Intel的边缘计算解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值