首页 > 其他分享 >[ARC073F] Many Moves 题解

[ARC073F] Many Moves 题解

时间:2024-09-10 20:47:53浏览次数:12  
标签:sy Many int 题解 update lst fg Moves nw

[ARC073F] Many Moves 题解

个人感觉其实还挺套路的题目。不配紫题。

对于两个玩意在数轴上跑来跑去这种题目,常见的套路是固定一个点的位置,用另一个点的位置设为状态。

对于本题,题目已经帮你固定了一个点,于是我们设 \(dp_{x}\) 表示一个点在当前要求的位置,另一个点在 \(x\) 的最小时间,转移就是分类讨论转移到 \(x\) 的点上一次是在上一个要求的位置还是在别的其他地方即可,需要支持区间加的线段树。

时间复杂度 \(O(n\log n)\)。

代码:

#include <bits/stdc++.h>
#define N 200005
#define int long long
using namespace std;
int n, q, sx, sy;
const int inf = 1e16;
struct Seg {
	struct Node {
		int l, r;
		int flg;
		int minn;
	} e[N << 2];
	#define l(i) e[i].l
	#define r(i) e[i].r
	#define fg(i) e[i].flg
	#define mn(i) e[i].minn
	#define lc (p << 1)
	#define rc (lc | 1)
	void push_up(int p) {
		mn(p) = min(mn(lc), mn(rc));
	}
	void build(int p, int l, int r) {
		l(p) = l, r(p) = r;
		if (l == r)
			return mn(p) = inf, void();
		int mid = (l + r) >> 1;
		build(lc, l, mid);
		build(rc, mid + 1, r);
		push_up(p);
	}
	void push_down(int p) {
		if (fg(p) == 0)
			return;
		mn(lc) += fg(p);
		mn(rc) += fg(p);
		fg(lc) += fg(p);
		fg(rc) += fg(p);
		fg(p) = 0;
	} 
	void update(int p, int x, int val) {
		if (l(p) == r(p) && l(p) == x) 
			return mn(p) = min(mn(p), val), void();
		push_down(p);
		int mid = (l(p) + r(p)) >> 1;
		if (x <= mid)
			update(lc, x, val);
		else
			update(rc, x, val);
		push_up(p);
	}
	void change(int p, int l, int r, int val) {
		if (l > r || l(p) > r || l > r(p))
			return;
		if (l <= l(p) && r(p) <= r) {
			fg(p) += val;
			mn(p) += val;
			return;
		}
		push_down(p);
		change(lc, l, r, val);
		change(rc, l, r, val);
		push_up(p);
	}
	int query(int p, int l, int r) {
		if (l > r || l(p) > r || l > r(p))
			return inf;
		if (l <= l(p) && r(p) <= r)
			return mn(p);
		push_down(p);
		return min(query(lc, l, r), query(rc, l, r));
	}
} A, B;
int lst, nw;
signed main() {
	cin >> n >> q >> sx >> sy;
	cin >> nw;
	A.build(1, 1, n);
	B.build(1, 1, n);
	int t = abs(sy - nw);
	A.update(1, sx, t + sx);
	B.update(1, sx, t - sx);
	t = abs(sx - nw); 
	A.update(1, sy, t + sy);
	B.update(1, sy, t - sy);
	for (int i = 1; i < q; i++) {
		lst = nw;
		cin >> nw;
		int t = min(A.query(1, nw, n) - nw, B.query(1, 1, nw) + nw);
		A.change(1, 1, n, abs(nw - lst));
		B.change(1, 1, n, abs(nw - lst));
		A.update(1, lst, t + lst);
		B.update(1, lst, t - lst);
	}
	int ans = inf;
	for (int i = 1; i <= n; i++) 
		ans = min(ans, A.query(1, i, i) - i);
	cout << ans << "\n";
	return 0;
	
}

标签:sy,Many,int,题解,update,lst,fg,Moves,nw
From: https://www.cnblogs.com/Rock-N-Roll/p/18407163

相关文章

  • ABC370 DEF 题解
    ABC370DEF题解赛时过了ABCD,补题的时候发现EF其实也是简单题,为什么就做不出来呢?E这样简单的dp都做不出来,dp必须得多练啊!D-CrossExplosion题目链接对于每一行、列,我们要用一个数据结构来维护未被删除的点,并且要快速找到某一行/列中是否存在某个数,以及查询某个数的前......
  • 「NOI2021 D1T3 庆典」题解
    uoj675加强:\(\sumk\le6\times10^5\)暴力\(u\)在\(s\Rightarrowt\)路径上\(\iff\)正图上\(s\Rightarrowu\)且反图上\(u\Rightarrowt\)时间复杂度\(O((n+m)q)\)正解只关心可达性,不妨SCC缩点成DAG。注意到一个奇怪的条件:对于三座城市\(x,y,z\),若\(x\Right......
  • 题解:[USACO07DEC] Sightseeing Cows G
    洛谷P2868题目大意有个nnn个点,mmm条边的有向图,点有点权,边有边......
  • 力扣474-一和零(Java详细题解)
    题目链接:474.一和零-力扣(LeetCode)前情提要:因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。如果大家感兴趣,......
  • luogu2516题解
    随机说话第一次交的时候写的版本是这个。下面在sum的计算上少了个else,遂出错。以后写的时候还是尽量简单点,主要是调试的时候好调。题目分析题目里面的公共子序列就是可以不连续可以为空的在字符串里出现顺序相同的子串。对于一个公共子序列,在找到最后一个公共的字符的时......
  • P4563 [JXOI2018] 守卫 题解
    P4563[JXOI2018]守卫题解不愧是九条可怜的\(\text{JXOI}\),只能说确实是道好题。假设当前我们在求\([l,r]\),我们不难发现\(r\)端点一定要放保镖,于是考虑\(r\)保镖的最大监视范围\([x,r]\)。由题意得到对于\([x,r]\)中的每个\(p_1,p_2,\cdots,p_k\),要求斜率\(t(p_i,......
  • 树上一些点的选 题解
    题意简述给你一棵\(n\)个节点以\(1\)为根的有根树,和一个整数\(m\)。对于树上每一个点\(u\),有三个权值\(X,Y,Z\)。你需要在\(u\)的祖先里(不含\(u\))中选出至少\(X\)个点,记\(S_1\)表示这些点到\(u\)的距离之和;在\(u\)的后代里(不含\(u\))中选出至少\(Y\)个点,......
  • CF717A Festival Organization 题解
    Description一个合法的串定义为:长度在\([l,r]\)之间,且只含0,1,并且不存在连续\(2\)个或更多的\(0\)。现在要选出\(k\)个长度相同的合法的串,问有几种选法,答案模\(10^9+7\)。\(1\leqk\leq200,1\leql\leqr\leq10^{18}\)。Solution容易发现答案为\(\sum_{i=l+2}^{r......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【回溯】2024E-字符串
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路代码pythonjavacpp时空复杂度华为OD算法/大厂面......
  • Android中SurfaceView的双缓冲机制和普通View叠加问题解决办法
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点SurfaceView是Android平台上用于高效渲染图形的视图控件。它将内容绘制在一个独立的Surface上,可以直接由渲染线程访问,从而提高性能,尤其是在需要频繁刷新和更新......