arc073F Many Moves
题目链接
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]=mink=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相关推荐
- 退役前的做题记录5.0
退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...
- [Educational Codeforces Round 16]A. King Moves
[Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board ...
- poj - 2243 Knight Moves
这题和poj 1915一样,用bfs做走马步.现在再看当时的代码,真是好幼稚啊. 1 #include <stdio.h> 2 #include <string.h> 3 in ...
- 1 Knight Moves
Problem F- Knight Moves 题目来源:https://vjudge.net/contest/207868#problem/F Problem description: 题意概括:中 ...
- LeetCode Minimum Moves to Equal Array Elements II
原题链接在这里:https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/ 题目: Given a non-empt ...
- 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 ...
- ubuntu16安装pylearn2 出现错误提示importerror:no module named six.moves
由于市面上的一些教程时间比较早,入门学习时跟随教程安装容易出现各种错误,这些错误基本都是版本不同导致的 所以,我们安装过程中一定要指出包的版本,如果你已经遇到no module named six.m ...
- HDU 1372 Knight Moves
最近在学习广搜 这道题同样是一道简单广搜题=0= 题意:(百度复制粘贴0.0) 题意:给出骑士的骑士位置和目标位置,计算骑士要走多少步 思路:首先要做这道题必须要理解国际象棋中骑士的走法,国际象棋中 ...
- 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 ...
最新文章
- try not do unnecessary subscriptions
- 【java学习笔记-io流 文件读写和键盘读写】带缓存的输入/输出流和数据输入/输出流
- MultipartFile 支持什么类型_公测首发 | vika 维格表: 支持 API 的连接型智能表格/新一代团队数据协作神器...
- leetcode第72题:编辑距离
- 保存对象报错with two open Sessions
- 论文浅尝 | 基于表示学习的大规模知识库规则挖掘
- BootStrap笔记-Model(模式对话框)样式修改
- 图形用户界面和交互输入方法---图形用户界面的设计
- oracle 执行sql路径,如何指定 SQL 执行路径
- 再见 Python!Yann LeCun 警告:深度学习需要新编程语言
- 由先序+后序遍历确定序列是否唯一并输出一个中序序列
- C++之判断当前是debug还是realease
- vue项目text-overflow:ellipsis;在生产环境上不显示...的问题
- c#设置mysql超时,C#访问SqlServer设置链接超时的方法
- sci四区大水刊 计算机,sci一区水刊_十大水榜sci杂志_四大垃圾sci杂志
- Neverland Test 2.0
- 说说几种常用的前端缓存
- @2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017) K:Kayaking Trip(二分+贪心)
- python发送put请求
- 如何发表高质量的学术论文(硕士、博士均有参考价值)
热门文章
- 前端性能优化经典:javascript防抖节流
- ES6学习笔记(四):教你轻松搞懂ES6的新增语法
- Web Visibilitychange
- 创建mysql制定字符集语句_创建数据库指定字符集语句
- 戴尔服务器板载系统raid管理,戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
- linux下哪些软件能跑pin,Linux下4款常见远程工具比较
- MySQL主从、主主、半同步节点架构的的原理及实验总结
- 右侧快速入口滑动时左侧跟着变化
- 【运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】...
- [UE4]把枪抽象为一个类