# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1170615 | anmattroi | Closing Time (IOI23_closing) | C++17 | 0 ms | 0 KiB |
#include "closing.h"
#include <bits/stdc++.h>
#define maxn 200005
using namespace std;
int n, x, y;
int64_t s[maxn], k;
int64_t distance(int a, int b) {
if (a > b) swap(a, b);
return s[b] - s[a];
}
int sub0() {
vector<int64_t> nho;
for (int i = 0; i < n; i++) nho.emplace_back(min(distance(x, i), distance(y, i)));
sort(nho.begin(), nho.end());
int64_t ans = 0;
for (int i = 0; i < n; i++) {
ans += nho[i];
if (ans > k) return i;
}
return n;
}
int sub1() {
int64_t ans = 0;
for (int i = x; i <= y; i++) ans += min(distance(i, x), distance(y, i));
if (ans > k) return 0;
int best = y-x+1;
vector<int64_t> nho, outliers;
for (int i = 0; i < n; i++) nho.emplace_back(max(distance(i, x), distance(y, i)));
for (int i = 0; i < x; i++) outliers.emplace_back(distance(i, x));
for (int i = y+1; i < n; i++) outliers.emplace_back(distance(i, y));
sort(outliers.begin(), outliers.end());
sort(nho.begin(), nho.end());
for (int i = 0; i < n; i++) {
ans += nho[i];
if (ans > k) return best;
int p = outliers.size(); int64_t sum = ans;
for (int j = 0; j < outliers.size(); j++) {
sum += outliers[j];
if (sum > k) {
p = j;
break;
}
}
if (p + y-x+1 >= i + 1) best = max(best, p + i + 1 + y-x+1);
}
return best;
}
int max_score(int N, int X, int Y, int64_t K, vector<int> U, vector<int> V, vector<int> W) {
n = N; x = X; y = Y; k = K;
for (int i = 1; i < N; i++) s[i] = s[i-1] + W[i-1];
return max(sub0(), sub1());
}