设dp[i][y]表示一个点在x[i],另一个点在y时最小要走的步数

那么有以下转移

对于y != x[i-1]的状态,可以证明,他们直接加|x[i] - x[i-1]|即可(如果有其他方案,不符合对dp的定义)

当y == x[i-1]时,它可以由其他所有状态转移过来, dp[i][x[i-1]] = min(dp[i][y] + |y - x[i]|)

把绝对值拆出来,就是需要维护一个dp[i][y] + y 和dp[i][y] - y,建立两个线段树即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
using namespace std;
typedef long long LL;
const int maxn = 2e5 + ;
LL Plus[maxn*], Minus[maxn*], tag[maxn*];
inline LL abs(LL x) { return x < ? -x : x; }
inline void Puttag(int o, LL v){
Plus[o] += v;
Minus[o] += v;
tag[o] += v;
}
inline void Pushdown(int o){
if(!tag[o]) return;
Puttag(o*, tag[o]);
Puttag(o*+, tag[o]);
tag[o] = ;
}
inline void Maintain(int o){
Plus[o] = min(Plus[o*], Plus[o*+]);
Minus[o] = min(Minus[o*], Minus[o*+]);
}
inline bool Cut(int x) { return false; }
inline bool Check(int x) { return true; }
inline void Change(int o, int l, int r, int L, int R, LL v){
if(L > r || R < l || Cut(o)) return;
if(L <= l && r <= R && Check(o)){
Puttag(o, v); return;
}
int mid = (l+r)/; Pushdown(o);
Change(o*, l, mid, L, R, v);
Change(o*+, mid+, r, L, R, v);
Maintain(o);
}
inline long long Query(int o, int l, int r, int L, int R, int ty){
if(L > r || R < l || Cut(o)) return 1e18;
if(L <= l && r <= R){
return ty ? Plus[o] : Minus[o];
}
int mid = (l+r)/; Pushdown(o);
ans = min(Query(o*+, mid+, r, L, R, ty), Query(o*, l, mid, L, R, ty));
Maintain(o);
return ans;
}
inline void Insert(int o, int l, int r, int k, LL v, int ty){
if(l == r) {
if(ty) Plus[o] = v; else Minus[o] = v;
return;
}
int mid = (l+r)/; Pushdown(o);
if(k <= mid) Insert(o*, l, mid, k, v, ty);
else Insert(o*+, mid+, r, k, v, ty);
Maintain(o);
} int N, Q, A, B;
int x[maxn];
int main(){
scanf("%d %d %d %d", &N, &Q, &A, &B);
for(int i = ; i <= Q; i++) scanf("%d", &x[i]);
x[] = B;
// dp[i][x] = dp[i-1][x] + ||
// dp[i][x[i-1]] = all(dp[i-1][x]+|x-x[i]|)
// x <= x[i] -> dp[i-1][x] + x[i] - x
// x > x[i] -> dp[i-1][x] + x - x[i]
memset(Plus, , sizeof(Plus));
memset(Minus, , sizeof(Minus));
Insert(, , N, A, A, );
Insert(, , N, A, -A, );
for(int i = ; i <= Q; i++){
LL ans = min(Query(, , N, , x[i], ) + x[i], Query(, , N, x[i]+, N, ) - x[i]);
Change(, , N, , x[i-]-, abs(x[i] - x[i-]));
Change(, , N, x[i-]+, N, abs(x[i] - x[i-])); Insert(, , N, x[i-], ans + x[i-], );
Insert(, , N, x[i-], ans - x[i-], );
}
LL ans = 1e18;
for(int i = ; i <= N; i++){
ans = min(ans, Query(, , N, i, i, ) + i);
}
cout<<ans<<endl;
}

arc073 F many moves(dp + 线段树)的更多相关文章

  1. ZOJ 3349 Special Subsequence 简单DP + 线段树

    同 HDU 2836 只不过改成了求最长子串. DP+线段树单点修改+区间查最值. #include <cstdio> #include <cstring> #include ...

  2. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. cf834D(dp+线段树区间最值,区间更新)

    题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...

  4. Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)

    Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树) 题目链接 题意 给定一个nm的矩阵,每行取2k的矩阵,求总 ...

  5. Codeforces Round #530 (Div. 2) F (树形dp+线段树)

    F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ...

  6. [CSP-S模拟测试]:F(DP+线段树)

    题目传送门(内部题49) 输入格式 第一行四个整数$n,q,a,b$.接下来$n$行每行一个整数$p_i$. 输出格式 一行一个整数表示答案. 样例 样例输入: 10 3 3 7 样例输出: 数据范围 ...

  7. Codeforces Round #530 (Div. 2)F Cookies (树形dp+线段树)

    题:https://codeforces.com/contest/1099/problem/F 题意:给定一个树,每个节点有俩个信息x和t,分别表示这个节点上的饼干个数和先手吃掉这个节点上一个饼干的的 ...

  8. [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)

    题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...

  9. 【uva1502/hdu4117-GRE Words】DP+线段树优化+AC自动机

    这题我的代码在hdu上AC,在uva上WA. 题意:按顺序输入n个串以及它的权值di,要求在其中选取一些串,前一个必须是后一个的子串.问d值的和最大是多少. (1≤n≤2×10^4 ,串的总长度< ...

随机推荐

  1. InheritableThreadLocal线程复用

    引自:http://www.cnblogs.com/sweetchildomine/p/6575666.html 虽然使用AOP可以获取方法签名,但是如果要获取方法中计算得出的数据,那么就得使用Thr ...

  2. [转]App离线本地存储方案

    App离线本地存储方案 原文地址:http://ask.dcloud.net.cn/article/166 HTML5+的离线本地存储有如下多种方案:HTML5标准方案:cookie.localsto ...

  3. PHP Laravel 5.4 环境搭建

    1.php运行环境搭建 在win10系统上进行搭建的,使用的是wamp环境  wampserver3_x86_apache2.4.17_mysql5.7.9_php5.6.15.exe,安装包中集成了 ...

  4. ZooKeeper(2)-安装和配置

    一.下载 https://zookeeper.apache.org/ 二.本地模式安装 1.安装前准备 (1)安装Jdk (2)拷贝Zookeeper安装包到Linux系统下 (3)解压到指定目录 . ...

  5. POJ2553 汇点个数(强连通分量

    The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12070   Accepted: ...

  6. 登録更新(BAPI)

    購買管理(MM) * [BAPI_REQUISITION_CREATE] 購買依頼登録 * [BAPI_REQUISITION_CHANGE] 購買依頼変更 * [BAPI_REQUISITION_D ...

  7. P1332 血色先锋队

    P1332 血色先锋队 题目描述 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重 ...

  8. RHCE7认证学习笔记17——KickStart安装系统

    一.自动化安装系统工具 1.Cobbler    另一个自动化安装工具: 2.Kickstart 二.使用kickstart自动化安装系统 服务器安装的软件: 1.dhcp服务   [root@lin ...

  9. python的正则表达一

    一.常用的正则表达式 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种 ...

  10. Android之线程安全的单例模式,Adapter注意事项之引用传值

    线程安全的单例模式单位模式一般写法如下: public static FestivalLab mInstance; private FestivalLab() { } public static Fe ...