#pragma GCC optimize("O3")
// #pragma GCC target ("avx2")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4") //,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, TREASURE;
cin >> n >> TREASURE;
vector<unsigned char> a(n);
int A = 0;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
a[i] = x;
A = max(A, x);
}
reverse(a.begin(), a.end());
vector<unsigned char> answer(n);
vector<int> cnt(2 * A + 1);
int LAST = 0;
for (int i = 0; i < n; i++) {
int k = i / 2;
long long sum = 0;
for (int x = 0; x <= A; x++) {
sum += (long long) x * min(k, cnt[x]);
if (k > cnt[x]) {
k -= cnt[x];
}
else {
if (sum <= TREASURE) {
cnt = vector<int>(2 * A + 1);
int j = 0;
constexpr int HACK = 8;
while (j < i - HACK && k >= HACK) {
for (int z = j; z < j + HACK; z++) {
k -= (answer[z] == x);
// if (answer[z] == x) {
// k--;
// }
// }
// for (int z = j; z < j + HACK; z++) {
++cnt[(answer[z] <= x ? answer[z] += a[z] : answer[z] = a[z])];
}
j += HACK;
}
for (; j < i; j++) {
if (answer[j] <= x) {
if (k <= 0) {
for (int z = j; z < i; z++) {
if (answer[z] < x) ++cnt[answer[z] += a[z]];
else ++cnt[answer[z] = a[z]];
}
/* for (; j < i; j++) {
// ++cnt[answer[j] < x ? answer[j] += a[j] : answer[j] = a[j]];
if (answer[j] < x) ++cnt[answer[j] += a[j]];
else ++cnt[answer[j] = a[j]];
} */
break;
}
k -= (answer[j] == x);
// if (answer[j] == x) {
// k--;
// }
++cnt[answer[j] += a[j]];
}
else {
++cnt[answer[j] = a[j]];
}
}
int tmp = TREASURE - sum + a[i];
LAST = tmp;
answer[i] = min(tmp, A + 1);
}
else {
answer[i] = 0;
}
++cnt[answer[i]];
break;
}
}
}
vector<int> big(n);
for (int i = 0; i < n; i++) {
big[i] = answer[i];
}
for (int i = n - 1; i >= 0; --i) {
if (big[i] != 0) {
big[i] = LAST;
break;
}
}
for (int i = 0; i < n; i++) {
big[i] = max(-1, big[i] - a[i]);
}
reverse(big.begin(), big.end());
for (int x : big) {
cout << x << " ";
}
cout << "\n";
}
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 | #pragma GCC optimize("O3") // #pragma GCC target ("avx2") #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4") //,popcnt,abm,mmx,avx,tune=native") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, TREASURE; cin >> n >> TREASURE; vector<unsigned char> a(n); int A = 0; for (int i = 0; i < n; i++) { int x; cin >> x; a[i] = x; A = max(A, x); } reverse(a.begin(), a.end()); vector<unsigned char> answer(n); vector<int> cnt(2 * A + 1); int LAST = 0; for (int i = 0; i < n; i++) { int k = i / 2; long long sum = 0; for (int x = 0; x <= A; x++) { sum += (long long) x * min(k, cnt[x]); if (k > cnt[x]) { k -= cnt[x]; } else { if (sum <= TREASURE) { cnt = vector<int>(2 * A + 1); int j = 0; constexpr int HACK = 8; while (j < i - HACK && k >= HACK) { for (int z = j; z < j + HACK; z++) { k -= (answer[z] == x); // if (answer[z] == x) { // k--; // } // } // for (int z = j; z < j + HACK; z++) { ++cnt[(answer[z] <= x ? answer[z] += a[z] : answer[z] = a[z])]; } j += HACK; } for (; j < i; j++) { if (answer[j] <= x) { if (k <= 0) { for (int z = j; z < i; z++) { if (answer[z] < x) ++cnt[answer[z] += a[z]]; else ++cnt[answer[z] = a[z]]; } /* for (; j < i; j++) { // ++cnt[answer[j] < x ? answer[j] += a[j] : answer[j] = a[j]]; if (answer[j] < x) ++cnt[answer[j] += a[j]]; else ++cnt[answer[j] = a[j]]; } */ break; } k -= (answer[j] == x); // if (answer[j] == x) { // k--; // } ++cnt[answer[j] += a[j]]; } else { ++cnt[answer[j] = a[j]]; } } int tmp = TREASURE - sum + a[i]; LAST = tmp; answer[i] = min(tmp, A + 1); } else { answer[i] = 0; } ++cnt[answer[i]]; break; } } } vector<int> big(n); for (int i = 0; i < n; i++) { big[i] = answer[i]; } for (int i = n - 1; i >= 0; --i) { if (big[i] != 0) { big[i] = LAST; break; } } for (int i = 0; i < n; i++) { big[i] = max(-1, big[i] - a[i]); } reverse(big.begin(), big.end()); for (int x : big) { cout << x << " "; } cout << "\n"; } |
English