设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. Eclipse工具查看依赖的JDK、Maven源码方法

    一.Eclipse软件里查看JDK依赖源码 1.Window->Preferences->Java->Installed JREs 2.如图: 二.Eclipse软件里查看Maven ...

  2. Document .load与Document .ready的区别

    页面加载完成有两种事件 1.load是当页面所有资源全部加载完成后(包括DOM文档树,css文件,js文件,图片资源等),执行一个函数 问题:如果图片资源较多,加载时间较长,onload后等待执行的函 ...

  3. JS数组&对象遍历

    遍历的总结,经常用到的,希望帮助你我成长. JS数组遍历: 1,普通for循环 var arr = [1,2,3,4,9]; for ( var i = 0; i <arr.length; i+ ...

  4. Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)

    本来想自己写写的,但是看到有人分析的可以说是很清晰了,故转过来. 原文地址:http://www.cnblogs.com/ygj0930/p/6554103.html 一:绑定 把一个方法与其所在的类 ...

  5. EpiiAdmin 开源的php交互性管理后台框架, 让复杂的交互变得更简单!Phper快速搭建交互性平台的开发框架,基于Thinkphp5.1+Adminlte3.0+Require.js。

    EpiiAdmin EpiiAdmin php开源交互性管理后台框架,基于Thinkphp5.1+Adminlte3.0+Require.js, 让复杂的交互变得更简单!Phper快速搭建交互性平台的 ...

  6. 八、USB驱动分析

    学习目标:分析USB驱动源码结构. 一.Windows下USB驱动理论问题 1. 当usb设备接入PC时,右下角弹出"发现AAA",并弹出对话框,提示安装驱动程序.没有驱动程序,W ...

  7. myeclipse 安装pydev插件后svn插件失效

    为了将python的IDE集成到myeclipse,按照教程安装了myeclipse插件pydev插件,但是按照完后发现,先前安装的svn不见了,解决办法如下: 1. 关闭myeclipse, 2. ...

  8. 【WPF】创建基于模板的WPF控件(经典)

    原文:[WPF]创建基于模板的WPF控件(经典) WPF可以创建两种控件,它们的名字也很容易让人混淆:用户控件(User Control)和定制控件(Customer Control),之所以如此命名 ...

  9. DecimalFormat的用法

    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字. DecimalFormat 包含一个模式 和一组符符号含义:  0 一个数字 # 一个数字,不包括 0 ...

  10. java字符流实现文件间的内容复制

    package com.io.demo1; import java.io.FileReader; import java.io.FileWriter; public class TestFileSTr ...