1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| ll seq[maxn]; struct Segtree { struct Node { ll val, add; }; Node tree[maxn * 4]; void modify_add_Node(int node, ll val) { tree[node].val += val; tree[node].add += val; } void pushup(int node) { tree[node].val = min(tree[node << 1].val, tree[node << 1 | 1].val); } void pushdown(int node) { if (tree[node].add) { modify_add_Node(node << 1, tree[node].add); modify_add_Node(node << 1 | 1, tree[node].add); tree[node].add = 0; } } void build(int l, int r, int node) { if (l == r) { tree[node].val = seq[l]; tree[node].add = 0; return; } int mid = (l + r) >> 1; build(l, mid, node << 1); build(mid + 1, r, node << 1 | 1); pushup(node); } void modify_add(int L, int R, int l, int r, int node, int val) { if (r < L || R < l) return; if (L <= l&&r <= R) { modify_add_Node(node, val); return; } pushdown(node); int mid = (l + r) >> 1; modify_add(L, R, l, mid, node << 1, val); modify_add(L, R, mid + 1, r, node << 1 | 1, val); pushup(node); } void modify_min(int pos, int l, int r, int node, ll val) { if (l == r) { tree[node].val = min(tree[node].val, val); return; } pushdown(node); int mid = (l + r) >> 1; if (pos <= mid) modify_min(pos, l, mid, node << 1, val); else modify_min(pos, mid + 1, r, node << 1 | 1, val); pushup(node); } ll query_min(int L, int R, int l, int r, int node) { if (r<L || R<l) return INF; if (L <= l&&r <= R) return tree[node].val; pushdown(node); int mid = (l + r) >> 1; return min(query_min(L, R, l, mid, node << 1), query_min(L, R, mid + 1, r, node << 1 | 1)); } ll dfs(int l, int r, int node) { if (l == r) return tree[node].val + l; pushdown(node); int mid = (l + r) >> 1; return min(dfs(l, mid, node << 1), dfs(mid + 1, r, node << 1 | 1)); } }s,t; int N, Q, A, B; int x[maxn]; void solve() { sa(N), sa(Q), sa(A), sa(B); repp(i, 1, Q) { sa(x[i]); } repp(i, 1, N) { seq[i] = INF; } seq[B] = -B; s.build(1, N, 1); seq[B] = B; t.build(1, N, 1); x[0] = A; repp(i, 1, Q) { ll tmp = min(s.query_min(1, x[i], 1, N, 1) + x[i], t.query_min(x[i], N, 1, N, 1) - x[i]); s.modify_add(1, N, 1, N, 1, abs(x[i] - x[i - 1])); t.modify_add(1, N, 1, N, 1, abs(x[i] - x[i - 1])); s.modify_min(x[i - 1], 1, N, 1, tmp - x[i - 1]); t.modify_min(x[i - 1], 1, N, 1, tmp + x[i - 1]); } ll ans = s.dfs(1, N, 1); printf("%lld\n", ans); }
|