arc073 F many moves(dp + 线段树)
设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 + 线段树)的更多相关文章
- ZOJ 3349 Special Subsequence 简单DP + 线段树
同 HDU 2836 只不过改成了求最长子串. DP+线段树单点修改+区间查最值. #include <cstdio> #include <cstring> #include ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- cf834D(dp+线段树区间最值,区间更新)
题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...
- Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)
Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树) 题目链接 题意 给定一个nm的矩阵,每行取2k的矩阵,求总 ...
- Codeforces Round #530 (Div. 2) F (树形dp+线段树)
F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ...
- [CSP-S模拟测试]:F(DP+线段树)
题目传送门(内部题49) 输入格式 第一行四个整数$n,q,a,b$.接下来$n$行每行一个整数$p_i$. 输出格式 一行一个整数表示答案. 样例 样例输入: 10 3 3 7 样例输出: 数据范围 ...
- Codeforces Round #530 (Div. 2)F Cookies (树形dp+线段树)
题:https://codeforces.com/contest/1099/problem/F 题意:给定一个树,每个节点有俩个信息x和t,分别表示这个节点上的饼干个数和先手吃掉这个节点上一个饼干的的 ...
- [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)
题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...
- 【uva1502/hdu4117-GRE Words】DP+线段树优化+AC自动机
这题我的代码在hdu上AC,在uva上WA. 题意:按顺序输入n个串以及它的权值di,要求在其中选取一些串,前一个必须是后一个的子串.问d值的和最大是多少. (1≤n≤2×10^4 ,串的总长度< ...
随机推荐
- CentOS 7.4使用yum源安装php7.2
1.如果之前已经安装我们先卸载一下 yum -y remove php* 2.由于linux的yum源不存在php7.x,所以我们要更改yum源 rpm -Uvh https://dl.fedorap ...
- jQuery 打气球小游戏 点击气球爆炸效果
最近在学习前端,看到偶尔看到前端小游戏,就想自己写一个小游戏,奈何水平有限,只能写打气球这种简单的,所有的气球都是动态生成的,气球的颜色也是随机的 html部分 <div class=" ...
- dedecms左侧导航栏不显示问题
dedecms左侧导航栏不显示问题 在做织梦项目时,经常会碰到后台左侧导航栏不显示的问题,如下所示: 这主要是由于文件权限不足造成的.有两种方法 第一种:把 /data 文件夹全部改成 777 权 ...
- [MIP]mip-script组件自定义 JS 代码使用限制
自mip升级v2版本后,多了一个mip-script组件,很多人就都以为可以写自定义js代码了!然并卵,MIP2页中还是一样不允许自定义javascript代码,所有的交互须通过组件实现. 引用官方说 ...
- 20.2 解析与序列化【JavaScript高级程序设计第三版】
JSON 之所以流行,拥有与JavaScript 类似的语法并不是全部原因.更重要的一个原因是,可以把JSON 数据结构解析为有用的JavaScript 对象.与XML 数据结构要解析成DOM 文档而 ...
- html5 获取和设置data-*属性值的四种方法讲解
1.获取id的对象 2.需要获取的就是data-id 和 dtat-vice-id的值 一:getAttribute()方法 const getId = document.getElementById ...
- python学习之路2(程序的控制结构)
1.程序的分支结构 1.1 单分支 if <条件>: 例:guess = eval(input()) <语句块> ...
- 机器学习基础之knn的简单例子
knn算法是人工智能的基本算法,类似于语言中的"hello world!",python中的机器学习核心模块:Scikit-Learn Scikit-learn(sklearn)模 ...
- springmvc springboot 跨域问题(CORS)
官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html springmvc s ...
- java doc 编写
总而言之,我觉得有用的是: @see 只要敲了@see 然后会自动写你的类名的,很方便.# 去连接字段 {@link } 只要敲了{@link } 然后会自动写你的类名的,很方便.# 去连接字段 如果 ...