Submission #1255256
Source Code Expand
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
typedef long long ll;
#define INF 1LL<<40
#define def INF
template<class V, int NV> struct SegTree {
V comp(V l, V r) { return min(l, r); };
vector<V> val; SegTree() { val = vector<V>(NV * 2, def); }
V get(int l, int r) { //[l,r]
if (l > r) return def;
l += NV; r += NV + 1; V ret = def;
while (l < r) { if (l & 1) ret = comp(ret, val[l++]); if (r & 1) ret = comp(ret, val[--r]); l /= 2; r /= 2; }
return ret;
}
void update(int i, V v) { i += NV; val[i] = v; while (i>1) i >>= 1, val[i] = comp(val[i * 2], val[i * 2 + 1]); }
void add(int i, V v) { update(i, val[i + NV] + v); }
};
int N, Q, A, B, X[201010];
//-----------------------------------------------------------------------------------
/*ll dp[201010][201010][201010];
ll orderN3() {
rep(i, 0, Q + 1) rep(a, 0, N + 1) rep(b, 0, N + 1) dp[i][a][b] = INF;
dp[0][0][0] = 0;
rep(i, 0, Q) rep(a, 0, N + 1) rep(b, 0, N + 1) if (dp[i][a][b] != INF) {
dp[i + 1][X[i]][b] = min(dp[i + 1][X[i]][b], dp[i][a][b] + abs(a - X[i]));
dp[i + 1][a][X[i]] = min(dp[i + 1][a][X[i]], dp[i][a][b] + abs(b - X[i]));
}
ll ans = INF;
rep(a, 0, N + 1) rep(b, 0, N + 1) ans = min(ans, dp[Q][a][b]);
return ans;
}*/
//-----------------------------------------------------------------------------------
/*ll dp2[2][201010];
ll orderN2() {
rep(i, 0, N + 1) dp2[0][i] = INF;
dp2[0][A] = 0;
rep(i, 0, Q) {
int b;
if (i == 0) b = B;
else b = X[i - 1];
// reset
rep(a, 0, N + 1) dp2[(i + 1) % 2][a] = INF;
// 1. b -> X[i]
rep(a, 0, N + 1) dp2[(i + 1) % 2][a] = min(dp2[(i + 1) % 2][a], dp2[i % 2][a] + abs(b - X[i]));
// 2. a -> X[i]
rep(a, 0, N + 1) dp2[(i + 1) % 2][b] = min(dp2[(i + 1) % 2][b], dp2[i % 2][a] + abs(a - X[i]));
}
ll ans = INF;
rep(a, 0, N + 1) ans = min(ans, dp2[Q % 2][a]);
return ans;
}*/
//-----------------------------------------------------------------------------------
SegTree<ll, 1 << 18> dp3, dpplus, dpminus;
ll offset = 0;
ll orderNlogN() {
dp3.update(A, 0);
dpplus.update(A, 0+A);
dpminus.update(A, 0-A);
rep(i, 0, Q) {
int b;
if (i == 0) b = B;
else b = X[i - 1];
// 1. b -> X[i]
offset += abs(X[i] - b);
// 2. a -> X[i]
ll mi = INF;
mi = min(mi, dpminus.get(0, X[i]) + X[i]);
mi = min(mi, dpplus.get(X[i], N) - X[i]);
mi -= abs(X[i] - b);
dp3.update(b, mi);
dpplus.update(b, mi + b);
dpminus.update(b, mi - b);
}
ll ans = dp3.get(0, N) + offset;
return ans;
}
//-----------------------------------------------------------------------------------
int main() {
cin >> N >> Q >> A >> B;
rep(i, 0, Q) scanf("%d", &X[i]);
cout << orderNlogN() << endl;
}
Submission Info
Submission Time |
|
Task |
F - Many Moves |
User |
hamayanhamayan |
Language |
C++14 (GCC 5.4.1) |
Score |
900 |
Code Size |
3048 Byte |
Status |
AC |
Exec Time |
108 ms |
Memory |
15360 KB |
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:95:36: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
rep(i, 0, Q) scanf("%d", &X[i]);
^
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
900 / 900 |
Status |
|
|
Set Name |
Test Cases |
Sample |
example0, example1, example2, example3 |
All |
example0, example1, example2, example3, flower0, flower1, flower2, flower3, flower4, flower5, flower6, flower7, flower8, flower9, maxrand0, maxrand1, maxrand2, maxrand3, maxrand4, maxrand5, maxrand6, maxrand7, maxrand8, maxrand9, smallrand0, smallrand1, smallrand2, smallrand3, smallrand4, smallrand5, smallrand6, smallrand7, smallrand8, smallrand9 |
Case Name |
Status |
Exec Time |
Memory |
example0 |
AC |
6 ms |
12544 KB |
example1 |
AC |
6 ms |
12544 KB |
example2 |
AC |
6 ms |
12544 KB |
example3 |
AC |
6 ms |
12544 KB |
flower0 |
AC |
94 ms |
13312 KB |
flower1 |
AC |
98 ms |
15360 KB |
flower2 |
AC |
93 ms |
13312 KB |
flower3 |
AC |
93 ms |
13312 KB |
flower4 |
AC |
93 ms |
13312 KB |
flower5 |
AC |
96 ms |
13312 KB |
flower6 |
AC |
95 ms |
13312 KB |
flower7 |
AC |
94 ms |
13312 KB |
flower8 |
AC |
96 ms |
13312 KB |
flower9 |
AC |
94 ms |
13312 KB |
maxrand0 |
AC |
104 ms |
13312 KB |
maxrand1 |
AC |
98 ms |
13312 KB |
maxrand2 |
AC |
99 ms |
13312 KB |
maxrand3 |
AC |
102 ms |
13312 KB |
maxrand4 |
AC |
104 ms |
13312 KB |
maxrand5 |
AC |
102 ms |
13312 KB |
maxrand6 |
AC |
101 ms |
13312 KB |
maxrand7 |
AC |
108 ms |
13312 KB |
maxrand8 |
AC |
100 ms |
13312 KB |
maxrand9 |
AC |
101 ms |
13312 KB |
smallrand0 |
AC |
6 ms |
12544 KB |
smallrand1 |
AC |
6 ms |
12544 KB |
smallrand2 |
AC |
6 ms |
12544 KB |
smallrand3 |
AC |
6 ms |
12544 KB |
smallrand4 |
AC |
6 ms |
12544 KB |
smallrand5 |
AC |
6 ms |
12544 KB |
smallrand6 |
AC |
6 ms |
12544 KB |
smallrand7 |
AC |
6 ms |
12544 KB |
smallrand8 |
AC |
6 ms |
12544 KB |
smallrand9 |
AC |
6 ms |
12544 KB |