题目链接

https://arc073.contest.atcoder.jp/tasks/arc073_d

题意简述

有nnn个格子,有两颗棋子,初始位置为A,BA,BA,B,移动一颗棋子从XXX到YYY的代价是∣X−Y∣|X-Y|∣X−Y∣,有QQQ个要求,每个要求是将任意一颗棋子移动到XiX_iXi​点,求代价最小值。

题解

设f[i][j]f[i][j]f[i][j]表示前iii个要求被满足,一颗棋子在XiX_iXi​,另一颗在jjj花费的最小代价,转移
f[i][j]=f[i−1][j]+∣Xi−Xi−1∣f[i][Xi−1]=min⁡k=1n(f[i−1][k]+∣k−Xi∣) f[i][j]=f[i-1][j]+|X_i-X_{i-1}|\\ f[i][X_{i-1}]=\min_{k=1}^{n} (f[i-1][k]+|k-X_i|) f[i][j]=f[i−1][j]+∣Xi​−Xi−1​∣f[i][Xi−1​]=k=1minn​(f[i−1][k]+∣k−Xi​∣)
发现第一维可以省掉,用线段树维护第二维,维护三个值(f[i]+i),(f[i]+n−i+1),f[i](f[i]+i),(f[i]+n-i+1),f[i](f[i]+i),(f[i]+n−i+1),f[i],第一种转移就是区间加,第二种就只要对Xi−1X_{i-1}Xi−1​右侧的(f[i]+i)−Xi(f[i]+i)-X_i(f[i]+i)−Xi​,左侧的(f[i]+n−i+1)−n+Xi−1(f[i]+n-i+1)-n+X_i-1(f[i]+n−i+1)−n+Xi​−1取min⁡\minmin,然后区间修改就行了。

代码

#include <cstdio>
#include <algorithm>int read()
{int x=0,f=1;char ch=getchar();while((ch<'0')||(ch>'9')){if(ch=='-'){f=-f;}ch=getchar();}while((ch>='0')&&(ch<='9')){x=x*10+ch-'0';ch=getchar();}return x*f;
}const int maxn=200000;
const long long inf=0x3f3f3f3f3f3f3f3fll;int n,q,sta,stb,a[maxn+10];namespace sgt
{long long mn[3][maxn<<2],adt[maxn<<2];int puttag(int x,long long v){mn[0][x]+=v;mn[1][x]+=v;mn[2][x]+=v;adt[x]+=v;return 0;}int pushdown(int x){puttag(x<<1,adt[x]);puttag(x<<1|1,adt[x]);adt[x]=0;return 0;}int updata(int x){mn[0][x]=std::min(mn[0][x<<1],mn[0][x<<1|1]);mn[1][x]=std::min(mn[1][x<<1],mn[1][x<<1|1]);mn[2][x]=std::min(mn[2][x<<1],mn[2][x<<1|1]);return 0;}int build(int x,int l,int r){if(l==r){mn[0][x]=inf+l;mn[1][x]=inf+n-l+1;mn[2][x]=inf;return 0;}int mid=(l+r)>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);updata(x);return 0;}int add(int x,int l,int r,int askl,int askr,long long adv){if((askl<=l)&&(r<=askr)){puttag(x,adv);return 0;}int mid=(l+r)>>1;pushdown(x);if(askl<=mid){add(x<<1,l,mid,askl,askr,adv);}if(mid<askr){add(x<<1|1,mid+1,r,askl,askr,adv);}updata(x);return 0;}long long getmn(int x,int l,int r,int askl,int askr,int id){if((askl<=l)&&(r<=askr)){return mn[id][x];}int mid=(l+r)>>1;long long res=inf<<1;pushdown(x);if(askl<=mid){res=std::min(res,getmn(x<<1,l,mid,askl,askr,id));}if(mid<askr){res=std::min(res,getmn(x<<1|1,mid+1,r,askl,askr,id));}return res;}
}int abs(int x)
{return (x<0)?(-x):x;
}int main()
{n=read();q=read();sta=read();stb=read();for(int i=1; i<=q; ++i){a[i]=read();}a[0]=sta;sgt::build(1,1,n);sgt::add(1,1,n,stb,stb,-inf);for(int i=1; i<=q; ++i){long long oth=std::min(sgt::getmn(1,1,n,1,a[i],1)-(n-a[i]+1),sgt::getmn(1,1,n,a[i],n,0)-a[i]);sgt::add(1,1,n,1,n,abs(a[i]-a[i-1]));long long nth=sgt::getmn(1,1,n,a[i-1],a[i-1],2);if(nth>oth){sgt::add(1,1,n,a[i-1],a[i-1],oth-nth);}}printf("%lld\n",sgt::getmn(1,1,n,1,n,2));return 0;
}

转载于:https://www.cnblogs.com/Canopus-wym/p/10376104.html

arc073F Many Moves相关推荐

  1. 退役前的做题记录5.0

    退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...

  2. [Educational Codeforces Round 16]A. King Moves

    [Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board ...

  3. poj - 2243 Knight Moves

    这题和poj 1915一样,用bfs做走马步.现在再看当时的代码,真是好幼稚啊. 1 #include <stdio.h> 2 #include <string.h> 3 in ...

  4. 1 Knight Moves

    Problem F- Knight Moves 题目来源:https://vjudge.net/contest/207868#problem/F Problem description: 题意概括:中 ...

  5. LeetCode Minimum Moves to Equal Array Elements II

    原题链接在这里:https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/ 题目: Given a non-empt ...

  6. java求最小步数,使数组值相等的最小步数 Minimum Moves to Equal Array Elements

    问题: Given a non-empty integer array of size n, find the minimum number of moves required to make all ...

  7. ubuntu16安装pylearn2 出现错误提示importerror:no module named six.moves

    由于市面上的一些教程时间比较早,入门学习时跟随教程安装容易出现各种错误,这些错误基本都是版本不同导致的 所以,我们安装过程中一定要指出包的版本,如果你已经遇到no module named six.m ...

  8. HDU 1372 Knight Moves

    最近在学习广搜  这道题同样是一道简单广搜题=0= 题意:(百度复制粘贴0.0) 题意:给出骑士的骑士位置和目标位置,计算骑士要走多少步 思路:首先要做这道题必须要理解国际象棋中骑士的走法,国际象棋中 ...

  9. leetcode 453,462. Minimum Moves to Equal Array Elements I, II | 453, 462. 最少移动次数使数组元素相等(图解)

    453. Minimum Moves to Equal Array Elements https://leetcode.com/problems/minimum-moves-to-equal-arra ...

最新文章

  1. try not do unnecessary subscriptions
  2. 【java学习笔记-io流 文件读写和键盘读写】带缓存的输入/输出流和数据输入/输出流
  3. MultipartFile 支持什么类型_公测首发 | vika 维格表: 支持 API 的连接型智能表格/新一代团队数据协作神器...
  4. leetcode第72题:编辑距离
  5. 保存对象报错with two open Sessions
  6. 论文浅尝 | 基于表示学习的大规模知识库规则挖掘
  7. BootStrap笔记-Model(模式对话框)样式修改
  8. 图形用户界面和交互输入方法---图形用户界面的设计
  9. oracle 执行sql路径,如何指定 SQL 执行路径
  10. 再见 Python!Yann LeCun 警告:深度学习需要新编程语言
  11. 由先序+后序遍历确定序列是否唯一并输出一个中序序列
  12. C++之判断当前是debug还是realease
  13. vue项目text-overflow:ellipsis;在生产环境上不显示...的问题
  14. c#设置mysql超时,C#访问SqlServer设置链接超时的方法
  15. sci四区大水刊 计算机,sci一区水刊_十大水榜sci杂志_四大垃圾sci杂志
  16. Neverland Test 2.0
  17. 说说几种常用的前端缓存
  18. @2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017) K:Kayaking Trip(二分+贪心)
  19. python发送put请求
  20. 如何发表高质量的学术论文(硕士、博士均有参考价值)

热门文章

  1. 前端性能优化经典:javascript防抖节流
  2. ES6学习笔记(四):教你轻松搞懂ES6的新增语法
  3. Web Visibilitychange
  4. 创建mysql制定字符集语句_创建数据库指定字符集语句
  5. 戴尔服务器板载系统raid管理,戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
  6. linux下哪些软件能跑pin,Linux下4款常见远程工具比较
  7. MySQL主从、主主、半同步节点架构的的原理及实验总结
  8. 右侧快速入口滑动时左侧跟着变化
  9. 【运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】...
  10. [UE4]把枪抽象为一个类