# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1009734 | ProtonDecay314 | Boxes with souvenirs (IOI15_boxes) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/*
???
*/
#include<bits/stdc++.h>
#define DEBUG
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pi;
typedef pair<ll, ll> pll;
typedef vector<pi> vpi;
typedef vector<pll> vpll;
#define first fi;
#define second se;
ll delivery(int intn, int intk, int intl, int pos_int[]) {
ll n = intn, k = intk, l = intl;
vll pos(n, 0ll);
for(ll i = 0; i < n; i++) {
pos[i] = pos_int[i];
}
ll ans = 0ll;
if(k == 1) {
for(ll i = 0; i < n; i++) {
ans += min(pos[i], l - pos[i]) << 1ll;
}
} else if(k == n) {
sort(pos.begin(), pos.end());
ll min_not_zero = -1ll;
ll max_left = 0ll;
ll max_right = l;
for(ll i = 0; i < n; i++) {
if(pos[i] != 0ll) {
min_not_zero = pos[i];
break;
}
}
for(ll i = 0; i < n; i++) {
if(pos[i] > (l >> 1ll) || ((l & 1) == 0ll && pos[i] == (l >> 1ll))) max_right = min(max_right, pos[i]);
if(l - pos[i] > (l >> 1ll)) max_left = max(max_left, pos[i]);
}
// bool gthalfexists = pos[n - 1ll] > (l >> 1ll);
// bool lthalfexists = (min_not_zero != -1ll) && (l - min_not_zero > (l >> 1ll));
// if(gthalfexists && lthalfexists) {
// ans = min(l, (l - min_not_zero + pos[n - 1]) << 1ll);
// } else if(gthalfexists) {
// ans = (l - min_not_zero) << 1ll;
// } else {
// ans = pos[n - 1] << 1ll;
// }
ans = min(l, (l - max_right + max_left) << 1ll);
}
return ans;
}
#ifdef DEBUG
int main() {
cin.tie(nullptr);
cout.tie(nullptr);
ios_base::sync_with_stdio(false);
int n, k, l;
cin >> n >> k >> l;
vi positions(n, 0);
for(int& pos : positions) {
cin >> pos;
}
cout << delivery(n, k, l, &positions[0]) << endl;
}
#endif